Java 如何保存字符串?
我正在编写一个简单的应用程序,它有两个活动。我可以通过单击选项菜单中的项目切换到活动 现在,我想保存实例。当我在活动1的EditText中写入内容并更改为活动2,然后再次切换回活动1时,我希望数据(字符串)恢复到EditText中 我该怎么做 这是活动1的代码: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
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)必须在put语句之后调用code>
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)必须在put语句之后调用code>
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)应该首先调用code>,以便超类首先获得bundle。通过这种方式,您可以确保孩子不会弄乱任何东西。super.onrestoreinnstancestate(savedInstanceState)应该首先调用code>,以便超类首先获得bundle。这样你就可以确保孩子不会把任何事情弄糟。我更新了我的答案。txt1为“-”,因为您不更新此值。从editViewNow获取文本我得到一个错误:未知hax vcpu返回1@MomoSaibak这是一个模拟器错误,与此无关。我相信你会找到办法在谷歌上修复它。否则就用真正的设备。我更新了我的答案。txt1为“-”,因为您不更新此值。从editViewNow获取文本我得到一个错误:未知hax vcpu返回1@MomoSaibak这是一个模拟器错误,与此无关。我相信你会找到办法在谷歌上修复它。否则,请使用真正的设备。