我正在尝试学习在安卓中如何使用 Fragment
。
当新的 Fragment
调用时,我正在尝试移除旧的 Fragment
。
我正在尝试学习在安卓中如何使用 Fragment
。
当新的 Fragment
调用时,我正在尝试移除旧的 Fragment
。
你需要找到现有Fragment的引用,并使用以下代码删除该fragment。你需要使用一个标签ex. "TAG_FRAGMENT"来添加/提交fragment。
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
就是这样。
我曾经遇到过同样的问题。我想出了一个简单的解决方法。使用代码片段 .replace
而不是代码片段.add
。用替换代码片段的方法实现的效果和添加代码片段然后手动移除它的效果是一样的。
getFragmentManager().beginTransaction().replace(fragment).commit();
而不是
getFragmentManager().beginTransaction().add(fragment).commit();
我曾遇到类似的问题,需要移除旧的片段。最终我清除了包含这些片段的布局。
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...
我不知道这是否会导致泄漏,但对我来说它是有效的。
可能您的应用程序中存在旧的Fragment实例,它会保留一个引用。请参阅这篇有趣的文章:Android内存泄漏-识别、处理和避免
如果您使用了addToBackStack方法,则会保留对该Fragment实例的引用,从而避免垃圾收集器清除该实例。该实例将保留在FragmentManager的Fragment列表中。您可以通过以下代码查看该列表:
ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
下面的代码不是最佳解决方案(因为不会删除旧的Fragment实例以避免内存泄漏),但可以从FragmentManager的Fragment列表中删除旧的Fragment实例:
int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);
您不能从arrayList中删除条目,因为FragmentManager明显使用索引ArrayList来获取fragment。
我通常使用以下代码与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();
}
我在处理返回键(onBackPress)时遇到了碎片(fragment)的问题。我不想返回旧的碎片。
这个解决方案可以帮助我从碎片管理器中删除旧的碎片:
FragmentManager fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
我在几个视图中遇到了同样的错误,所以我将冗余视图的可见性设置为GONE。这种方法解决了我的问题。
<View>.setVisibility(View.GONE);
In Kotlin
val fragList = f.supportFragmentManager.fragments
for (fragment in fragList) {
f.supportFragmentManager.beginTransaction().remove(fragment).commit()
}
fragmentManager.executePendingTransactions()
。 - Toland Hon