android-fragments 从片段管理器中删除旧片段

bmvo0sr5  于 2022-11-14  发布在  Android
关注(0)|答案(7)|浏览(137)

我正在学习如何在android中使用Fragment。当新的fragment在android中调用时,我正在尝试删除旧的fragment

flmtquvp

flmtquvp1#

您需要找到现有片段的引用,并使用以下代码删除该片段。您需要使用一个标记(如“TAG_FRAGMENT”)添加/提交片段。

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

就是这样。

bbmckpt7

bbmckpt72#

我也遇到了同样的问题来删除旧的碎片。我最终清除了包含碎片的布局。

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

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

dm7nw8vv

dm7nw8vv3#

我也遇到了同样的问题。我想出了一个简单的解决方案。使用片段.replace而不是片段.add。替换片段做的事情和添加片段然后手动删除它是一样的。

getFragmentManager().beginTransaction().replace(fragment).commit();

而不是

getFragmentManager().beginTransaction().add(fragment).commit();
ryevplcw

ryevplcw4#

也许你的示例老片段,它是保持一个引用.
如果使用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();
}
jw5wzhpr

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

bttbmeg06#

在Kotlin

val fragList  = f.supportFragmentManager.fragments
    for (fragment in fragList) {
        f.supportFragmentManager.beginTransaction().remove(fragment).commit()
    }
emeijp43

emeijp437#

我遇到了同样的错误,视图很少,所以我把还原视图的可见性设置为消失。这个方法解决了我的问题,因为魅力。

<View>.setVisibility(View.GONE);

相关问题