背景:我写了一个能够容纳三个片段的自定义容器。根据此容器的状态,只能看到两个或三个碎片。为了通知片段他们的可见性已被更改,我尝试了两个选项:
我用相应的值调用了Fragment.setUserVisibleHint()方法。托管片段覆盖此方法并做出适当反应。这就解决了。
我调用FragmentTransaction.hide()和FragmentTransaction.show()方法来隐藏和显示片段。托管片段覆盖Fragment.onHiddenChanged()并根据需要进行响应。这也解决了。
我的问题是我对这些选项中的任何一个都不满意。我想将不可见的片段放入标准的暂停的状态。这个选项的优点是我保持代码干净简单,因为我不需要覆盖任何特殊方法(如setUserVisibleHint()
或onHiddenChanged()
),我可以处理onPause()
内的所有内容和已经实施的onResume()
。
问题:将片段置于暂停的状态然后从该状态恢复的正确方法是什么?
更新:我也尝试了FragmentTransaction.detach()
。这不是一个选项,因为它会破坏视图,在我的情况下是不允许的。
答案 0 :(得分:4)
听起来你想要调用FragmentTransaction#attach和FragmentTransaction#detach来让你的片段通过生命周期例程与FragmentPagerAdapter(see source here)相同。
使用Fragment
分离detach()
会使Fragment
通过onPause
,onStop
和最后onDestroyView
生命周期方法,然后当您使用attach()
重新附加它时,它将通过onCreateView
,onStart
和最后onResume
生命周期方法。
您必须确保使用标记以及容器ID,因为您可以将多个片段附加到单个容器,并且您必须能够从Fragment
引用然后必须通过其标记完成FragmentManager
。
答案 1 :(得分:1)
FragmentTransaction.setMaxLifecycle()方法可用于此目的。要暂停片段,只需将其最大状态设置为STARTED
:
// hide and pause the fragment
transaction.hide(fragment)
transaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED)
// show and resume the fragment
transaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
transaction.show(fragment)