android - popBackStackImmediate 在当前 fragment 事务未添加到后台堆栈时不显示 fragment

标签 android android-fragments android-fragmentactivity fragment-backstack fragmentmanager

当序列中的所有 fragment 都添加到后台堆栈时,Popbackstack 工作正常,但当其中一个事务未添加到后台堆栈时,Popbackstack 无法正常工作。

这是我的导航:

1.替换 fragment 以加载主页 fragment 。此交易未添加到后台。

  1. 替换 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/

相关文章:

android - Phonegap 地理定位不起作用

javascript - 背景图像大于视口(viewport)

java - fragment 和 fragmentActivity 的 Android 问题

android - 未注释的参数覆盖@NonNull 参数

android - 在开发和生产上切换 GCM 客户端

android - SwitchPreferenceCompat 添加到 XML 与以编程方式创建时看起来不同

android - 多功能 Instant App 崩溃问题

java - 如何在同一方法中返回fragment和fragmentactivity?

java - Android, fragment 事务替换的奇怪行为()

android - 如何将 rest api 列表传递给 android 中的 fragment Activity