Java 如何保存字符串?

Java 如何保存字符串?,java,android,android-fragments,android-studio,instance,Java,Android,Android Fragments,Android Studio,Instance,我正在编写一个简单的应用程序,它有两个活动。我可以通过单击选项菜单中的项目切换到活动 现在,我想保存实例。当我在活动1的EditText中写入内容并更改为活动2,然后再次切换回活动1时,我希望数据(字符串)恢复到EditText中 我该怎么做 这是活动1的代码: public class ActivityA extends Activity { private String txt1; private String txt2; private String txt3; private Stri

我正在编写一个简单的应用程序,它有两个活动。我可以通过单击选项菜单中的项目切换到活动

现在,我想保存实例。当我在活动1的EditText中写入内容并更改为活动2,然后再次切换回活动1时,我希望数据(字符串)恢复到EditText中

我该怎么做

这是活动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");

}
}
问题是它不保存字符串,我不知道为什么。

有人有主意吗?

超级调用
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键使用final变量也很好。(可能是静态的)

超级调用
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键使用final变量也很好。(可能是静态的)

共享首选项是存储和检索简单数据的方式。当您离开第一个活动时将其存储,当用户返回该活动时将其恢复到onCreate中。

共享首选项是存储和检索简单数据的方法。当您离开第一个活动时将其存储,当用户返回活动时将其恢复到onCreate中。

您几乎是对的。 只要改变超级呼叫的位置,它就会解决你的问题

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");
}
你几乎是对的。 只要改变超级呼叫的位置,它就会解决你的问题

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

根据您的代码,如果您刚刚完成第二个活动,我认为不会调用您的
onrestoreinnstancestate
函数。我建议改为使用共享首选项

因为只有在以下情况下才会调用onRestoreInstanceState

  • 你有储蓄吗
  • 您的活动已被系统终止,现在需要重新创建它

  • 另外,在将所有保存放入捆绑包后,您需要调用
    super.onSaveInstanceState()
    函数。

    根据您的代码,如果您刚刚完成第二个活动,我认为不会调用您的
    onRestoreInstanceState
    函数。我建议改为使用共享首选项

    因为只有在以下情况下才会调用onRestoreInstanceState

  • 你有储蓄吗
  • 您的活动已被系统终止,现在需要重新创建它

  • 另外,在将所有保存放入捆绑包后,需要调用
    super.onSaveInstanceState()
    函数。

    这个想法可能很愚蠢-写入文件以保存字符串。!对不起,我是新来的,我刚刚有了这个想法。这个想法可能很愚蠢-写到文件来保存字符串。!对不起,我是新来的,我刚刚有了这个想法。
    super.onrestoreinnstancestate(savedInstanceState),以便超类首先获得bundle。通过这种方式,您可以确保孩子不会弄乱任何东西。
    super.onrestoreinnstancestate(savedInstanceState),以便超类首先获得bundle。这样你就可以确保孩子不会把任何事情弄糟。我更新了我的答案。txt1为“-”,因为您不更新此值。从editViewNow获取文本我得到一个错误:未知hax vcpu返回1@MomoSaibak这是一个模拟器错误,与此无关。我相信你会找到办法在谷歌上修复它。否则就用真正的设备。我更新了我的答案。txt1为“-”,因为您不更新此值。从editViewNow获取文本我得到一个错误:未知hax vcpu返回1@MomoSaibak这是一个模拟器错误,与此无关。我相信你会找到办法在谷歌上修复它。否则,请使用真正的设备。