我正在学习如何在android中使用Fragment。当新的fragment在android中调用时,我正在尝试删除旧的fragment。
Fragment
fragment
flmtquvp1#
您需要找到现有片段的引用,并使用以下代码删除该片段。您需要使用一个标记(如“TAG_FRAGMENT”)添加/提交片段。
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); if(fragment != null) getSupportFragmentManager().beginTransaction().remove(fragment).commit();
就是这样。
bbmckpt72#
我也遇到了同样的问题来删除旧的碎片。我最终清除了包含碎片的布局。
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList); layout.removeAllViewsInLayout(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ...
我不知道这是否会造成泄漏,但它对我很有效。
dm7nw8vv3#
我也遇到了同样的问题。我想出了一个简单的解决方案。使用片段.replace而不是片段.add。替换片段做的事情和添加片段然后手动删除它是一样的。
.replace
.add
getFragmentManager().beginTransaction().replace(fragment).commit();
而不是
getFragmentManager().beginTransaction().add(fragment).commit();
ryevplcw4#
也许你的示例老片段,它是保持一个引用.如果使用addToBackStack,这会保留对示例片段的引用,以避免垃圾收集器擦除该示例。该示例仍保留在片段管理器的片段列表中。您可以通过ArrayList<Fragment> fragmentList = fragmentManager.getFragments();下一个代码不是最好的解决方案(因为为了避免内存泄漏,不要删除旧的片段示例),而是从fragmentManger片段列表中删除旧的片段
ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
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(); }
jw5wzhpr5#
我对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); }
bttbmeg06#
在Kotlin
val fragList = f.supportFragmentManager.fragments for (fragment in fragList) { f.supportFragmentManager.beginTransaction().remove(fragment).commit() }
emeijp437#
我遇到了同样的错误,视图很少,所以我把还原视图的可见性设置为消失。这个方法解决了我的问题,因为魅力。
<View>.setVisibility(View.GONE);
7条答案
按热度按时间flmtquvp1#
您需要找到现有片段的引用,并使用以下代码删除该片段。您需要使用一个标记(如“TAG_FRAGMENT”)添加/提交片段。
就是这样。
bbmckpt72#
我也遇到了同样的问题来删除旧的碎片。我最终清除了包含碎片的布局。
我不知道这是否会造成泄漏,但它对我很有效。
dm7nw8vv3#
我也遇到了同样的问题。我想出了一个简单的解决方案。使用片段
.replace
而不是片段.add
。替换片段做的事情和添加片段然后手动删除它是一样的。而不是
ryevplcw4#
也许你的示例老片段,它是保持一个引用.
如果使用addToBackStack,这会保留对示例片段的引用,以避免垃圾收集器擦除该示例。该示例仍保留在片段管理器的片段列表中。您可以通过
ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
下一个代码不是最好的解决方案(因为为了避免内存泄漏,不要删除旧的片段示例),而是从fragmentManger片段列表中删除旧的片段
您无法移除arrayList中的项目,因为FragmentManager显然会使用索引ArrayList来取得片段。
我通常使用这段代码来处理fragmentManager
jw5wzhpr5#
我对onBackPress有意见,我不想回到旧的片段。
这是为我从片段管理器中删除旧片段而工作的:
您也可以像这样使用if区块:
bttbmeg06#
在Kotlin
emeijp437#
我遇到了同样的错误,视图很少,所以我把还原视图的可见性设置为消失。这个方法解决了我的问题,因为魅力。