覆盖 onSaveInstanceState 后,我的应用程序不断崩溃
My app keeps crashing after overriding onSaveInstanceState
我有一段代码旨在帮助我了解如何重写 onSaveInstanceState 方法,以便在设备旋转时保留一些数据。
代码非常简单,没有做任何有趣的事情:有两个按钮,当用户单击其中任何一个时,它都会禁用它们。它工作得很好,除了按钮被禁用后,如果你旋转设备,它们会恢复启用。
我已经为 onSaveInstanceState 添加了一个重写,但现在它因旋转而崩溃。我不知道我做错了什么。
代码如下:
有两个按钮:
private Button mButton1;
private Button mButton2;
一种将按钮和布尔值作为参数的方法,因此我可以切换按钮:
public void disBut(Button x, boolean enbl){
x.setEnabled(enbl);
}
一种使用先前方法禁用两个按钮的方法,将与侦听器一起调用:
private void checkAnaswer(boolean userTrue){
disBut(mButton1, false);
disBut(mButton2, false);
}
按钮上的听众:
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(true);
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(false);
}
});
所有这一切都很好。现在覆盖 onSavedInstance:
我有两个键和两个布尔值。每个按钮一个:
boolean bundleBt1;
boolean bundleBt2;
private static final String BUTTON_ONE = "one";
private static final String BUTTON_TWO = "two";
然后,我检查是否启用了任何按钮,相应地为布尔值分配一个值,并将它们与键一起保存为键值对:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
bundleBt1 = mButton1.isEnabled() ? true : false;
bundleBt2 = mButton2.isEnabled() ? true : false;
savedInstanceState.putBoolean(BUTTON_ONE, bundleBt1);
savedInstanceState.putBoolean(BUTTON_TWO, bundleBt2);
}
最后,在调用超类之后,我检查它是否不为空。如果不是,我将存储在其各自键中的值分配给每个布尔值,并在 enables/disables 按钮的方法中使用布尔值。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
disBut(mButton1, bundleBt1);
bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);
disBut(mButton2, bundleBt2);
}
为了确保代码的语法没有任何问题,这里是完整的:
public class MainActivity extends AppCompatActivity {
private Button mButton1;
private Button mButton2;
boolean bundleBt1;
boolean bundleBt2;
private static final String BUTTON_ONE = "one";
private static final String BUTTON_TWO = "two";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
disBut(mButton1, bundleBt1);
bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);
disBut(mButton2, bundleBt2);
}
mButton1 = (Button) findViewById(R.id.true_button);
mButton2 = (Button) findViewById(R.id.false_button);
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(true);
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(false);
}
});
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
bundleBt1 = mButton1.isEnabled() ? true : false;
bundleBt2 = mButton2.isEnabled() ? true : false;
savedInstanceState.putBoolean(BUTTON_ONE, bundleBt1);
savedInstanceState.putBoolean(BUTTON_TWO, bundleBt2);
}
private void checkAnaswer(boolean userTrue){
disBut(mButton1, false);
disBut(mButton2, false);
}
public void disBut(Button x, boolean enbl){
x.setEnabled(enbl);
}
}
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
disBut(mButton1, bundleBt1);
bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);
disBut(mButton2, bundleBt2);
}
mButton1 = (Button) findViewById(R.id.true_button);
mButton2 = (Button) findViewById(R.id.false_button);
如果 savedInstanceState
不为 null,则 disBut
函数将 运行 作用于 null 对象,因为您稍后会为按钮充气。我没有看到你的堆栈跟踪,但那肯定是一个错误。
之前给按钮 (mButton1 = (Button) findViewById(R.id.true_button);
mButton2 = (Button) findViewById(R.id.false_button);
) 充气以恢复 activity 状态。
我有一段代码旨在帮助我了解如何重写 onSaveInstanceState 方法,以便在设备旋转时保留一些数据。
代码非常简单,没有做任何有趣的事情:有两个按钮,当用户单击其中任何一个时,它都会禁用它们。它工作得很好,除了按钮被禁用后,如果你旋转设备,它们会恢复启用。
我已经为 onSaveInstanceState 添加了一个重写,但现在它因旋转而崩溃。我不知道我做错了什么。
代码如下:
有两个按钮:
private Button mButton1;
private Button mButton2;
一种将按钮和布尔值作为参数的方法,因此我可以切换按钮:
public void disBut(Button x, boolean enbl){
x.setEnabled(enbl);
}
一种使用先前方法禁用两个按钮的方法,将与侦听器一起调用:
private void checkAnaswer(boolean userTrue){
disBut(mButton1, false);
disBut(mButton2, false);
}
按钮上的听众:
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(true);
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(false);
}
});
所有这一切都很好。现在覆盖 onSavedInstance:
我有两个键和两个布尔值。每个按钮一个:
boolean bundleBt1;
boolean bundleBt2;
private static final String BUTTON_ONE = "one";
private static final String BUTTON_TWO = "two";
然后,我检查是否启用了任何按钮,相应地为布尔值分配一个值,并将它们与键一起保存为键值对:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
bundleBt1 = mButton1.isEnabled() ? true : false;
bundleBt2 = mButton2.isEnabled() ? true : false;
savedInstanceState.putBoolean(BUTTON_ONE, bundleBt1);
savedInstanceState.putBoolean(BUTTON_TWO, bundleBt2);
}
最后,在调用超类之后,我检查它是否不为空。如果不是,我将存储在其各自键中的值分配给每个布尔值,并在 enables/disables 按钮的方法中使用布尔值。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
disBut(mButton1, bundleBt1);
bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);
disBut(mButton2, bundleBt2);
}
为了确保代码的语法没有任何问题,这里是完整的:
public class MainActivity extends AppCompatActivity {
private Button mButton1;
private Button mButton2;
boolean bundleBt1;
boolean bundleBt2;
private static final String BUTTON_ONE = "one";
private static final String BUTTON_TWO = "two";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
disBut(mButton1, bundleBt1);
bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);
disBut(mButton2, bundleBt2);
}
mButton1 = (Button) findViewById(R.id.true_button);
mButton2 = (Button) findViewById(R.id.false_button);
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(true);
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnaswer(false);
}
});
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
bundleBt1 = mButton1.isEnabled() ? true : false;
bundleBt2 = mButton2.isEnabled() ? true : false;
savedInstanceState.putBoolean(BUTTON_ONE, bundleBt1);
savedInstanceState.putBoolean(BUTTON_TWO, bundleBt2);
}
private void checkAnaswer(boolean userTrue){
disBut(mButton1, false);
disBut(mButton2, false);
}
public void disBut(Button x, boolean enbl){
x.setEnabled(enbl);
}
}
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
disBut(mButton1, bundleBt1);
bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);
disBut(mButton2, bundleBt2);
}
mButton1 = (Button) findViewById(R.id.true_button);
mButton2 = (Button) findViewById(R.id.false_button);
如果 savedInstanceState
不为 null,则 disBut
函数将 运行 作用于 null 对象,因为您稍后会为按钮充气。我没有看到你的堆栈跟踪,但那肯定是一个错误。
之前给按钮 (mButton1 = (Button) findViewById(R.id.true_button);
mButton2 = (Button) findViewById(R.id.false_button);
) 充气以恢复 activity 状态。