删除所有(子)片段

时间:2015-05-30 22:21:18

标签: android android-fragments android-nested-fragment

我在Parent的Fragment linearLayout(fragmentContainer)中动态加载了一堆Child片段,然后当用户点击一个按钮时,我需要将它们全部删除并添加新的片段。我不知道每次都会添加的确切碎片数量。这是我一次删除所有碎片的方法

LinearLayout ll = (LinearLayout) view.findViewById(R.id.fragmentContainer);
ll.removeAllViews();

现在我可以使用片段事务方法添加新的。 这种删除所有片段的方法非常简单,对我来说比使用remove()逐个删除每个片段更有效但是这是一个好习惯吗?性能如何?你推荐一种更好的方法吗?

Child fragments

4 个答案:

答案 0 :(得分:3)

  

这是我一次删除所有碎片的方法

不,不是。这是从容器中删除所有视图的方法。

  

这种删除所有碎片的方式非常简单,对我有用。

它会删除任何碎片。它删除了视图。这就是为什么该方法被命名为removeAllViews()

  

但这是一个好习惯吗?

没有。对于初学者,当您旋转设备或进行配置更改时,您会注意到所有“已删除”的片段都会返回。

  

你推荐一种更好的方法吗?

跟踪未完成的片段(例如,使用ArrayList<Fragment>),然后迭代该列表,将每个片段传递给remove()上的FragmentTransaction方法。

答案 1 :(得分:2)

如果您只是想删除所有片段,请使用以下代码:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}

只有在引用片段时使用add FragmentTransaction方法时,此代码才有效。方法 popBackStack 用于删除。

答案 2 :(得分:0)

在Kotlin中,您可以执行以下操作:

repeat(fragmentManager.backStackEntryCount) {
    fragmentManager.popBackStack()
}

fragmentManager可能是以下之一:

  • Activity.supportFragmentManager
  • Fragment.childFragmentManager
  • Fragment.requireActivity().supportFragmentManager
  • Fragment.requireFragmentManager()

答案 3 :(得分:0)

我想建议你:使用 Kotlin 和 fragment-ktx 使用这个:

在你的gradle中:

implementation "androidx.fragment:fragment-ktx:$androidXFragmentKtxVersion"

在你的片段中

childFragmentManager
      .findFragmentByTag(YOUR_TAG)?.let { fragment ->
        childFragmentManager.commit(allowStateLoss = true) {
          remove(fragment)
        }
      }

如果您不使用 childFragmentManager,请改用 requireActivity().supportFragmentManager

requireActivity().supportFragmentManage
          .findFragmentByTag(YOUR_TAG)?.let { fragment ->
            requireActivity().supportFragmentManage.commit(allowStateLoss = true) {
              remove(fragment)
            }
      }