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")));
}