[英]How to pause/resume a fragment
背景:我编写了一个能够容纳三个片段的自定义容器。 根据此容器的状态,只有两个或那三个片段是可见的。 为了通知片段它们的可见性已更改,我尝试了两个选项:
我用各自的值调用了Fragment.setUserVisibleHint()方法。 托管片段会覆盖此方法并做出适当的反应。 这解决了。
我调用FragmentTransaction.hide()和FragmentTransaction.show()方法来隐藏和显示片段。 托管片段覆盖 Fragment.onHiddenChanged() 并根据需要做出反应。 这也奏效了。
我的问题是我对这些选项中的任何一个都不满意。 我想将不可见的片段置于标准的暂停状态。 这个选项的优点是我保持代码干净和简单,因为我不需要覆盖任何特殊的方法(比如setUserVisibleHint()
或onHiddenChanged()
)并且我可以处理onPause()
和onResume()
中的所有内容已经实施。
问题:将片段置于暂停状态然后从该状态恢复它的正确方法是什么?
更新:我也尝试了FragmentTransaction.detach()
。 这不是一个选项,因为它会破坏视图,这在我的情况下是不允许的。
听起来您想调用FragmentTransaction#attach和FragmentTransaction#detach来让您的片段通过与 FragmentPagerAdapter 相同的生命周期例程( 请参阅此处的源代码)。
使用detach()
Fragment
将使Fragment
通过onPause
、 onStop
和最后onDestroyView
生命周期方法,然后当您使用attach()
重新附加它时,它将通过onCreateView
、 onStart
和最后onResume
生命周期方法.
您必须确保使用标签以及容器 ID,因为您可以将多个片段附加到单个容器,并且您必须能够从FragmentManager
获取Fragment
引用,然后必须通过其完成标签。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.