2017-06-12 2 views
1

Ich bin die OnSaveInstanceState-Implementierung meiner App. Ich habe meinen onSaveInstanceState erfolgreich implementiert, aber er behält die aktuelle Frage bei der Änderung der Ausrichtung nicht bei. Das Folgende ist meine MainActivity. Ich habe das Buch BigNerdRanchGuide von Seite zu Seite verfolgt. Ich verstehe nicht, warum es nicht funktioniert.OnSaveInstanceState speichert die Instanz nicht

Danke.

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

Wenn ich Ihren Code gut lese, was passiert ist, dass Sie die nächste Frage statt der aktuellen Frage sehen, wenn sich die Ausrichtung ändert, oder? –

+0

Können Sie versuchen, ein [mcve] zu machen? Müssen wir 5 Schaltflächen und alle Lebenszyklusmethoden sehen, um Ihren Fehler zu finden? –

+1

@ cricket_007 Ich habe es bearbeitet. Entschuldigen Sie. –

Antwort

1

Nehmen wir an, dass currentIndex=2. Wenn Sie den Bildschirm drehen und die Aktivität neu erstellt wird, hat der currentIndex den Sicherungswert. Das Problem hierbei ist, dass Sie die Frage 2 mal wurden eingestellt wird, wenn die Aktivität erstellt wird: zunächst am Ende der onCreate

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

und das zweite Mal hier (das nicht mehr sichtbar ist) durch updateQuestion() Aufruf. Also wird der Wert 2 am Ende eine 3 sein, was zu diesem seltsamen Verhalten führt. Eine mögliche Lösung hierfür wäre, den ersten Code von oben zu löschen, einen von dem aktuellen Index zu subtrahieren und sicherzustellen, dass der Wert des aktuellen Index auf -1 gesetzt wird (Sie könnten bemerken, dass die erste Frage tatsächlich die zweite ist) eins in der Anordnung).

+1

Ich habe gerade 'updateQuestion()' aus dem 'onCreate' entfernt und es hat den Trick gemacht –

+0

Froh, dass es funktioniert hat! Bitte überlegen Sie, die Antwort zu akzeptieren, wenn es Ihnen geholfen hat. –

+1

Sicher. Kannst du meine Frage auch auf den neuesten Stand bringen, da ich denke, dass es keine -1 gerechtfertigt hat. Es war eine vollkommen gute Frage. –

Verwandte Themen