savedInstanceState导致屏幕旋转时崩溃

时间:2017-03-10 08:12:24

标签: java android

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";
private static final String CHEATER="com.example.ferhat.geoquiz.cheated";
private Boolean mAnswerIsTrue;
private TextView mAnswerTextView;
private Button mShowAnswer;
private Boolean mIsCheater;
public static Intent newIntent(Context packageContext, boolean answerIsTrue){
    Intent i=new Intent(packageContext,CheatActivity.class);
    i.putExtra(EXTRA_ANSWER_IS_TRUE,answerIsTrue);
    return i;
}
@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);

    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);
            }
            mIsCheater=true;
            setAnswerShownResult();
        }
    });

     if(savedInstanceState!=null){
        mIsCheater=savedInstanceState.getBoolean(CHEATER,false);
    }

}

    private void setAnswerShownResult(){
    Intent data=new Intent();
    data.putExtra(EXTRA_ANSWER_SHOWN,mIsCheater);
    setResult(RESULT_OK,data);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putBoolean(CHEATER,mIsCheater);
}
}

我尝试在Anroid Programming,Big Nerds Ranch Guide(第5章)中解决挑战 挑战要求我在屏幕旋转和问题之间的交易时保留作弊数据。主要活动存在问题,CheatActivity有主要活动的答案。我创建了BooleanArray来保存问题的作弊数据。

问题是,我为第一个问题作弊,然后当我在其他问题的CheatActivity(CheatPage)中时,如果我旋转屏幕,程序会崩溃。

此行导致的错误 savedInstanceState.putBoolean(CHEATER,mIsCheater); 我想我需要清除先前作弊数据中的数据(BooleanArray已经持有它),但我不知道该怎么做。

2 个答案:

答案 0 :(得分: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);
    }
}**

我找到了适合各种情况的解决方案。 首先想到我做了;我从主要活动中获取信息

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

然后我改变setAnswerShownResult两种情况。如果没有被欺骗,程序会发送当前数据(被欺骗与否)。 我用*标记了我改变的地方。

答案 1 :(得分:-1)

在回调超级方法之前,您需要putBoolean

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

如果没有,则不会保存CHEATER,并且在resume活动

时无法调用它