如何从后退栈中删除相同片段的旧条目?

3

我有四个片段F1,F2,F3,F4。 我正在使用replace方法替换已添加到容器中的现有片段。 其中一些使用addToBackStack(null)添加到backstack中,而另一些使用addToBackStack(tag)添加到backstack中。 现在使用以下方法检查片段是否已经添加或存在于事务中

public static boolean isFragmentInBackstack(final FragmentManager fragmentManager, final String fragmentTagName) {
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) {
        if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) {
            return true;
        }
    }
    return false;
}

使用以下方法替换片段:
 public void setFragmentToContainer(Fragment fragment) {
        final String tag = fragment.getClass().getName();
        if (manager == null) {
            manager = getSupportFragmentManager();
        }
        transaction = manager.beginTransaction();
        if (isFragmentInBackstack(manager, tag)) {
            // Fragment exists, go back to that fragment
            //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow
            manager.popBackStackImmediate(tag,0);
            transaction.remove(fragment);
        } else {
            // Fragment doesn't exist

        }

        transaction.replace(R.id.layout_content, fragment);

        if (fragment instanceof CompanyLevelFragment) {
            //Exit app on back press
        } else {
            if (fragment instanceof F1) {
                transaction.addToBackStack(null);
            } else {
                transaction.addToBackStack(tag);
            }

        }
        transaction.commit();
}
问题: 假设第一次将片段F2添加到事务中,然后更改应用程序中的日期以获取特定日期的更新数据。在获取更新数据后,我调用 setFragmentToContainer(),它将检查后退堆栈中片段的条目,isFragmentInBackstack() 将检查片段是否已经在后退堆栈中,然后调用popBackStackImmediate来删除这些条目。

现在我需要按两次返回按钮才能关闭片段F2。如何从管理器中删除相同片段的早期空白条目?另一个例子是假设我添加F3四次,则必须按四次返回按钮。

请告诉我如何在添加到后退堆栈之前删除相同片段的旧条目?

5个回答

2

在尝试使用 popBackStackImmediate 后,我解决了我的问题。我在 popBackStackImmediate 中添加了 POP_BACK_STACK_INCLUSIVE

 if (isFragmentInBackstack(manager, tag)) {
           manager.popBackStackImmediate(tag,FragmentManager.POP_BACK_STACK_INCLUSIVE);
                } else {
                // Fragment doesn't exist
                // STEP 1 + additional backstack management
            }

2

你好,尝试一下这个,它会帮助你首先检查片段是否为null。

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

嘿,Robby,谢谢你,但我已经解决了我的问题,请看我的答案。 - Reena
好的,我知道,但也许这对你在另一种情况下也有帮助。 - Bipin Bharti

0

使用这个

Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
if(fragment!=null){
   getSupportFragmentManager().beginTransaction().remove(fragment);
}

不改变结果本身 - Reena

0

当您添加新片段时,只需为该片段添加TAG。 使用该TAG,您可以轻松删除旧片段。 例如。

FragmentManager  fm = getSupportFragmentManager();
fm.replace(R.id.container,new MyFragment(),"TAG_FRAGMENT1").commit(); 

使用以下代码来删除旧片段:

Fragment oldFragment = fm.findFragmentByTag("TAG_FRAGMENT1");
if(oldFragment!=null){
        fm.beginTransaction().remove(oldFragment).commit();
    }

在移除旧片段之后,您可以添加新片段。


0

在使用replace()时,您是否没有添加标签?

transaction.replace(R.id.layout_content, fragment);

应该是这样的:

transaction.replace(R.id.layout_content, fragment, "CLASS_NAME");

这里的类名将是标签,传递您要打开的片段类的名称,它可以是任何东西,但在您的情况下是类名,因为在删除时您正在将标记设置为类名。

final String tag = fragment.getClass().getName();

所以在删除时应该像这样

ClassGridFragment gridFragment = (ClassGridFragment) getFragmentManager().findFragmentByTag("CLASS_NAME");
        if (gridFragment != null && gridFragment.isVisible()) {
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.remove(gridFragment);
            ft.commit();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接