2013-03-21 98 views
3

在片段第一次创建并重新附加到活动时,您对片段回调获得的savedInstanceState包有疑问。Android:使用带片段的savedInstanceState

因此,我使用setRetainInstance(true)作为结果,片段不应该被销毁,而只是在活动被销毁时从活动中脱离,然后在配置更改时重新创建活动时重新连接。

如此,因为使用这种setRetainInstance(真),这将导致savedInstanceState束ALWAYS是在该片段中的回调,如空:onActivityCreated()onCreate()

到目前为止好,现在我从某些用户(一个非常小的数字)获得一些崩溃,这是由于此片段上的savedInstanceState不为null而导致的。

因此,onActivityCreated()回调是做这样的事情:

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

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

的CustomAdapter在从它的构造一些点loadInstanceState()方法,它的工作,下面的代码调用

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

而现在的问题

的是Android保证,当上一个片段使用setRetainInstance(true)其传递给回调savedInstanceState束将永远是空?

谢谢你的答案!

+0

我想你需要注意['onSaveInstance'方法](https://www.google.com.vn/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDcFjAB&url=http%3A%2F %2Fstackoverflow.com%2Fquestions%2F9938862%2Fandroid-和onsaveinstance和恢复与EI = Mck8U7rOG-H-iAfT14GIBw与USG = AFQjCNHfPxzq_Bjd9wFV8GKtFpzwXx30ZQ&SIG2 = Zy7or38dyhnDfoF4VEUxEQ与BVM = bv.63934634,d.aGc) – 2014-04-03 02:37:14

回答

1

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

公共无效setRetainInstance(布尔保留)的片段实例

控制是否保持 跨越活动重新创建(例如从配置改变)。 这只能用于不在后堆栈中的碎片。如果设置, 片段生命周期会略有不同,当一个活动 重建:

的onDestroy()不会被调用(但onDetach()仍然是,因为 片段将被从其当前活动分开) 。

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

onAttach(Activity)and onActivityCreated(Bundle)将会调用 。

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

+0

OK,谢谢用于共享的。在这种情况下,可能缺少文档中保存的实例状态为空的方面。我自己调试它,并阅读一些帖子,似乎每个人都承认同样的事情。 – 2013-03-21 12:52:18