从片段pipe理器中移除旧的片段

我试图学习如何在android中使用Fragment 。 我试图删除旧的fragment当新的fragment在Android调用。

你需要find现有片段的参考,并使用下面的代码删除该片段。 您需要使用一个标记ex添加/提交片段。 “TAG_FRAGMENT”。

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

这就对了。

如果你想用另一个replace一个片段,你应该首先dynamic地添加它们。 硬编码为XML的片段不能被replace。

 // Create new fragment and transaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); 

参考这篇文章: 用活动组内的另一个片段replace一个片段

参考1: 以编程方式replace片段

我有同样的问题,以消除旧的碎片。 我最终清理了包含碎片的布局。

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

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

可能你实例老的片段它保持参考。 看到这个有趣的文章在Android的内存泄漏 – 识别,治疗和避免

如果你使用addToBackStack,这将保持实例片段的引用,避免垃圾收集器擦除实例。 实例保留在片段pipe理器中的片段列表中。 你可以看到列表

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

下一个代码不是最好的解决scheme(因为不要删除旧的片段实例,以避免内存泄漏),但从fragmentManger片段列表中删除旧的片段

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

您不能删除arrayList中的条目,因为appragly FragmentManager与索引ArrayList一起工作以获取片段。

我通常使用这个代码来处理fragmentManager

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