【问题标题】:Retaining the data in the view during activity switch?在活动切换期间保留视图中的数据?
【发布时间】:2011-02-26 03:48:09
【问题描述】:

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

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

谢谢:)

【问题讨论】:

    标签: java android eclipse view android-activity


    【解决方案1】:

    视图组件中的文本由操作系统自动保存,即使在软终止(用户更改手机方向)之后,但不是在硬终止之后,用户在父活动处于焦点时点击后退按钮。所以,除非你做一些非标准的事情,比如调用 onSaveInstanceState 而不调用 super.onSaveInstanceState,否则视图状态中的数据应该是持久的。

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

    日航

    编辑: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");
    

    另外考虑到如果 onSaveInstanceState 被调用,它将在 onStop 之前被调用,如果您将 onResume 中的标志重置为:

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

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

    【讨论】:

    • 如何将视图组件中的文本保存为非视图即时属性...你能给我一些例子吗 :)
    • @kAnNaN 我编辑了我的答案以显示一些代码。希望对您有所帮助。
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多