我在Parent的Fragment linearLayout(fragmentContainer)中动态加载了一堆Child片段,然后当用户点击一个按钮时,我需要将它们全部删除并添加新的片段。我不知道每次都会添加的确切碎片数量。这是我一次删除所有碎片的方法
LinearLayout ll = (LinearLayout) view.findViewById(R.id.fragmentContainer);
ll.removeAllViews();
现在我可以使用片段事务方法添加新的。 这种删除所有片段的方法非常简单,对我来说比使用remove()逐个删除每个片段更有效但是这是一个好习惯吗?性能如何?你推荐一种更好的方法吗?
答案 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)
}
}