当序列中的所有 fragment 都添加到后台堆栈时,Popbackstack 工作正常,但当其中一个事务未添加到后台堆栈时,Popbackstack 无法正常工作。
这是我的导航:
1.替换 fragment 以加载主页 fragment 。此交易未添加到后台。
替换 fragment 以加载登录 fragment 。此事务已添加到后台堆栈。
3.替换 fragment 以加载登录 fragment 。此事务未添加到后台堆栈。
现在,当我按下后退按钮时,一旦没有任何反应。而理想情况下,它应该从登录 fragment 转到主 fragment 。 这是我在主要 Activity 中的 onbackpressed 方法:
@Override public void onBackPressed() { if(getSupportFragmentManager().getBackStackEntryCount()>0) { FragmentManager.BackStackEntry backStackEntry = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1); String str = backStackEntry.getName(); FragmentManager fm=getSupportFragmentManager(); //getSupportFragmentManager().popBackStackImmediate(); fm.popBackStack(str, FragmentManager.POP_BACK_STACK_INCLUSIVE); } else { super.onBackPressed(); } }
最佳答案
popBackstack
仅“弹出”后台堆栈中的内容。
由于在按返回时将 LoginFragment 替换为 LoggedInFragment 时尚未添加事务:
- LoggedInFragment 仍然存在,
- 弹出 LogInFragment
- 显示 HomeFragment
但是因为LoggedInFragment是在HomeFragment之后添加的,所以HomeFragment显示在它的下面。所以您看不到它被 LoggedInFragment 隐藏了。
一种解决方案是在用 LoggedInFragment 替换 LogInFragment 时将事务添加到返回堆栈。
然后在 onBackPressed
中测试当前 fragment 是否为 LoggedInFragment。如果是这种情况,您将返回堆栈弹出到 HomeFragment(不包括在内)。这样,LoggedInFragment 和 LogInFragment 都会弹出。
编辑
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment_container);
// If there is something in the back stack AND the current fragment is the LoggedInFragment
if (manager.getBackStackEntryCount() > 0
&& fragment instanceof LoggedInFragment) {
manager.popBackStack(HomeFragment.class.getSimpleName(), 0);
} else {
super.onBackPressed();
}
}
为了按名称检索 HomeFragment,您需要在用 HomeFragment 替换当前 fragment 时标记您的事务。通常我用 fragment 的类简单名称标记所有事务,这样我就可以重试任何 fragment :
transaction.replace(R.id.my_fragment_container, fragment, fragment.getClass().getSimpleName());
关于android - popBackStackImmediate 在当前 fragment 事务未添加到后台堆栈时不显示 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278497/