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

Android 清除片段堆栈以转到另一个片段堆栈,android,android-fragments,Android,Android Fragments,我一次又一次地打开包含列表的fragments,然后,最终,我要清除fragments堆栈,以在到达包含列表的那些片段的末尾时打开一个新的fragments 我不知道我是否清楚,所以我现在做的是: private final BroadcastReceiver onReceiveLaunchIncident = new BroadcastReceiver() { @Override public void onReceive(Context context, I

我一次又一次地打开包含列表的
fragments
,然后,最终,我要清除
fragments
堆栈,以在到达包含列表的那些片段的末尾时打开一个新的
fragments

我不知道我是否清楚,所以我现在做的是:

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

这个怎么样:

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"));
    }
};
private final BroadcastReceiver onReceiveLaunchIncident=new BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
List fragments=getSupportFragmentManager().getFragments();
if(片段!=null){
for(片段:片段){
getSupportFragmentManager().beginTransaction().remove(frag.commit();
}
}
//从抽屉布局中选择正确的项目
选择项目(抽屉列表索引(“巡逻”);
}
};

由于添加第一个片段的方式,您遇到了这个问题。如果您认为backbackback只是一个事务记录,而不是片段本身,那么您可以看到为什么总是留下片段a。当您添加片段a时,我猜您没有将第一个事务设置为包含在backbackback中。如果是这种情况,堆栈中的第一个条目是从A到B的更改,当您执行上面的pop代码时,该更改将被撤消。您的问题应该通过在事务期间使用调用将第一个条目添加到backbackback来解决

下面的代码示例使用事务替换,这将允许您仍然不向上面建议的后堆栈添加片段A。replace调用不包括在后堆栈中,因此只会将片段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的闪烁。

除非你到达片段列表的末尾,否则我的应用程序返回到该片段将不是正确的行为。。。是否有办法在backback的末尾添加片段E,然后清除堆栈,保留最后添加的片段?您可以做的是在
selectItem(drawerList.indexOf(“Patrol”))中执行弹出操作调用change to fragment E使事务成为替换,并且不将该事务设置为添加到后堆栈中。这应该会将所有内容弹出到A,然后用E替换A。我不确定我是否在这里理解您的意思,我添加了我在问题中使用的selectItem()方法…您不应该发布延迟,也不应该提交声明损失,除非您确定您需要这样做。我做了一个小小的编辑,它应该会像预期的那样工作。如果我不把commitAllowingStateLoss放在一起,我不知何故会崩溃。这并不经常追加,但这可以避免它发生。。。我也做了postDelayed,因为汉堡包动画谁flickr否则…我将尝试制作一个没有postDelayed的变体,看看这是否有效如果你这样做会发生什么?
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();
}