42
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

4 回答 4

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

试试这个,它应该工作。

public void switchContent(Fragment fragment) {
    getSupportFragmentManager().beginTransaction().
    remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();
    mContent = fragment;
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, fragment)
        .commit();
    getSlidingMenu().showContent();
}
于 2013-04-07T01:52:23.550 回答
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();
于 2016-03-22T16:24:40.683 回答
9

这是一个非常简单的解决方案SupportFragmentManagerFragmentManager不是很方便,但仍然有效:

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();

如果您多次从视图中删除所有片段,您可能会考虑检查当前片段是否为 null 或isDetached()or ,isRemoving()或者您可能会得到一个NullPointerExceptions.

更新 6-9-15:的文档现在getSupportFragmentManger().getFragments()显然是隐藏的,但在我的代码中仍然可以正常工作。这是文档的屏幕截图:

在此处输入图像描述

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

  1. 在创建时给每个fragmentatagid,并遍历它们以fragment根据需要处理每个。
  2. 创建一个侦听器onAttachListener,以便每次将新fragment的附加到 时activity,您可以存储它fragment,然后遍历该数据结构以fragment根据需要处理每个。

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

于 2014-09-23T18:58:35.517 回答
-1

更简单的,你可以用一个空的fragment替换主要内容,这样就只看主要的activity了。

getFragmentManager()
.beginTransaction()
.replace(main_content,new Fragment())
.commit();
于 2018-03-03T03:57:05.567 回答