从片段管理器中删除旧片段

我正在学习如何在机器人中使用 Fragment。 我试图删除旧的 fragment时,新的 fragment正在呼叫机器人。

171877 次浏览

您需要找到现有片段的引用,并使用下面的代码删除该片段。您需要使用一个标记 ex 添加/提交片段。“标签 _ 碎片”。

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();

就是这样。

我也有同样的问题去移除旧的碎片,我最终清除了包含碎片的布局。

LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...

我不知道这是否会造成泄漏,但它对我很有效。

也许你的实例老片段它是保持一个参考。见这个有趣的文章 Android 系统中的内存泄漏ーー识别、处理和避免

如果使用 addToBackStack,这将保留对实例片段的引用,避免使用 GarbageCollector 删除实例。实例保留在片段管理器中的片段列表中。你可以通过

ArrayList<Fragment> fragmentList = fragmentManager.getFragments();

接下来的代码不是最好的解决方案(因为不要为了避免内存泄漏而删除旧的片段实例) ,而是将旧的片段从 FragmentManger 片段列表中删除

int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);

您无法删除 arrayList 中的条目,因为很明显,FragmentManager 与索引 ArrayList 一起工作以获取片段。

我通常使用这段代码来处理 bragmentManager

public void replaceFragment(Fragment fragment, Bundle bundle) {


if (bundle != null)
fragment.setArguments(bundle);


FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());


//if oldFragment already exits in fragmentManager use it
if (oldFragment != null) {
fragment = oldFragment;
}


fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName());


fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);


fragmentTransaction.commit();
}

我也有同样的问题。我想到了一个简单的解决办法。使用片段 .replace代替片段 .add。替换片段与添加片段做同样的事情,然后手动删除片段。

getFragmentManager().beginTransaction().replace(fragment).commit();

而不是

getFragmentManager().beginTransaction().add(fragment).commit();

我遇到了 onBackPress 的问题。我不想回到旧的片段。

这样我就可以从片段管理器中删除旧的片段:

FragmentManager fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

你也可以像下面这样使用 if 块:

FragmentManager fm = getSupportFragmentManager();


if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

在 Kotlin

  val fragList  = f.supportFragmentManager.fragments
for (fragment in fragList) {
f.supportFragmentManager.beginTransaction().remove(fragment).commit()
}

我正面临着同样的错误,几乎没有视图,所以我设置了还原视图的可见性为 GONE。这种方法解决了我的魅力问题。

<View>.setVisibility(View.GONE);