【发布时间】:2013-06-19 14:06:51
【问题描述】:
我有一个活动,包含片段“列表”,单击其中一个项目时,它会将自身替换为“内容”片段。当用户使用后退按钮时,他会再次被带到“列表”片段。
问题在于,无论我如何尝试持久化数据,片段都处于默认状态。
事实:
- 两个片段都是通过
public static TheFragment newInstance(Bundle args)、setArguments(args)和Bundle args = getArguments()创建的 - 两个片段位于同一级别,直接位于父活动的
FrameLayout内(即不是嵌套片段) - 我不想打电话给
setRetainInstance,因为我的活动是一个主/详细信息流,它在大屏幕上有一个2 窗格布局。 7" 平板电脑有 1 个纵向窗格和 2 个横向窗格。如果我保留“列表”片段实例,它会(我认为)屏幕旋转搞砸 - 当用户点击'list'片段中的某一项时,'content'片段通过
FragmentTransaction#replace(int, Fragment, String)显示,ID相同,标签不同 - 我确实覆盖了
onSaveInstanceState(Bundle),但这并不是由框架总是调用的,如per the doc:“在很多情况下,片段可能大部分被拆除(例如就像放置在没有显示 UI 的后堆栈上时一样),但在其拥有的 Activity 实际需要保存其状态之前,它的状态不会被保存。" - 我正在使用支持库
从上面的第5条,我猜低端设备需要在片段事务后恢复内存可能会调用Fragment#onSaveInstanceState(Bundle)。但是,在我的测试设备(Galaxy Nexus 和 Nexus 7)上,该框架不会调用该方法。所以这不是一个有效的选择。
那么,我怎样才能保留一些片段数据呢?传递给Fragment#onCreate、Fragment#onActivityCreated 等的包总是null。
因此,我无法从全新的片段启动到返回堆栈恢复。
【问题讨论】:
-
现在我唯一的选择是:
isFromBackStack = getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0。我想要一些更清洁的东西,这对我来说就像一个黑客。另外,我没有从前一个片段实例中得到Bundle。
标签: android android-fragments back-stack