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