更新:事实证明问题出在其他地方。感谢@Luksprog 指出我忽略的内容。
- 该项目是使用 Android Studio 的抽屉式导航模式创建的。抽屉在
NavigationDrawerFragment
类中实现。 - The fragment holding the view pager is added when a particular item in the drawer is selected. 该代码实现了我的家庭活动。
- 当屏幕旋转时,调用的
onCreate()
方法,保留最后选择的项目。NavigationDrawerFragment
- 这就是问题所在 - 在重新创建时,
NavigationDrawerFragment
将再次调用 selectItem(),这会触发我的菜单项选择处理程序。这会导致 Android 恢复 ListFragment。
这可以通过检查我的菜单选择处理程序代码中的活动菜单项来防止。
我想保留ViewPager
由于任何原因(例如方向更改)重新创建活动时的最后查看页面索引。
位于(named )ViewPager
中,它附加到一个活动。我正在使用 compat 库,所以片段是.Fragment
ListFragment
android.support.v4.app.Fragment
我认为可以通过覆盖该onSaveInstanceState()
方法并在文档中添加适当的逻辑来完成onCreate()
,如文档中所述:
要正确处理重启,重要的是您的 Activity 通过正常的 Activity 生命周期恢复其先前的状态,在该生命周期中,Android 在销毁您的 Activity 之前调用 onSaveInstanceState() 以便您可以保存有关应用程序状态的数据。然后,您可以在 onCreate() 或 onRestoreInstanceState() 期间恢复状态。
但片段的情况似乎有所不同。ListFragment
当我从这里导航到另一个活动并按下“返回”时,可以正确恢复页面索引。但是,当我旋转设备时,页面索引会丢失。
我添加了一些日志以查看问题所在。从日志中我发现,虽然onSaveInstanceState()
(ListFragment
我称之为 ListFragment A)的调用正确,但这个特定的 Fragment 类不再显示在活动中。当方向改变并重新创建 Activity 时,Android 调用onSaveInstanceState()
随后onDetach()
分离此片段。然后Android 创建一个新的实例ListFragment
(我称之为 ListFragment B)并将它附加到新的、旋转的活动上。此 ListFragment B 向构造函数传递了一个空savedInstanceState
值,因此最后一页索引(以及 Fragment 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﹕ [1108826176] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1108083096] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1106541040] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1108316656] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1109134136] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1108630992] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1108592888] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1109729064] onSaveInstanceState() called, storing last page index 0
D/ListFragment﹕ [1110257048] onDestroy()
D/ListFragment﹕ [1110257048] onDetach()
D/ListFragment﹕ [1109835992] onDestroy()
D/ListFragment﹕ [1109835992] onDetach()
D/ListFragment﹕ [1108826176] onDestroy()
D/ListFragment﹕ [1108826176] onDetach()
D/ListFragment﹕ [1108083096] onDestroy()
D/ListFragment﹕ [1108083096] onDetach()
D/ListFragment﹕ [1106541040] onDestroy()
D/ListFragment﹕ [1106541040] onDetach()
D/ListFragment﹕ [1108316656] onDestroy()
D/ListFragment﹕ [1108316656] onDetach()
D/ListFragment﹕ [1109134136] onDestroy()
D/ListFragment﹕ [1109134136] onDetach()
D/ListFragment﹕ [1108630992] onDestroy()
D/ListFragment﹕ [1108630992] onDetach()
D/ListFragment﹕ [1108592888] onDestroy()
D/ListFragment﹕ [1108592888] onDetach()
D/ListFragment﹕ [1109729064] onDestroy()
D/ListFragment﹕ [1109729064] onDetach()
D/ListFragment﹕ [1110903656] onAttach()
D/ListFragment﹕ [1110903656] onCreate()
D/ListFragment﹕ [1110903656] savedInstanceState is not NULL.
D/ListFragment﹕ [1110903656] Retrieving last page index 3
D/ListFragment﹕ [1110905248] onAttach()
D/ListFragment﹕ [1110905248] onCreate()
D/ListFragment﹕ [1110905248] savedInstanceState is not NULL.
D/ListFragment﹕ [1110905248] Retrieving last page index 0
D/ListFragment﹕ [1110906440] onAttach()
D/ListFragment﹕ [1110906440] onCreate()
D/ListFragment﹕ [1110906440] savedInstanceState is not NULL.
D/ListFragment﹕ [1110906440] Retrieving last page index 0
D/ListFragment﹕ [1110907632] onAttach()
D/ListFragment﹕ [1110907632] onCreate()
D/ListFragment﹕ [1110907632] savedInstanceState is not NULL.
D/ListFragment﹕ [1110907632] Retrieving last page index 0
D/ListFragment﹕ [1110908824] onAttach()
D/ListFragment﹕ [1110908824] onCreate()
D/ListFragment﹕ [1110908824] savedInstanceState is not NULL.
D/ListFragment﹕ [1110908824] Retrieving last page index 0
D/ListFragment﹕ [1110910016] onAttach()
D/ListFragment﹕ [1110910016] onCreate()
D/ListFragment﹕ [1110910016] savedInstanceState is not NULL.
D/ListFragment﹕ [1110910016] Retrieving last page index 0
D/ListFragment﹕ [1110911208] onAttach()
D/ListFragment﹕ [1110911208] onCreate()
D/ListFragment﹕ [1110911208] savedInstanceState is not NULL.
D/ListFragment﹕ [1110911208] Retrieving last page index 0
D/ListFragment﹕ [1110912400] onAttach()
D/ListFragment﹕ [1110912400] onCreate()
D/ListFragment﹕ [1110912400] savedInstanceState is not NULL.
D/ListFragment﹕ [1110912400] Retrieving last page index 0
D/ListFragment﹕ [1110913592] onAttach()
D/ListFragment﹕ [1110913592] onCreate()
D/ListFragment﹕ [1110913592] savedInstanceState is not NULL.
D/ListFragment﹕ [1110913592] Retrieving last page index 0
D/ListFragment﹕ [1110914784] onAttach()
D/ListFragment﹕ [1110914784] onCreate()
D/ListFragment﹕ [1110914784] savedInstanceState is not NULL.
D/ListFragment﹕ [1110914784] Retrieving last page index 0
D/HomeActivity﹕ fragment updated
D/ListFragment﹕ [1110914784] onCreateView()
D/ListFragment﹕ [1111031048] onAttach()
D/HomeActivity﹕ Fragment attached.
D/ListFragment﹕ [1111031048] onCreate()
D/ListFragment﹕ [1111031048] savedInstanceState is NULL.
D/ListFragment﹕ [1111031048] onCreateView()
D/ListFragment﹕ [1111031048] onResume(), restoring page index 0
这是我旋转屏幕大约 10 次后的日志。标签中的数字是类的hashCode()
。上面的行显示,onSaveInstanceState()
即使onCreate()
在将它们替换为最新的 (1111031048) 片段之后,仍然会调用先前创建的片段。
请注意,我没有调用setRetainInstance()
片段类。事实上,我都尝试了setRetainInstance(false)
,setRetainInstance(true)
但它并没有改变任何东西。
我在这里做错了吗?我可以理解ListFragment
需要重新创建,但为什么savedInstanceState
为空?如果这是预期的行为,解决我的需求的正确方法是什么,即在配置更改时保持页面索引?
应该可以使页面索引成为静态类变量,但我不确定它是否真的在解决问题,或者只是隐藏它(因为我在上面的日志中闻到了内存泄漏)。