Android 从容器中取出所有碎片
是否有方法删除已添加具有视图id的特定视图的所有片段 例如,我想删除添加到R.id.fragmentcontainer视图中的所有片段。您可以尝试下面的代码Android 从容器中取出所有碎片,android,android-fragments,Android,Android Fragments,是否有方法删除已添加具有视图id的特定视图的所有片段 例如,我想删除添加到R.id.fragmentcontainer视图中的所有片段。您可以尝试下面的代码 getSupportFragmentManager().beginTransaction().remove(frag).commit(); *frag是要删除的片段对象 OR getFragmentManager().beginTransaction().remove(getFragmentManager().findFragment
getSupportFragmentManager().beginTransaction().remove(frag).commit();
*frag是要删除的片段对象
OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();
它将移除存放在“your_container”容器中的碎片
愉快的编码。将所有片段保存在ArrayList中 初始化:
List<Fragment> activeCenterFragments = new ArrayList<Fragment>();
如果要删除所有它们,请执行以下操作:
private void removeActiveCenterFragments() {
if (activeCenterFragments.size() > 0) {
fragmentTransaction = fragmentManager.beginTransaction();
for (Fragment activeFragment : activeCenterFragments) {
fragmentTransaction.remove(activeFragment);
}
activeCenterFragments.clear();
fragmentTransaction.commit();
}
}
我已经在生产中使用这种方法多年了,效果非常好。如果您有任何问题,请告诉我。很简单,只需遍历所有片段并将其删除即可
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
但是如果是导航抽屉请务必检查它,如果您试图删除它,您将得到错误
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment instanceof NavigationDrawerFragment) {
continue;
}
else {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
}
最后一个但非常重要的在执行任何片段事务之前,请确保检查空值
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment instanceof NavigationDrawerFragment) {
continue;
}
else if (fragment != null) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
}
其实很简单
private static void removeAllFragments(FragmentManager fragmentManager) {
while (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStackImmediate();
}
}
试试这个,希望对你有帮助
try {
if(manager.getFragments()!=null){
if(manager.getBackStackEntryCount()>0) {
for (int i = 0; i < manager.getBackStackEntryCount(); i++)
manager.popBackStack();
manager.beginTransaction().remove(getSupportFragmentManager()
.findFragmentById(R.id.main_content))
.commit();
}
}
}catch (Exception e){
e.printStackTrace();
}
试试看{
if(manager.getFragments()!=null){
if(manager.getBackStackEntryCount()>0){
对于(int i=0;i
使用此代码
activity?.let {
it.supportFragmentManager.fragments.forEach { fragment ->
it.supportFragmentManager.beginTransaction().remove(fragment).commit()
}
}
希望能有帮助
谢谢。如果有人在Kotlin中查找代码:
private fun clearFragmentsFromContainer() {
val fragments = supportFragmentManager.fragments
if (fragments != null) {
for (fragment in fragments) {
supportFragmentManager.beginTransaction().remove(fragment).commit()
}
}
//Remove all the previous fragments in back stack
supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
更优化的版本不需要多次调用commit,所以让我们在最后调用它一次
supportFragmentManager.fragments.let {
if (it.isNotEmpty()) {
supportFragmentManager.beginTransaction().apply {
for (fragment in it) {
remove(fragment)
}
commit()
}
}
}
作为对有用答案的补充,我必须指出,如果您向特定视图容器添加了一些片段,例如:
getSupportFragmentManager()
.beginTransaction()
.add(containerViewId, fragmentA)
.add(containerViewId, fragmentB)
.commit();
如果您只需要将它们替换为一个,您只需调用replace
,而无需删除fragmentA和fragmentB
根据replace
在添加新代码之前删除所有片段:
替换添加到容器中的现有片段。这是
本质上与当前为所有对象调用remove(Fragment)相同
添加了使用相同ContainerWebID添加的片段,然后
使用此处给出的相同参数添加(int、Fragment、String)
我如何才能确保frag objects容器视图是R.id.mycontainer?这只是供您参考的,您可以用您的id替换。这是一种错误的方法。问题不在于如何删除一个片段,而在于如何删除所有片段。@vingtof它的使用:FragmentManager FragmentManager=MainActivity.activity.getSupportFragmentManager();对于(inti=0;i
add
创建一个普通片段,而replace
在它上面创建了一个高高的工具栏(在Lollipop,带有导航抽屉)。也许你是对的,最好创建一个虚拟片段并添加其他片段。你这样做了吗?是的,我总是喜欢添加片段作为导航抽屉,它提供了对设计和更改软件的更多控制,这将删除给定片段管理器中的所有片段。不仅仅是在OP询问的特定布局容器中,此检查是不必要的:“if(manager.getBackStackEntryCount()>0){”因为如果此值为false,它将永远不会在for循环上运行传递。这仅在片段被添加到backbackback时有效。如果在应用程序被终止后状态已恢复,则此操作将不起作用,因为列表将为空。这不是正确的方法。因为您无法从容器中删除所有片段。您只能从e最后添加的后堆栈
getSupportFragmentManager()
.beginTransaction()
.add(containerViewId, fragmentA)
.add(containerViewId, fragmentB)
.commit();
getSupportFragmentManager()
.beginTransaction()
.replace(containerViewId, fragment)
.commit();