在活动切换期间保留视图中的数据?

时间:2011-02-26 03:48:09

标签: java android eclipse view android-activity

在我的Android应用程序中,用户可以在EditView中输入文本,然后单击一个按钮,将他带到另一个活动,在那里他可以选择一个联系人...然后按一个按钮 让他回到第一个活动......

现在的问题是我需要将选定的联系人传递给第一个活动并显示它(我使用捆绑包完成了)但我无法保留已在EditView中输入的文本...我应该这样做(但是文本应该被保留,而不是通过捆绑并将其取回)

谢谢:)

1 个答案:

答案 0 :(得分:1)

即使在软杀死(用户更改了电话方向)之后,操作系统也会自动保存视图组件中的文本,但是在硬杀死后,用户在父活动处于焦点时点击后退按钮。因此,除非您正在执行非标准操作,例如调用onSaveInstanceState而不调用super.onSaveInstanceState,否则视图状态中的数据应该保持不变。

一种解决方案是在启动子活动之前将视图组件中的文本保存为非视图实例属性,并在焦点返回到onActivityResult方法中的父活动时将其读回。

JAL

编辑:Android Docs Activity页面已得到广泛更新。如果窗口小部件没有ID,则不会保存视图状态。

编辑:我所说的是视图状态应该由操作系统保留。您不需要手动保存视图状态。在硬杀死时,您需要保存活动的状态,如果这是活动的预期行为。所以这里有一些代码可以保存活动状态。给定一个实例变量:

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 savedInstanceState)中恢复状态:

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

另外,如果调用了IF onSaveInstanceState,它将在onStop之前被调用,如果你将onResume中的标志重置为:

protected void onResume() {
    super.onResume();
    Log.d(TAG,"onResume");
    isSavedInstanceState= false;
    isSavedPrefs= false;
}

在onCreate中设置标志不会产生预期的结果。