我的应用程序onSaveInstanceState实现。我已经成功实现了我的onSaveInstanceState,但它没有在方向更改时维护当前的问题。以下是我的MainActivity。我一直在页面上关注BigNerdRanchGuide这本书。我不明白为什么它不起作用。
感谢。
public class MainActivity extends AppCompatActivity {
public static final String TAG = "QuizActivity";
public static final String KEY_INDEX = "index";
private TextView mTextView;
private Button mTrueButton, mFalseButton;
private ImageButton mNext, mPrev;
private Question[] mQuestionBank = new Question[]{
new Question((R.string.pacific_ocean), true),
new Question((R.string.syria_europe), false),
new Question((R.string.canada_na), true),
new Question((R.string.africa_country), false),
new Question((R.string.china_continent), false)
};
private int mCurrentIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "OnCreate(Bundle) called");
if(savedInstanceState != null){
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
}
mTextView = (TextView)findViewById(R.id.question);
int question = mQuestionBank[mCurrentIndex].getTextResId();
mTextView.setText(question);
...
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState");
outState.putInt(KEY_INDEX, mCurrentIndex);
}
private void updateQuestion() {
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
int question = mQuestionBank[mCurrentIndex].getTextResId();
mTextView.setText(question);
}
private void lastQuestion(){
if (mCurrentIndex > 0){
mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
int question = mQuestionBank[mCurrentIndex].getTextResId();
mTextView.setText(question);
}else{
Toast.makeText(this, "You're at the last question", Toast.LENGTH_SHORT).show();
return;
}
}
private void checkAnswer(boolean userPressedTrue){
boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
int messageResId = 0;
if(userPressedTrue == answerIsTrue){
messageResId = R.string.correct;
}else{
messageResId = R.string.incorrect;
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:1)
我们假设currentIndex=2
。旋转屏幕并重新创建活动时,currentIndex
将具有保存值。这里的问题是,您在创建活动时将问题设置为2次:首先在这里
int question = mQuestionBank[mCurrentIndex].getTextResId();
mTextView.setText(question);
并且onCreate
结束时第二次(通过调用updateQuestion()
不再可见)。因此,值2将最终成为3,从而导致这种奇怪的行为。一个可能的解决方案是从上面删除第一段代码,从当前索引中减去一个,并确保将当前索引的值设置为-1(您可能已经注意到显示的第一个问题实际上是第二个数组中的一个。)