Android:将 savedInstanceState 与片段一起使用

Posted

技术标签:

【中文标题】Android:将 savedInstanceState 与片段一起使用【英文标题】:Android: using savedInstanceState with fragments 【发布时间】:2013-03-10 19:49:59 【问题描述】:

对第一次创建片段然后重新附加到活动时在片段的回调中获得的 savedInstanceState 包有疑问。

所以我使用 setRetainInstance(true),因此片段不应该被销毁,而只是在 Activity 被销毁时从 Activity 中脱离,然后在配置更改时重新创建 Activity 时重新附加回来。

因此,因为使用此 setRetainInstance(true),这将导致 savedInstanceState 包在片段的回调中始终为空,例如:onActivityCreated()onCreate() 等。

到目前为止一切顺利,现在我从一些用户那里得到了一些崩溃(一个非常小的数字),这是由于片段上的这个 savedInstanceState 不为 null 引起的。

所以,onActivityCreated() 回调正在做这样的事情:

@Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);
        adapter = new CustomAdapter(getActivity(), getListView(), data, savedInstanceState);
        setListAdapter(adapter);
        setupEmptyListView();
        getListView().setOnScrollListener(this);
    

CustomAdapter 在某个时刻从其构造函数调用 loadInstanceState() 方法来完成其工作,代码如下:

@Override
    public void loadInstanceState(Bundle savedInstanceState) 
        if (savedInstanceState != null) 
         //do some stuff which is causing a crash
        
    

现在我的问题是,当我传递的 savedInstanceState 应该始终为 null 时,如何才能进入该 if 语句。

现在是问题

Android 是否保证在使用时 setRetainInstance(true) 在片段上,传递给回调的 savedInstanceState 包总是为空?

谢谢大家的回答!

【问题讨论】:

我想你需要通知onSaveInstance method 【参考方案1】:

我没有发现任何提到 savedInstanceState 包在这种情况下必须为空。 official documentation 说:

public void setRetainInstance(布尔保留)

控制是否保留片段实例 跨 Activity 重新创建(例如从配置更改)。 这只能与不在后台堆栈中的片段一起使用。如果设置, 当一个活动被激活时,片段生命周期会略有不同 重新创建:

onDestroy() 不会被调用(但 onDetach() 仍然会被调用,因为 该片段正在与其当前活动分离)。

onCreate(Bundle) 不会被调用,因为片段没有被 重新创建。

onAttach(Activity) 和 onActivityCreated(Bundle) 将 仍然被调用。

恕我直言,这是主要区别 - 改变了生命周期。

【讨论】:

好的,谢谢分享。也许这里的文档缺少 saveInstanceState 在这种情况下将为空的方面。我自己调试过,也看了一些帖子,似乎每个人都承认同样的事情。

以上是关于Android:将 savedInstanceState 与片段一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Android savedInstanceState 总是返回 null

求教大神: android 开发的java程序中,一个语句super.onCreate(savedInstanceState); 是啥意思?

如何在不发送 savedInstanceState 的情况下启动新的 Android 活动?

android savedinstancestate null啥原因

Android 生命周期,解决savedInstanceState一直为null的问题

Android 生命周期,解决savedInstanceState一直为null的问题