从活动中删除片段

时间:2013-04-07 01:04:25

标签: android

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

3 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分: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();

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

答案 2 :(得分:8)

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

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

更新6-9-15: getSupportFragmentManger().getFragments()的文档现在显然是hidden,但在我的代码中仍能正常运行。这是文档的屏幕截图:

enter image description here

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

  1. 在创建时为每个fragment提供tagid,并根据需要对其进行迭代以处理每个fragment
  2. 使用onAttachListener创建一个监听器,因此每次将新fragment附加到activity时,您都可以存储fragment,然后遍历该数据结构根据需要处理每个fragment
  3. 如果不使用getSupportFragmentManager(),要处理交易,您需要使用getFragmentManager()