- 该项目使用Android Studio的导航抽屉模式创建。抽屉在NavigationDrawerFragment类中实现。
- 当选择抽屉中的特定项时,将添加包含视图页的片段。该代码是在我的主活动中实现的。
- 当屏幕旋转时,将调用NavigationDrawerFragment的onCreate()方法,以保留上次选择的项。
- 问题就在这里-在重新创建时,NavigationDrawerFragment将再次调用selectItem(),这会触发我的菜单项选中处理程序。这会导致由Android恢复的ListFragment。
可以通过检查我的菜单选择处理程序代码中的活动菜单项来防止这种情况发生。
当活动由于任何原因重新创建时,例如方向更改,我希望保留 ViewPager
的最后浏览页面索引。
ViewPager
位于附加到活动的 Fragment
(名为 ListFragment
)中。我正在使用兼容库,因此该片段是 android.support.v4.app.Fragment
的子类。
我认为可以通过覆盖 onSaveInstanceState()
方法并在 onCreate()
中添加适当的逻辑来完成此操作,如 doc 中所述:
为了正确处理重启,重要的是您的活动通过正常的 Activity 生命周期恢复其先前的状态,在其中 Android 在销毁您的活动之前调用 onSaveInstanceState(),以便您可以保存有关应用程序状态的数据。然后可以在 onCreate() 或 onRestoreInstanceState() 中恢复状态。
但对于片段,情况似乎不同。当我从这个 ListFragment
导航到另一个活动并按下“返回”时,可以正确地恢复页面索引。但是当我旋转设备时,页面索引会丢失。
ListFragment
(我称之为ListFragment A)的onSaveInstanceState()
被正确调用,但是这个特定的Fragment类不再显示在活动中。当方向改变并且活动被重新创建时,Android会调用onSaveInstanceState()
,然后调用onDetach()
来分离此片段。然后Android创建了一个新的ListFragment
(我称之为ListFragment B),并将其附加到新的旋转活动中。这个ListFragment B有一个空的savedInstanceState
传递给构造函数,因此上一页索引(以及Fragment A的任何配置)都会丢失。
实际上,每次屏幕旋转发生时,都会创建一个新的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()
。上面的内容显示了即使它们被最新的(1111031048)替换,以前创建的片段的onSaveInstanceState()
和onCreate()
仍然被调用。请注意,我在片段类中没有调用
setRetainInstance()
。事实上,我尝试了setRetainInstance(false)
和setRetainInstance(true)
,但没有改变任何东西。我做错了什么吗?我可以理解为什么需要重新创建
ListFragment
,但为什么savedInstanceState
为空?如果这是预期的行为,那么解决我的需求的正确方法是什么,即在配置更改时保留页面索引?将页面索引设置为静态类变量应该是可能的,但我不确定它是否实际解决了问题,还是只是隐藏了它(因为我在上面的日志中闻到了内存泄漏)。
onCreate
,onSaveInstanceState
)等中调用super
? - Ari