如何从backstack中删除相同片段的旧条目?

时间:2016-12-20 08:01:30

标签: android android-fragments

我有四个片段F1,F2,F3,F4。我正在使用replace方法来替换添加到容器中的现有片段。很少有人使用addToBackStack(null)添加到backstack,并且很少添加addToBackStack(tag)。 现在使用以下方法检查片段是否已添加或存在于事务中

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(),它将检查backstack中的片段条目, isFragmentInBackstack()将检查片段是否已经在backstack中,然后调用popBackStackImmediate来删除条目。

我需要按两次后退按钮两次关闭片段F2。如何从经理中删除相同片段的早期空白条目?另一个例子假设如果我将F3添加四次,那么我将不得不按下后退按钮四次。

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

5 个答案:

答案 0 :(得分:1)

在玩popBackStackImmediate之后,我能够解决我的问题。我已将POP_BACK_STACK_INCLUSIVE添加到popBackStackImmediate

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

答案 1 :(得分:0)

使用此

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

答案 2 :(得分: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();
    }

删除旧片段后,您可以添加新片段。

答案 3 :(得分:0)

使用replace()

时是否添加标签?
transaction.replace(R.id.layout_content, fragment);

它应该是这样的: -

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

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

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

答案 4 :(得分:0)

您好试试这个它会帮助您首先检查片段非空。

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