如何使用`onSaveInstanceState`?
How to use `onSaveInstanceState`?
我想达到什么目标?
- 我想保存
x
、y
和 score
的值,因此当用户旋转屏幕时会检索这些值,而不是重新生成这些值。
我有什么?
- 可能是正确的
onSaveInstanceState
代码,但可能因为某些 @Override
与其发生冲突而无法正常工作
我需要什么?
- 一些可以帮助我保存变量值的修复程序
代码
MainActivity.java(没有onSaveInstanceState
)
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private EditText textBox;
private int z;
public int score = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
textBox = findViewById(R.id.editText);
textBox.requestFocus();
setActual();
}
private void setActual() {
Random random = new Random();
int x = random.nextInt(10) + 1; //you get a random number between 0 and 9 then add 1 to get 1 - 10, no need to use array..
int y = random.nextInt(10) + 1;
z = x * y;
String hintStr = x + " × " + y;
((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
}
public void onCheck(View view) {
int answer = Integer.parseInt(textBox.getText().toString());
String res = "Incorrect";
if (answer == z) {
res = "Correct";
score++;
Log.d("TAG", "Correct."); // right answer
textBox.setText("");
setActual(); // let's regenerate values
} else if (score == 0) {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
setActual();
((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
} else {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
score--;
setActual();
}
((TextView) findViewById(R.id.scoreText)).setText("Score:" + ' ' + score);
((TextView) findViewById(R.id.result_text_view)).setText(res);
}
}
MainActivity.java(含 onSaveInstanceState
)
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private EditText textBox;
private int z;
public int score = 0;
private int x;
private int y;
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("x", x);
savedInstanceState.putInt("y", y);
savedInstanceState.putInt("score", score);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBox = findViewById(R.id.editText);
textBox.requestFocus();
setActual();
if (savedInstanceState != null) {
x = savedInstanceState.getInt("x");
y = savedInstanceState.getInt("y");
score = savedInstanceState.getInt("score");
}
}
private void setActual() {
Random random = new Random();
x = random.nextInt(10) + 1; //you get a random number between 0 and 9 then add 1 to get 1 - 10, no need to use array..
y = random.nextInt(10) + 1;
z = x * y;
String hintStr = x + " × " + y;
((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
}
public void onCheck(View view) {
int answer = Integer.parseInt(textBox.getText().toString());
String res = "Incorrect";
if (answer == z) {
res = "Correct";
score++;
Log.d("TAG", "Correct."); // right answer
textBox.setText("");
setActual(); // let's regenerate values
} else if (score == 0) {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
setActual();
((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
} else {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
score--;
setActual();
}
((TextView) findViewById(R.id.scoreText)).setText("Score:" + ' ' + score);
((TextView) findViewById(R.id.result_text_view)).setText(res);
}
}
您确定没有检索到值吗?
我相信这里的问题是你总是在 onCreate() 中调用 setActual() 来生成 x 和 y 值并将 z 值分配给生成的 x 和 y(即使 savedInstanceState != null)
更好的处理方式是
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBox = findViewById(R.id.editText);
textBox.requestFocus();
if (savedInstanceState != null) {
x = savedInstanceState.getInt("x");
y = savedInstanceState.getInt("y");
score = savedInstanceState.getInt("score");
z = x * y;
String hintStr = x + " × " + y;
((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
} else { setActual(); }
}
你也应该这样调用 super.onSaveInstanceState(savedInstanceState)
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt("x", x);
savedInstanceState.putInt("y", y);
savedInstanceState.putInt("score", score);
}
您应该考虑调用 super.onSaveInstanceState()
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
// save your state
super.onSaveInstanceState(outState);
}
此外,为避免每次旋转屏幕时都重新创建 activity,您可以通过将其添加到应用程序清单中的 Activity 声明来自行处理配置更改:
android:configChanges="keyboardHidden|orientation|screenSize"
并覆盖:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
如果您的应用程序在方向或屏幕尺寸更改后不需要重新创建,它可以为用户节省时间...
我想达到什么目标?
- 我想保存
x
、y
和score
的值,因此当用户旋转屏幕时会检索这些值,而不是重新生成这些值。
我有什么?
- 可能是正确的
onSaveInstanceState
代码,但可能因为某些@Override
与其发生冲突而无法正常工作
我需要什么?
- 一些可以帮助我保存变量值的修复程序
代码
MainActivity.java(没有onSaveInstanceState
)
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private EditText textBox;
private int z;
public int score = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
textBox = findViewById(R.id.editText);
textBox.requestFocus();
setActual();
}
private void setActual() {
Random random = new Random();
int x = random.nextInt(10) + 1; //you get a random number between 0 and 9 then add 1 to get 1 - 10, no need to use array..
int y = random.nextInt(10) + 1;
z = x * y;
String hintStr = x + " × " + y;
((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
}
public void onCheck(View view) {
int answer = Integer.parseInt(textBox.getText().toString());
String res = "Incorrect";
if (answer == z) {
res = "Correct";
score++;
Log.d("TAG", "Correct."); // right answer
textBox.setText("");
setActual(); // let's regenerate values
} else if (score == 0) {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
setActual();
((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
} else {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
score--;
setActual();
}
((TextView) findViewById(R.id.scoreText)).setText("Score:" + ' ' + score);
((TextView) findViewById(R.id.result_text_view)).setText(res);
}
}
MainActivity.java(含 onSaveInstanceState
)
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private EditText textBox;
private int z;
public int score = 0;
private int x;
private int y;
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("x", x);
savedInstanceState.putInt("y", y);
savedInstanceState.putInt("score", score);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBox = findViewById(R.id.editText);
textBox.requestFocus();
setActual();
if (savedInstanceState != null) {
x = savedInstanceState.getInt("x");
y = savedInstanceState.getInt("y");
score = savedInstanceState.getInt("score");
}
}
private void setActual() {
Random random = new Random();
x = random.nextInt(10) + 1; //you get a random number between 0 and 9 then add 1 to get 1 - 10, no need to use array..
y = random.nextInt(10) + 1;
z = x * y;
String hintStr = x + " × " + y;
((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
}
public void onCheck(View view) {
int answer = Integer.parseInt(textBox.getText().toString());
String res = "Incorrect";
if (answer == z) {
res = "Correct";
score++;
Log.d("TAG", "Correct."); // right answer
textBox.setText("");
setActual(); // let's regenerate values
} else if (score == 0) {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
setActual();
((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
} else {
Log.d("TAG", "Incorrect."); // wrong answer
textBox.setText("");
score--;
setActual();
}
((TextView) findViewById(R.id.scoreText)).setText("Score:" + ' ' + score);
((TextView) findViewById(R.id.result_text_view)).setText(res);
}
}
您确定没有检索到值吗? 我相信这里的问题是你总是在 onCreate() 中调用 setActual() 来生成 x 和 y 值并将 z 值分配给生成的 x 和 y(即使 savedInstanceState != null)
更好的处理方式是
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBox = findViewById(R.id.editText);
textBox.requestFocus();
if (savedInstanceState != null) {
x = savedInstanceState.getInt("x");
y = savedInstanceState.getInt("y");
score = savedInstanceState.getInt("score");
z = x * y;
String hintStr = x + " × " + y;
((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
} else { setActual(); }
}
你也应该这样调用 super.onSaveInstanceState(savedInstanceState)
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt("x", x);
savedInstanceState.putInt("y", y);
savedInstanceState.putInt("score", score);
}
您应该考虑调用 super.onSaveInstanceState()
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
// save your state
super.onSaveInstanceState(outState);
}
此外,为避免每次旋转屏幕时都重新创建 activity,您可以通过将其添加到应用程序清单中的 Activity 声明来自行处理配置更改:
android:configChanges="keyboardHidden|orientation|screenSize"
并覆盖:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
如果您的应用程序在方向或屏幕尺寸更改后不需要重新创建,它可以为用户节省时间...