在我的 Android 应用程序中,用户可以在 EditView 中输入文本,然后单击一个按钮,将他带到另一个 Activity ,在那里他可以选择一个联系人......然后按一个按钮, 让他回到第一个 Activity ...
现在的问题是我需要将选定的联系人传递给第一个 Activity 并显示它(我已经使用 bundle 完成了它),但我无法保留在 EditView 中已输入的文本...我应该这样做(但是应该保留文本,而不是将其通过 bundle 并将其返回)
谢谢:)
最佳答案
即使在软终止(用户更改手机方向)之后,操作系统也会自动保存 View 组件中的文本,但在硬终止之后,用户在父 Activity 处于焦点状态时按下后退按钮,则不会。因此,除非您正在执行一些非标准的操作,例如调用 onSaveInstanceState 而不调用 super.onSaveInstanceState,否则 View 状态中的数据应该持续存在。
一种解决方案是在启动子 Activity 之前将 View 组件中的文本保存为非 View 实例属性,并在焦点返回到 onActivityResult 方法中的父 Activity 时读取该值。
日航
编辑:Android Docs Activity页面已被广泛更新。如果小部件没有 ID,则不会保存 View 状态。
编辑:我的意思是 View 状态应该由操作系统保存。您不需要手动保存 View 状态。在硬终止时,如果这是 Activity 的预期行为,则需要保存 Activity 的状态。这是一些保存 Activity 状态的代码。给定一个实例变量:
String password;
这里我们保存软杀伤的状态:
protected void onSaveInstanceState(Bundle outState){
password= editTextPassword.getText().toString();
outState.putString("password", password);
super.onSaveInstanceState(outState); // save view state
}
这里我们保存硬杀的状态
@Override
protected void onStop(){
super.onStop();
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("password",password);
editor.commit();
这里我们在 onCreate(Bundle savingInstanceState) 中恢复状态:
if( savedInstanceState!= null){ // get saved state from soft kill after first pass
try {
password= savedInstanceState.getString("password");
Log.d(TAG,"RestoredState!");
}
catch(Exception e){
Log.d(TAG,"FailedToRestoreState",e);
}
}
else { // get saved state from preferences on first pass
SharedPreferences prefs = getPreferences(MODE_PRIVATE); // singleton
if (prefs != null){
this.password= prefs.getString("password","");
Log.d(TAG,"gettingPrefs");
}
}
Log.d(TAG,"onCreate");
此外,如果调用 onSaveInstanceState,它将在 onStop 之前调用,如果您将 onResume 中的标志重置为:
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume");
isSavedInstanceState= false;
isSavedPrefs= false;
}
在 onCreate 中设置标志不会产生预期的结果。
关于java - 在 Activity 切换期间保留 View 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124917/