Java savedInstanceState在屏幕旋转时导致崩溃

Java savedInstanceState在屏幕旋转时导致崩溃,java,android,Java,Android,我试图解决Anroid编程中的挑战,《大书呆子牧场指南》(第5章) 挑战要求我在屏幕旋转和问题之间的交易时保留作弊数据。主活动保留问题,作弊活动从主活动获得答案。我创建了布尔数组来保存作弊数据 问题是,我在第一个问题上作弊,然后当我在其他问题的作弊活动(作弊页面)中时,如果我旋转屏幕,程序就会崩溃 由此行引起的错误savedInstanceState.putBoolean(作弊者、错误创建者) 我想我需要从以前的作弊数据(BooleanArray已经保存了它)中清除数据,但我不知道怎么做。在回调

我试图解决Anroid编程中的挑战,《大书呆子牧场指南》(第5章) 挑战要求我在屏幕旋转和问题之间的交易时保留作弊数据。主活动保留问题,作弊活动从主活动获得答案。我创建了布尔数组来保存作弊数据

问题是,我在第一个问题上作弊,然后当我在其他问题的作弊活动(作弊页面)中时,如果我旋转屏幕,程序就会崩溃

由此行引起的错误savedInstanceState.putBoolean(作弊者、错误创建者)
我想我需要从以前的作弊数据(BooleanArray已经保存了它)中清除数据,但我不知道怎么做。

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

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);
}
}
如果没有,作弊者将不会被保存,并且您不能在
恢复时调用它

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
  savedInstanceState.putBoolean(CHEATER,mIsCheater);
  super.onSaveInstanceState(savedInstanceState);
}
我找到了适合每种情况的解决方案。 首先,我认为我做到了;我从主要活动中获得信息

ManswerEverShowed=getIntent().getBooleanExtra(EXTRA_欺骗,false)

然后我改变了两种情况下的设置应答shownresult。如果它没有被欺骗,程序将发送当前数据(被欺骗或未被欺骗)。
我用*

标记了我更改的地方。你能发布你的日志吗?什么是“骗子”?需要知道“类型”和“值”来帮助您。还提供stacktrace。在
putBoolean
所在的行中,崩溃的可能重复没有任何意义。崩溃不是真的存在,或者您正在使用
null
bundle手动调用
onSaveInstanceState
。它不起作用,我想我的问题是由以前的数据引起的。您的链接是什么?您是否在旋转前单击过按钮
mShowAnswer
?如果不是,则变量
mIsCheater
尚未初始化。您的代码有崩溃的风险,因为您的变量
mIsCheater
未初始化。第二,正如我上面所说的,即使这不是问题所在,但在调用超级方法之前,您始终需要
putBoolean
,正如我所说的
savedInstanceState.putBoolean(作弊者,错误创建者)
是link75,因此错误创建者没有初始化。您应该在默认情况下声明它
false
(在这种情况下,我认为)
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);
    }
}**