我编写了一个包含两个活动的简单应用程序。我可以通过单击OptionMenu中的项目切换到活动。
现在,我想保存实例。当我在活动1中的EditText中写入内容并更改为活动2然后再切换回活动1时,我希望在EditText中恢复数据(String)。
我该怎么做?
这是活动1的代码:
public class ActivityA extends Activity {
private String txt1;
private String txt2;
private String txt3;
private String txt4;
private EditText edText1;
private EditText edText2;
private EditText edText3;
private EditText edText4;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
setTitle(R.string.activity1_title);
txt1 = "-";
txt2 = "-";
txt3 = "-";
txt4 = "-";
if (savedInstanceState != null){
txt1 = savedInstanceState.getString("Value1");
txt2 = savedInstanceState.getString("Value2");
txt3 = savedInstanceState.getString("Value3");
txt4 = savedInstanceState.getString("Value4");
}
edText1 = (EditText) findViewById(R.id.editText);
edText1.setText(""+txt1);
edText2 = (EditText) findViewById(R.id.editText2);
edText2.setText(""+txt2);
edText3 = (EditText) findViewById(R.id.editText3);
edText3.setText(""+txt3);
edText4 = (EditText) findViewById(R.id.editText4);
edText4.setText(""+txt4);
}
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString("Value1",txt1);
savedInstanceState.putString("Value2",txt2);
savedInstanceState.putString("Value3",txt3);
savedInstanceState.putString("Value4",txt4);
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
txt1 = savedInstanceState.getString("Value1");
txt2 = savedInstanceState.getString("Value2");
txt3 = savedInstanceState.getString("Value3");
txt4 = savedInstanceState.getString("Value4");
}
}
问题在于它没有保存字符串,我也不知道为什么。
有没有人有想法?
答案 0 :(得分:1)
必须在put语句
之后调用超级调用super.onSaveInstanceState(savedInstanceState);
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putString("Value1",edText1.getText().toString());
savedInstanceState.putString("Value2",edText2.getText().toString());
savedInstanceState.putString("Value3",edText3.getText().toString());
savedInstanceState.putString("Value4",edText4.getText().toString());
super.onSaveInstanceState(savedInstanceState);
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
txt1 = savedInstanceState.getString("Value1");
edText1.setText(""+txt1);
....
}
增加:
使用Bundle Keys的最终变量也很不错。 (也许是静态的)
答案 1 :(得分:1)
共享首选项是存储和检索简单数据的方法。离开第一个活动时存储它,并在用户返回活动时在onCreate中恢复它。
答案 2 :(得分:0)
你几乎是对的。 只需更改超级电话的位置即可解决您的问题。
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putString("Value1",txt1);
savedInstanceState.putString("Value2",txt2);
savedInstanceState.putString("Value3",txt3);
savedInstanceState.putString("Value4",txt4);
super.onSaveInstanceState(savedInstanceState); // Call at the end
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState); // Call at the beginning
txt1 = savedInstanceState.getString("Value1");
txt2 = savedInstanceState.getString("Value2");
txt3 = savedInstanceState.getString("Value3");
txt4 = savedInstanceState.getString("Value4");
}
答案 3 :(得分:0)
根据您的代码,如果您刚从第二个活动回来,我认为您的onRestoreInstanceState
函数不会被调用。我建议改为使用共享首选项。
因为onRestoreInstanceState
仅在以下情况下被调用:
另外,在将所有保存放入捆绑包后,您需要调用super.onSaveInstanceState()
函数。