如何暂停/恢复片段

时间:2014-05-16 18:18:02

标签: android android-fragments

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

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

  2. 我调用FragmentTransaction.hide()FragmentTransaction.show()方法来隐藏和显示片段。托管片段覆盖Fragment.onHiddenChanged()并根据需要进行响应。这也解决了。

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

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

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

2 个答案:

答案 0 :(得分:4)

听起来你想要调用FragmentTransaction#attachFragmentTransaction#detach来让你的片段通过生命周期例程与FragmentPagerAdapter(see source here)相同。

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