我正在学习如何在机器人中使用 Fragment。 我试图删除旧的 fragment时,新的 fragment正在呼叫机器人。
Fragment
fragment
您需要找到现有片段的引用,并使用下面的代码删除该片段。您需要使用一个标记 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。替换片段与添加片段做同样的事情,然后手动删除片段。
.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);