我正在尝试学习如何在android中使用Fragment
s。
当新的fragment
在Android中调用时,我试图删除旧的fragment
。
答案 0 :(得分:136)
您需要找到现有Fragment的参考,并使用下面的代码删除该片段。您需要使用一个标签ex添加/提交片段。 " TAG_FRAGMENT"
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
就是这样。
答案 1 :(得分:14)
如果要将片段替换为另一片段,首先应该动态添加片段。用XML硬编码的片段无法替换。
// 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();
请参阅此帖:Replacing a fragment with another fragment inside activity group
答案 2 :(得分:8)
我有同样的问题要删除旧片段。我最终清除了包含片段的布局。
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...
我不知道这是否会造成泄漏,但它对我有用。
答案 3 :(得分:1)
可能你是实例旧片段,它保留了一个参考。请参阅这篇有趣的文章Memory leaks in Android — identify, treat and avoid
如果使用addToBackStack,则会保留对实例片段的引用,以避免垃圾收集器擦除实例。该实例保留在片段管理器的片段列表中。您可以通过
查看列表 ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
下一个代码不是最好的解决方案(因为不要删除旧的片段实例以避免内存泄漏)但是从fragmentManger片段列表中删除旧片段
int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);
你不能删除arrayList中的条目,因为看起来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();
}
答案 4 :(得分:1)
我有同样的问题。我想出了一个简单的解决方案。使用片段.replace
而不是片段.add
。替换片段的操作与添加片段的操作相同,然后手动将其删除。
getFragmentManager().beginTransaction().replace(fragment).commit();
代替
getFragmentManager().beginTransaction().add(fragment).commit();