我的Android应用有一个ActionBar
,可以更改Fragment
占用某个FrameLayout
的内容。我正在尝试使用onSaveInstanceState
在更改选项卡时保存片段的状态,以便可以在onCreateView
中恢复。
问题是,onSaveInstanceState
永远不会被调用。调用Fragment
的{{1}}和onDestroyView
方法,但提供给onCreateView
的{{1}}仍然为空。
有人可以在实际调用Bundle
时向我解释,如何确保在切换标签时调用它,或者保存和恢复onCreateView
的状态时的最佳做法分离并重新连接?
片段:
onSaveInstanceState
的活动:
Fragment
答案 0 :(得分:8)
Fragment#onSaveInstanceState
仅在托管Activity
的{{1}}被销毁且有可能返回相同活动并且片段仍添加到{{}}时调用{1}}。最常见的情况是屏幕旋转。
我认为您的Fragment
也需要在FragmentManager
中setRetainInstance(true)
进行操作。虽然不太确定这一点。
例如,按下主页按钮时,您还应该看到调用此方法。这将破坏活动,但您可以通过使用任务列表返回到它。
如果您只是Fragment
片段,那么您需要做的就是向onCreate
询问它。
您应该看一下两个例子:
ActionBar
FragmentTabs和TabHost
FragmentTabs
detach()
示例使用
FragmentManager
查找以前添加的TabHost
的实例,直到您ft.add(containerId, fragment, tag);
// later
fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);
Fragment
关于remove()
/ Fragment
:一旦片段被分离,就会调用它,因为下次附加它时需要创建一个新的onCreateView
。请注意,当您onDestroyView
片段时,View
不会被调用,因为它仍然附加到Fragment#onDetached()
。它只与视图层次结构分离。
还有另一个很好的例子,说明如何在Android培训中保留片段状态/如何使用片段来保留状态 - Caching Bitmaps。
这个例子虽然缺少一条关键线:
detach()