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