2017-03-10 3 views
-1

Ich versuche Herausforderung in Anroid Programmierung, fragt Big Nerds Ranch Guide (Kap.5) Herausforderung, mich zu lösen Cheat Daten zu halten, während die Drehung des Bildschirms und Transaktion zwischen questions.Main Aktivität hält Fragen und CheatActivity hat Antworten von Hauptaktivität. Und ich habe BooleanArray erstellt, um Cheatdaten für Fragen zu halten.savedInstanceState einen Absturz während Bildschirmdrehung verursacht

Problem ist, ich habe für die erste Frage betrogen und dann, wenn ich in der CheatActivity (CheatPage) anderer Fragen bin, stürzt das Programm ab, wenn ich den Bildschirm drehe.

Fehler verursacht durch diese Linie savedInstanceState.putBoolean (CHEATER, mIsCheater); Ich denke, ich muss Daten von früheren Cheat-Daten löschen (BooleanArray hält es bereits), aber ich weiß nicht, wie es geht.

+0

können Sie bitte Ihr Protokoll posten? –

+0

Was ist 'CHEATER'? Müsste "Typ" und "Wert" wissen, um Ihnen zu helfen. Stellen Sie auch den Stacktrace bereit. –

+0

[link] (https://imgur.com/a/zoOFA) –

Antwort

0
public class CheatActivity extends AppCompatActivity { 


private static final String EXTRA_ANSWER_IS_TRUE = "com.example.ferhat.geoquiz.answer_is_true"; 
public static final String EXTRA_ANSWER_SHOWN = "com.example.ferhat.geoquiz.answer_shown"; 
public static final String EXTRA_CHEATED = "com.example.ferhat.geoquiz.cheated"; 
private static final String CHEATER = "com.example.ferhat.geoquiz.cheated"; 
private Boolean mAnswerIsTrue; 
private TextView mAnswerTextView; 
private Button mShowAnswer; 
private Boolean mAnswerEverShown; 
private Boolean twoStep=false; 


//Yeni intent methodu yarattık Cevabı alıyor ve bu activity i başlatıyor 
public static Intent newIntent(Context packageContext, boolean answerIsTrue, boolean checked) { 
    Intent i = new Intent(packageContext, CheatActivity.class); 
    i.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue); 
    i.putExtra(EXTRA_CHEATED, checked); 
    return i; 
} 



private void setAnswerShownResult(Boolean isAnswerShown) { 
    Intent data = new Intent(); 
    **if(mAnswerEverShown) { 
     isAnswerShown=mAnswerEverShown; 
     data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown); 
     setResult(RESULT_OK, data); 
    }else { 
     data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown); 
     setResult(RESULT_OK, data); 
    } 
    twoStep=isAnswerShown;** 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_cheat); 

    mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false); 
    mAnswerTextView = (TextView) findViewById(R.id.answerTextView); 
    **mAnswerEverShown = getIntent().getBooleanExtra(EXTRA_CHEATED, false);** 
    mShowAnswer = (Button) findViewById(R.id.showAnswerButton); 
    mShowAnswer.setOnClickListener(new View.OnClickListener() { 

     //Cevabı gösteriyor ve Kopya çekildi bilgisi veriliyor 
     @Override 
     public void onClick(View v) { 
      if (mAnswerIsTrue) { 
       mAnswerTextView.setText(R.string.true_button); 
      } else { 
       mAnswerTextView.setText(R.string.false_button); 
      } 
      twoStep=true; 
      setAnswerShownResult(twoStep); 
     } 

    }); 

    **if (savedInstanceState != null) { 
     setAnswerShownResult(savedInstanceState.getBoolean(CHEATER, false)); 
    } 
} 
    @Override 
    public void onSaveInstanceState (Bundle savedInstanceState){ 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putBoolean(CHEATER, twoStep); 
    } 
}** 

i Lösung gefunden, wie für jede Situation. zuerst denke ich tat; i get info von Haupttätigkeit

mAnswerEverShown = getIntent().getBooleanExtra(EXTRA_CHEATED, false);

und ich änderte Dann setAnswerShownResult für zwei situation.if es nicht immer betrogen Programm sendet aktuelle Daten (betrogen oder nicht). Ich markierte, wo ich mit * geändert habe.

-1

Sie müssen putBoolean vor dem Rückruf die Super-Methode.

@Override 
public void onSaveInstanceState(Bundle savedInstanceState){ 
    savedInstanceState.putBoolean(CHEATER,mIsCheater); 
    super.onSaveInstanceState(savedInstanceState); 
} 

wenn nicht die CHEATER werden nicht gespeichert und Sie können es nicht nennen, wenn resume Aktivität

+0

es nicht funktioniert, denke ich mein Problem durch vorherige Daten verursacht –

+0

was ist Ihr Link 75? Und hast du jemals vor dem Drehen den Button 'mShowAnswer' angeklickt? Wenn nicht, wurde die Variable 'mIsCheater' nicht initialisiert. Ihr Code riskiert den Absturz, weil Ihre Variable 'mIsCheater' nicht initialisiert wird. Die zweite, wie ich oben sagte, auch wenn es nicht das Problem hier ist, aber Sie müssen immer 'putBoolean' vor dem Zurückrufen der Super-Methode –

+0

, wie ich sagte' savedInstanceState.putBoolean (CHEATER, mIsCheater) 'ist link75 –

Verwandte Themen