我用支持库中的片段开发了一个应用程序。我只使用一种活动。该布局由具有折叠工具栏布局和导航视图的协调器布局组成。在选择导航项时,我在NavigationItemSelectedListener中执行以下操作:
switch (item.getItemId()) {
default:
return false;
case R.id.mainmenu_start:
navi.clear();
navi.navigate(new StartFragment(), R.id.fragment_container);
return true;
// ... More menu entries
}因此,在选择新项时,我清除了Back堆栈(navi.clear()),并将显示的片段替换为新的片段。
我遇到的问题是:“旧”(替换)片段不会被删除/分离。
因此,当我导航到StartFragment,然后导航到另一个片段,然后再选择StartFragment时,onResume会被调用两次:
一次在“旧”/第一次StartFragment,一次在新创建的。
我怎样才能避免这种行为?我要么想重用现有的片段(第一个),要么创建一个新的片段-但是使用这两者会导致大量的问题.
为了研究这种行为,我给了每个片段一个唯一的(增量) ID:当导航到新片段时,会在几个旧片段上调用onResume,但不是所有的片段都被调用。
例如:我总是为导航选择相同的菜单项。这是发生的“事件”,其中的数字表示片段ID (所有片段都是同一个类(StartFragment)):
因此,有时“旧”碎片丢失,并回来晚些。有时还会调用完全不同的片段来调用onResume。(因此,当我在前面打开片段2时,在创建新的片段1.时,也会调用片段2上的onResume。)
表示完备性
导航功能:
public void clear() {
FragmentManager fragmentManager = ((MainActivity)context).getSupportFragmentManager();
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
public void navigate(Fragment fragment, int container, HashMap<String, Pair<String, View>> sharedElements) {
this.hideKeyboard();
FragmentTransaction ft = ((MainActivity)context).getSupportFragmentManager().beginTransaction();
ft.replace(container, fragment);
ft.addToBackStack(null);
ft.commit();
((MainActivity)context).getDrawerLayout().closeDrawers();
}发布于 2016-12-30 06:13:24
张贴作为一个答案,供日后参考。
我认为您的问题是,popBackStack()没有立即生效,而是计划在下一个事件循环pass上运行,在您的情况下,这已经太晚了,并且会产生不想要的效果。应该帮助的是迫使碎片管理器事务不间断地完成。
它可以通过调用executePendingTransactions()或在这种情况下通过popBackStackImmediate()实现。
https://stackoverflow.com/questions/41383642
复制相似问题