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啥原因