我正在开发一个基本上有ActionBar的应用程序.当我的应用程序启动时,Activity会创建片段并将它们附加到每个选项卡,因此当我切换时,我会得到不同的视图.
当我尝试旋转设备时出现问题.经过一番努力,我注意到Android会自动重新创建以前添加的片段,如下所示:
SummaryFragment.onCreate(Bundle) line: 79
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032
FragmentManagerImpl.moveToState(int, boolean) line: 1014
FragmentManagerImpl.dispatchCreate() line: 1761
DashboardActivity(Activity).onCreate(Bundle) line: 864
...
Run Code Online (Sandbox Code Playgroud)
然后像往常一样重新创建片段.因此,我希望能够正常工作的"真实"片段以及使我的应用程序崩溃的"隐藏"Android创建的对应物.我该如何避免这种行为?我已经尝试在SummaryFragment中调用setRetainInstance(false).
谢谢
更新:事实证明问题来自其他地方.感谢@Luksprog指出我忽略了什么.
NavigationDrawerFragment课堂上实施.onCreate()方法NavigationDrawerFragment,保留最后选择的项目.NavigationDrawerFragment会再次调用selectItem(),这会触发我的菜单项选择处理程序.这会导致Android恢复ListFragment.通过检查菜单选择处理程序代码中的活动菜单项可以防止这种情况.
我想保留最后一个查看页面索引,该索引ViewPager是由任何原因重新创建活动的时间,例如方向更改.
的ViewPager是在Fragment(命名ListFragment),其被附接到的活性.我正在使用compat库,因此片段是它的子类android.support.v4.app.Fragment.
我认为可以通过覆盖onSaveInstanceState()方法并添加适当的逻辑来完成onCreate(),如文档中所述:
要正确处理重新启动,您的活动必须通过正常的Activity生命周期恢复其先前的状态,在此生命周期中Android会在销毁活动之前调用onSaveInstanceState(),以便您可以保存有关应用程序状态的数据.然后,您可以在onCreate()或onRestoreInstanceState()期间恢复状态.
但是片段的情况似乎不同.当我从此导航ListFragment到另一个活动并按下"返回" 时,可以正确恢复页面索引.但是,当我旋转设备时,页面索引会丢失.
我添加了一些日志记录,看看有什么问题.从日志中我发现,虽然onSaveInstanceState() 的ListFragment(我称之为ListFragment A)正确调用,这个特殊的片段类不再在活动中.当方向改变并重新创建活动时,Android调用onSaveInstanceState()后跟onDetach()分离此片段.然后,Android会创建一个新实例ListFragment(我将其命名为ListFragment B)并将其附加到新的旋转活动中.此ListFragment B将空savedInstanceState传递给构造函数,因此最后一页索引(以及片段A的savedInstanceState中的任何配置)都将丢失.
实际上,ListFragment每次屏幕旋转时都会创建一个新实例,但似乎旧的实例不会被销毁.我在旋转设备时会看到如下所示的日志:
D/ListFragment? [1110257048] onSaveInstanceState() called, storing last page index 3
D/ListFragment? [1109835992] onSaveInstanceState() called, storing last page index 0
D/ListFragment? …Run Code Online (Sandbox Code Playgroud)