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