2 次旋转后应用程序的状态
state of app after 2 rotations
我已经阅读了有关在前景 activity 被销毁之前保存状态的主题的文档...
现在一切都很好(在设备旋转后),但是当我在旋转后再次旋转我的设备时,我将再次丢失我的数据:(
这是我的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MainActivity activity = this;
activity.setTitle("Cow Counter");
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText(Integer.toString(cowQnty));
}
// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("qnty", cowQnty);
}
// How we retrieve the data after app crash...
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//cowQnty = savedInstanceState.getInt("qnty");
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText("Cows: "+Integer.toString(savedInstanceState.getInt("qnty")));
}
我认为解决方案可能是检查实例状态之前是否已经恢复...
我在这里试过这个:
if(savedInstanceState.getInt("qnty") != 0){
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText("Cows: "+Integer.toString(savedInstanceState.getInt("qnty")));
}
但是我在 onCreate() 方法中的初始部分将在我的结果字段中写入一个零
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText(Integer.toString(cowQnty));
谁能告诉我我是否接近解决方案?
您使用一个名为 cowQnty
的变量来存储该值,然后在您的 onSaveInstanceState
的捆绑包中保存为 outState.putInt("qnty", cowQnty);
,然后当您在 [=14= 中恢复它时] 您只将 TextView
的值设置为检索到的值,而不更新 cowQnty
的值。
你希望如何再次保存一个空字段?有两种解决方案;
首先,如果 cowQnty
不是一个很大的数量,并且您不介意使用一点 RAM,请将 cowQnty
设为 static
字段,它会在不需要的情况下保留数据将其保存在 Bundle
中。
其次,恢复状态的时候再设置一次cowQnty
的值即可(为什么要注释掉??),像这样:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
cowQnty = savedInstanceState.getInt("qnty");
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText("Cows: "+Integer.toString(savedInstanceState.getInt("qnty")));
}
我已经阅读了有关在前景 activity 被销毁之前保存状态的主题的文档...
现在一切都很好(在设备旋转后),但是当我在旋转后再次旋转我的设备时,我将再次丢失我的数据:(
这是我的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MainActivity activity = this;
activity.setTitle("Cow Counter");
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText(Integer.toString(cowQnty));
}
// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("qnty", cowQnty);
}
// How we retrieve the data after app crash...
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//cowQnty = savedInstanceState.getInt("qnty");
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText("Cows: "+Integer.toString(savedInstanceState.getInt("qnty")));
}
我认为解决方案可能是检查实例状态之前是否已经恢复...
我在这里试过这个:
if(savedInstanceState.getInt("qnty") != 0){
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText("Cows: "+Integer.toString(savedInstanceState.getInt("qnty")));
}
但是我在 onCreate() 方法中的初始部分将在我的结果字段中写入一个零
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText(Integer.toString(cowQnty));
谁能告诉我我是否接近解决方案?
您使用一个名为 cowQnty
的变量来存储该值,然后在您的 onSaveInstanceState
的捆绑包中保存为 outState.putInt("qnty", cowQnty);
,然后当您在 [=14= 中恢复它时] 您只将 TextView
的值设置为检索到的值,而不更新 cowQnty
的值。
你希望如何再次保存一个空字段?有两种解决方案;
首先,如果 cowQnty
不是一个很大的数量,并且您不介意使用一点 RAM,请将 cowQnty
设为 static
字段,它会在不需要的情况下保留数据将其保存在 Bundle
中。
其次,恢复状态的时候再设置一次cowQnty
的值即可(为什么要注释掉??),像这样:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
cowQnty = savedInstanceState.getInt("qnty");
TextView QntyResultField = findViewById(R.id.textView);
QntyResultField.setText("Cows: "+Integer.toString(savedInstanceState.getInt("qnty")));
}