从一个活动中移除碎片

43
FragmantClass rSum = new FragmantClass();
getSupportFragmentManager().beginTransaction().remove(rSum).commit();       

我正在尝试在加载切换到另一个片段时删除此片段。但是上面的片段没有被删除。这是我调用切换片段的方法。

public void switchContent(Fragment fragment) {
    FragmantClass rSum = new FragmantClass();
    getSupportFragmentManager().beginTransaction().remove(rSum).commit();
    mContent = fragment;
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, fragment)
        .commit();
    getSlidingMenu().showContent();
}
4个回答

60
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();

试试这个,应该可以工作。

public void switchContent(Fragment fragment) {
    Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.frame);
    if (oldFragment != null) { 
        getSupportFragmentManager().beginTransaction()
            .remove(oldFragment).commit();
    }
    mContent = fragment;
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, fragment)
        .commit();
    getSlidingMenu().showContent();
}

1
mContent是全局变量吗? - Red M
1
@Thalaivar 谢谢,我发现你的答案对我的应用程序很有帮助,我已经点赞了。 - TheCoderGuy

13
在我的个人案例中,我是通过以下方式添加和移除片段的:
 if(getSupportFragmentManager().findFragmentById(R.id.container) != null) {
        getSupportFragmentManager()
                .beginTransaction().
                remove(getSupportFragmentManager().findFragmentById(R.id.container)).commit();
    }
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.container, fragment)
            .commit();

9
这是针对 SupportFragmentManager 的一个非常简单的解决方案。虽然 FragmentManager 不够方便,但仍然很有效。
List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
// You might have to access all the fragments by their tag,
// in which case just follow the line below to remove the fragment
if (fragmentList == null) {
    // code that handles no existing fragments
}

for (Fragment frag : fragmentList )
{
   // To save any of the fragments, add this check
   // a tag can be added as a third parameter to the fragment when you commit it
   if (frag.getTag().equals("<tag-name")) {
      continue;
   }

   getSupportFragmentManager().beginTransaction().remove(frag).commit();
}

或者,如果你被强制使用它(但不推荐):

.commitAllowingStateLoss();

如果您多次从视图中删除所有片段,您可能需要检查当前的frag是否为空或isDetached()isRemoving(),否则您可能会得到一个NullPointerExceptions

更新6-9-15:getSupportFragmentManger().getFragments()的文档现在是隐藏的,但在我的代码中仍然有效。这里是文档的截图:

enter image description here

更新8-3-15:如果您不使用片段支持库,则不幸的是没有getFragments()可用,但仍有一些更不方便的选项。

  1. 在创建每个fragment时都给它们一个tagid,并迭代它们以按需处理每个fragment
  2. 使用onAttachListener创建一个监听器,因此每次将新fragment附加到activity时,您都可以存储该fragment,然后迭代该数据结构以按需处理每个fragment

当不使用getSupportFragmentManager()时,要处理事务,您将需要使用getFragmentManager()


你能提供 getFragments() 方法的链接吗? - Ivan Black
1
@IvanBlack,显然没有可用的链接。我相信当我写这篇文章时文档是可用的,但API显示它已被隐藏,尽管它仍然有效。 - craned

-1
更简单的方法是,您可以用一个空片段替换主要内容,这样只能查看主活动。
getFragmentManager()
.beginTransaction()
.replace(main_content,new Fragment())
.commit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接