2017-06-12 16 views
1

私は私のアプリケーションのonSaveInstanceState実装です。 onSaveInstanceStateを正常に実装しましたが、向きの変更時に現在の質問が維持されません。以下は私のMainActivityです。私はBigNerdRanchGuideという本をページごとに辿ってきました。なぜそれが動作していないのか分かりません。OnSaveInstanceStateはインスタンスを保存しません

ありがとうございました。

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

コードをうまく読んでいれば、向きが変わったときに現在のものではなく次の質問が表示されることがあります。 –

+0

あなたは[mcve]を作ることができますか?エラーを特定するには、5つのボタンとすべてのライフサイクルの方法を確認する必要がありますか? –

+1

@ cricket_007編集しました。謝罪いたします。 –

答えて

1

currentIndex=2としましょう。画面を回転してアクティビティを再作成すると、currentIndexはセーブ値を持ちます。最初にここ

int question = mQuestionBank[mCurrentIndex].getTextResId(); 
mTextView.setText(question); 

と(もう見えない)onCreateの終わりに二度目をupdateQuestion()を呼び出すことにより:ここでの問題は、アクティビティが作成されるときに、質問2倍に設定されたことです。したがって、値2は最後に3となり、この奇妙な振る舞いになります。これを解決するには、最初のコードを上から削除し、現在のインデックスから1を引いて、現在のインデックスの値を-1に設定します(表示される最初の質問は実際には2番目の質問です1つは配列内にあります)。

+1

私は 'onCreate'から' updateQuestion() 'を削除しました。そしてそれはトリックを行いました –

+0

うまくいきました!それがあなたを助けたら答えを受け入れることを検討してください。 –

+1

あなたは-1を保証するものではないと思うので、私の質問をアップアップすることもできますか?それは完璧に良い質問でした。 –

関連する問題