如何保存和恢复自动添加的嵌套片段的状态?

时间:2016-06-25 08:25:13

标签: java android android-fragments android-nested-fragment

  

快速说明:在提出问题之前,我做了尽职调查:我知道这听起来像是一个骗局。但是现有的问题都没有问我的确切问题,现有问题的解决方案都不适合我。感谢。

TL; DR:恢复具有嵌套片段的片段时,childFragmentManager会将嵌套片段添加回来,但不会恢复其状态。我该怎么做呢?

我有一个由ViewPager支持的FragmentStatePagerAdapterFSPA会返回片段,当setUserVisibleHinttrue时,每个片段都会添加另一个片段。我基本上避免了加载一个屏幕外片段的成本,这是默认的ViewPager行为。内部片段是一个项目列表,因此保持滚动位置很重要。

以下是事件的顺序:

  • 打开页面N,因为它可见,内部片段已添加
  • 转到页面N+2N-2:现在位置N的片段已被销毁,因为它已超过ViewPager' s {{ 1}} of 1
  • 然后当我回到offScreenLimit时,片段管理器会方便地添加内部片段(因为N我在猜测)
  • 但是:这就是错误:新添加的子片段的状态未保存或恢复:片段是新创建的

这会导致糟糕的用户体验,因为当回到位置savedInstanceState时,列表会一直滚动到顶部。

有什么方法可以避免这种情况吗?我试过了:

  • 使用N手动保存状态
    • 但我不知道在哪里或如何恢复它,因为子片段管理器为我添加了片段
  • 保留实例变量getChildFragmentManager().saveFragmentInstanceState(myInnerFragment)并用此替换自动添加的片段
    • 由于很多原因这是错误的,但它也看起来很糟糕,因为我们用这个替换已经添加的片段,因此当向后滑动到位置mInnerFragment

请注意,我无法在任何片段中使用N:外部或内部,因为所有这些都嵌套在另一个片段中。许多答案建议使用反射来挂起并恢复setRetainInstanceState(true),但这似乎有风险,而且无论如何由于mChildFragmentManager限制我无法使用它。 / p>

代码

OuterFragment.java

setRetainInstance

0 个答案:

没有答案