我从支持库开发了一个带有Fragments的应用程序。我只使用一个Activity。 布局包括具有折叠工具栏布局和导航视图的协调器布局。 选择导航项时,我在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
}
因此,在选择新项目时,我会清除后台堆栈(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();
}
答案 0 :(得分:1)
发布作为未来参考的答案。
我认为你的问题是popBackStack()没有立竿见影的效果,但计划在下一个事件循环传递中运行,在你的情况下为时已晚并产生不良影响。应该有什么帮助迫使片段管理器事务完成。
可以通过致电executePendingTransactions()或在此特定情况下通过popBackStackImmediate()
来实现