如何从backStack中删除堆栈?

时间:2019-07-24 16:00:18

标签: java android android-fragments back-stack fragment-backstack

我有一个活动,管理4个片段。我想,当我向backStack添加一个片段时,它会从backStack中删除相同的片段(如果有的话),以便当时在backstack中只有一个片段。如果用户从A到B再到C,然后又回到B,则后堆栈看起来像:C,A而不是C,B,A。

我一直在寻找解决问题的方法,发现很多人都遇到了同样的问题。建议的解决方案是使用popBackStackImmediate(String, int),但是最大的问题是此函数会删除已弹出的堆栈顶部的堆栈。此行为似乎是不可更改的。因此,我想到了一个解决方案,该方案包括使用for循环在BackStack上运行,当片段的标记与BackStack中的片段的标记匹配时,将删除堆栈。我认为此堆栈是一个fragmentTransaction,所以我想知道是否可以删除整个Fragment Transaction,以及如何删除?

private void setFragment(Fragment fragment) {
        FragmentManager manager = getSupportFragmentManager();
        String tagFromFragAddedToBackStack = getCurrentFragment().getTag();
        String fragmentTag = fragment.getClass().getName();
        String fragFromBackStackTag;
        FragmentTransaction fragTransFromBackStack;
        int i;

        for ( i = 0; i < manager.getBackStackEntryCount() ; i++){

                fragFromBackStackTag = manager.getBackStackEntryAt(i).getName();
                fragTransFromBackStack = (FragmentTransaction) manager.getBackStackEntryAt(i);
                fragFromBackStack = manager.findFragmentByTag(fragFromBackStackTag);

                if (fragFromBackStackTag == fragmentTag){

              // Here, I would like to delete the stack which matches 

                }
            }
            FragmentTransaction ft = manager.beginTransaction();
            ft.replace(R.id.main_frame, fragment, fragmentTag);
            ft.addToBackStack(tagFromFragAddedToBackStack); 
            ft.commit();
    }

  private Fragment getCurrentFragment(){
        if (homeFragment.isVisible()){
            return homeFragment;
        }
        else if (autonomyFragment.isVisible()) {
            return autonomyFragment;
        }
        else if (shopFragment.isVisible()) {
            return shopFragment;
        }
        else if (accountFragment.isVisible()) {
            return accountFragment;
        }
        else
            return null;
    }

0 个答案:

没有答案