如何保存字符串?

时间:2016-05-23 13:27:21

标签: java android android-fragments android-studio instance

我编写了一个包含两个活动的简单应用程序。我可以通过单击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");

}
}

问题在于它没有保存字符串,我也不知道为什么。
有没有人有想法?

4 个答案:

答案 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仅在以下情况下被调用:

  1. 您已保存了实例状态
  2. 您的活动已被系统杀死,现在需要重新创建它。
  3. 另外,在将所有保存放入捆绑包后,您需要调用super.onSaveInstanceState()函数。