方向改变时保存对象

时间:2011-10-06 12:30:19

标签: android android-fragments

如果在方向更改时保存对象,则不推荐使用onRetainNonConfigurationInstancegetLastNonConfigurationInstance。我不能将其与compatibility package android-support-v4.jar FragmentActivity一起使用,它显示Cannot override the final method from FragmentActivity

开发者网站说

  

改为使用新的Fragment API setRetainInstance(boolean);

但我不知道如何使用setRetainInstance

保存自定义对象

我的情景:
在我的活动中,我有一个带进度对话框的AsyncTask。在这里,我需要处理方向变化 为此,我从CommonsWare的Mark Murphy那里得到了很好的回答 background-task-progress-dialog-orientation-change-is-there-any-100-working
sample project

由于我使用的是兼容性软件包android-support-v4.jar,FragmentActivity,我无法覆盖onRetainNonConfigurationInstance
无法覆盖FragmentActivity

中的最终方法

是否有其他方法可以保存我的自定义对象?

修改 我无法使我的AsyncTask任务Parcelable(如果我没错),因为它使用接口,上下文等。 我的AsyncTask

 public class CommonAsyncTask extends AsyncTask<Object, Object, Object>  {
        Context context;
        AsyncTaskServices callerObject;
        ProgressDialog progressDialog;
        String dialogMessag ; 
    ................

我在寻找,是否有onRetainNonConfigurationInstance 方法的替代方法,它可以在方向更改时完全保存对象,之后可以使用getLastNonConfigurationInstance

进行检索

4 个答案:

答案 0 :(得分:42)

您可以使用onRetainCustomNonConfigurationInstance.

  

使用它而不是onRetainNonConfigurationInstance()。稍后检索   使用getLastCustomNonConfigurationInstance()。

答案 1 :(得分:12)

有两种选择:

  1. 使用LoaderFragmentActivity将在重新创建时保存/恢复其状态。
  2. 使用没有视图的片段并在其上调用setRetainInstance(true)。在兼容性库的源代码,FragmentRetainInstanceSupport或其他一些例子中就有这样的例子。

答案 2 :(得分:5)

当您的片段暂停时,它会调用此方法:

@Override
public void onSaveInstanceState(Bundle outState) {
    // Add variable to outState here
    super.onSaveInstanceState(outState);
}

当Fragment重新启动时,变量outState将被输入onCreate()方法。

您可以保存任何基本类型的数据或实现Parcelable接口

答案 3 :(得分:-1)

好吧,请引用Android Developers' References

  

当活动出现时,在onStart()之后调用此方法   从之前保存的状态重新初始化,在此处给出   savedInstanceState。大多数实现都会使用   onCreate(Bundle)恢复他们的状态,但有时候   在完成所有初始化之后,这里可以方便地完成   或者允许子类决定是否使用默认值   实现。此方法的默认实现执行   恢复之前被冻结的任何视图状态   的onSaveInstanceState(束)。

关于onSaveInstanceState()的使用,最好使用onRestoreInstanceState()来恢复您的对象/事物。

Refer to Activity#onRestoreInstanceState()