从活动中删除片段

Kev*_*vin 36 android

FragmantClass rSum = new FragmantClass();
getSupportFragmentManager().beginTransaction().remove(rSum).commit();       
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除此片段,当我加载切换另一个片段.上述片段不会被删除.这是我打电话切换片段的方法.

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();
}
Run Code Online (Sandbox Code Playgroud)

Tha*_*var 49

getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();
Run Code Online (Sandbox Code Playgroud)

试试这个,它应该工作.

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();
}
Run Code Online (Sandbox Code Playgroud)


Moi*_*llo 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();
Run Code Online (Sandbox Code Playgroud)

总是很好验证您的容器是否具有片段或具有空异常


cra*_*ned 10

这是一个非常简单的解决方案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();
}
Run Code Online (Sandbox Code Playgroud)

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

.commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)

如果要多次从视图中删除所有片段,可以考虑检查当前的片段是否为空isDetached()或者isRemoving()或者是否可以获得NullPointerExceptions.

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

在此输入图像描述

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

  1. 给每个fragment一个tagid创建时,并遍历它们来处理每个fragment任意的.
  2. 创建一个监听器使用onAttachListener,每次fragment附加一个新的activity,你可以存储它fragment,然后遍历该数据结构,fragment根据需要处理每个.

当不使用getSupportFragmentManager(),处理交易时,您需要使用getFragmentManager().