繁体   English   中英

如何暂停/恢复片段

[英]How to pause/resume a fragment

背景:我编写了一个能够容纳三个片段的自定义容器。 根据此容器的状态,只有两个或那三个片段是可见的。 为了通知片段它们的可见性已更改,我尝试了两个选项:

  1. 我用各自的值调用了Fragment.setUserVisibleHint()方法。 托管片段会覆盖此方法并做出适当的反应。 这解决了。

  2. 我调用FragmentTransaction.hide()FragmentTransaction.show()方法来隐藏和显示片段。 托管片段覆盖 Fragment.onHiddenChanged() 并根据需要做出反应。 这也奏效了。

我的问题是我对这些选项中的任何一个都不满意。 我想将不可见的片段置于标准的暂停状态。 这个选项的优点是我保持代码干净和简单,因为我不需要覆盖任何特殊的方法(比如setUserVisibleHint()onHiddenChanged() )并且我可以处理onPause()onResume()中的所有内容已经实施。

问题:将片段置于暂停状态然后从该状态恢复它的正确方法是什么?

更新:我也尝试了FragmentTransaction.detach() 这不是一个选项,因为它会破坏视图,这在我的情况下是不允许的。

听起来您想调用FragmentTransaction#attachFragmentTransaction#detach来让您的片段通过与 FragmentPagerAdapter 相同的生命周期例程( 请参阅此处的源代码)。

使用detach() Fragment将使Fragment通过onPauseonStop和最后onDestroyView生命周期方法,然后当您使用attach()重新附加它时,它将通过onCreateViewonStart和最后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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM