【问题标题】:How to reuse a fragment如何重用一个片段
【发布时间】:2018-08-21 12:01:04
【问题描述】:

当我替换一个片段时,它会被销毁。我试图在活动的 onCreate 中创建片段并在活动中保存它的引用,并在我“重新显示”或“重新打开”它时通过调用替换引用来使用它,但这没有帮助并且片段被破坏(替换时由另一个片段)并重新创建。应该怎么解决?

我想要实现的目标是在 WhatsApp 中说片段在不可见时不应被销毁,除非我使用的不是滑动手势而是常规按钮。

谢谢。

【问题讨论】:

  • 通常碎片不应该保存在内存中,应该重新创建。
  • 我认为解决方案是保存片段的状态并在需要时重新创建它。这样片段就不必在后台停留在内存中。
  • 还有为什么你认为它们没有在 WhatsApp 中被销毁?
  • 像 Whatsapp 这样的片段永远不会被破坏,因为它们是 ViewPager 的一部分。尝试类似的方法来防止它被破坏。
  • 发布您到目前为止所尝试的内容。 (源码)这样会更有帮助

标签: android android-fragments fragmenttransaction fragmentmanager


【解决方案1】:

您需要使用addToBackStack() 来记住片段事务,如下所示:-

FragmentA fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.YOUR_CONTENT,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit();

您可以检查片段是否已经存在于堆栈中或不像下面那样

Fragment fragment = getFragmentManager().findFragmentByTag("YOUR_TARGET_FRAGMENT_TAG");

 if (fragment!=null && fragment instanceof FragmentA) {
   //you are good to go, do your logic   
    }

【讨论】:

    【解决方案2】:

    FragmentTransaction.replace():替换已添加到容器中的现有片段。

    所以这会从堆栈中删除 Fragment。

    使用FragmentTransaction.addToBackStack()Fragment 添加到另一个(多个)(堆栈)之上。

    【讨论】:

      【解决方案3】:

      解决方案是 ViewPager with PagerAdapter,更具体地说,我的情况是 FragmentPagerAdapter。

      PagerAdapter 的实现将每个页面表示为一个片段,只要用户可以返回该页面,它就会永久保存在片段管理器中。此版本的分页器最适合在需要分页的情况下使用少数通常更静态的片段,例如一组选项卡。 用户访问的每个页面的片段都将保存在内存中,尽管它的视图层次结构在不可见时可能会被破坏。

      https://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter

      我在很久很久以前就处理过它,虽然我没有考虑它,因为当时我将它与 TabLayout 一起使用,并且我认为它们是紧密耦合的。

      【讨论】:

        【解决方案4】:

        使用包来保存状态信息并可能在onCreate() 中恢复它?

        【讨论】:

          猜你喜欢
          • 2016-06-25
          • 2013-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-19
          相关资源
          最近更新 更多