清除片段堆栈以转到另一个

时间:2016-07-15 20:56:14

标签: android android-fragments

我一遍又一遍地打开包含列表的fragments,然后,最终,我想清除fragment堆栈,以便在我到达之后打开一个新的Fragment包含列表的那些片段的结尾。

我不知道自己是否清楚,所以这就是我目前正在做的事情:

private final BroadcastReceiver onReceiveLaunchIncident = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
            // Select the correct item from the DrawerLayout
            selectItem(drawerList.indexOf("Patrol"));

        }
    };

目前我输入BroadcastReceiver

时会这样

片段D ---> 片段A ---> 片段E

我想要这样:

片段D ---> 片段E

enter image description here

private void selectItem(final int position) {
    addToDrawerIfNotExist(position);

    if (mDrawerListChild.getCheckedItemPosition() == position) {
        Log.i(TAG, "Same position selected in drawer");
    }

    mDrawerListChild.setItemChecked(position, true);
    mDrawerLayout.closeDrawer(mDrawerLinear);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
            BackHandledFragment fragment = fragmentListString.get(fragmentList.get(position));

            ft.replace(R.id.content_frame, fragment, fragment.getTagText())
                    .commitAllowingStateLoss();
        }
    }, 300);
}

2 个答案:

答案 0 :(得分:2)

由于您添加第一个片段的方式,您遇到此问题。如果你认为backstack只是一个事务记录而不是片段本身你可以看到为什么你总是留下片段A。当你添加片段A我猜你没有设置第一个事务要包括在内在后台。如果是这种情况,您在堆栈中的第一个条目是从A到B的更改,当您执行上面的弹出代码时,该更改将被撤消。您应该通过在交易过程中使用addToBackStack调用添加第一个条目来解决您的问题。

下面的代码示例使用事务替换,这将允许您仍然不按照上面的建议将片段A添加到后台堆栈。替换调用不包含在后向堆栈中,因此只会将片段A替换为E,同时将后端堆栈留空。

修改

private void selectItem(final int position) {
    addToDrawerIfNotExist(position);

    if (mDrawerListChild.getCheckedItemPosition() == position) {
        Log.i(TAG, "Same position selected in drawer");
    }

    mDrawerListChild.setItemChecked(position, true);
    mDrawerLayout.closeDrawer(mDrawerLinear);

    FragmentTransaction ft =  getSupportFragmentManager().beginTransaction();
    BackHandledFragment fragment = fragmentListString.get(fragmentList.get(position));

    ft.replace(R.id.content_frame, fragment, fragment.getTagText()).commit();
}

编辑2:删除了淡入淡出动画,因为这会导致闪烁,在转换到片段E之前,您会在一瞬间看到片段A。

答案 1 :(得分:1)

这个怎么样:

private final BroadcastReceiver onReceiveLaunchIncident = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                getSupportFragmentManager().beginTransaction().remove(frag).commit(); 
            }
        }
        // Select the correct item from the DrawerLayout
        selectItem(drawerList.indexOf("Patrol"));
    }
};