2017-06-12 2 views
1

Je suis l'implémentation onSaveInstanceState de mon application. J'ai implémenté avec succès mon onSaveInstanceState mais il ne gère pas la question en cours lors du changement d'orientation. Ce qui suit est ma MainActivity. J'ai suivi le livre BigNerdRanchGuide de page en page. Je ne comprends pas pourquoi ça ne marche pas.OnSaveInstanceState n'enregistre pas l'instance

Merci.

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

Si je lis bien votre code, qu'est-ce qui se passe, c'est que vous voyez la question suivante au lieu de celle en cours lorsque l'orientation change, non? –

+0

Pourriez-vous essayer de faire un [mcve]? Avons-nous besoin de voir 5 boutons et toutes les méthodes de cycle de vie pour comprendre votre erreur? –

+1

@ cricket_007 Je l'ai édité. Mes excuses. –

Répondre

1

Supposons que currentIndex=2. Lorsque vous faites pivoter l'écran et que l'activité est recréée, le currentIndex aura la valeur d'enregistrement. La question ici est que vous mettiez la question 2 fois lorsque l'activité sera créée: d'abord ici

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

et la deuxième fois à la fin de onCreate (qui n'est plus visible) en appelant updateQuestion(). Donc, la valeur 2 sera à la fin un 3 résultant de ce comportement étrange. Une solution possible pour cela serait de supprimer le premier morceau de code ci-dessus, soustraire un de l'index actuel et assurez-vous de définir la valeur de l'index actuel à -1 (vous pourriez avoir remarqué que la première question affichée est en fait la seconde un dans le tableau).

+1

Je viens de retirer 'updateQuestion()' de 'onCreate' et il a fait l'affaire –

+0

Heureux que cela a fonctionné! S'il vous plaît envisager d'accepter la réponse si cela vous a aidé. –

+1

Bien sûr. Pouvez-vous également mettre en doute ma question, puisque je pense que cela ne justifie pas un -1. C'était une question parfaitement bien. –