我在 Activity.onCreate() 中添加 fragment (主 fragment ),而不将其添加到后台堆栈,我使用 FragmentTransaction.replace() 来完成。之后,我使用 FragmentTransaction.replace() 添加每个下一个 fragment 并将其添加到 backstack。

我有一个功能可以清除后台堆栈,让主 fragment 可见,为此我使用 FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

如果我只向 backstack 添加 1 个 fragment 然后清除 backstack 它工作正常,但是如果我添加多个然后在清除 backstack 后屏幕是空白的,尽管主 fragment 接收 onStart() 和 onResume() 并认为它是可见的,它不会收到 onPause(), onStop() 直到我再次添加另一个 fragment 或离开应用程序。
此外,如果我 popBackstack() 一个一个(在用户操作上)它工作正常,但如果我 popBackstack() 在循环中(一次弹出所有 fragment )它不起作用。

这是代码:

public void changeFragment(BaseFragment fragment, boolean addToBackStack, boolean preventDuplicate) {
    Fragment topFragment = getSupportFragmentManager().findFragmentById(fragmentContainer.getId());
    if (preventDuplicate && topFragment != null && fragment.getClass().equals(topFragment.getClass())) {
        //Prevent adding same fragment
        return;
    }

    FragmentTransaction transaction =
            fragmentManager
                    .beginTransaction()
                    .replace(fragmentContainer.getId(), fragment);

    if (addToBackStack) {
        transaction.addToBackStack(null);
    }

    transaction.commit();
}

public void goToHome() {
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

最佳答案

FragmentTransaction 有一个新方法(在 25.1.0 版中添加),请参阅: https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#setAllowOptimization(boolean)

尝试在 FragmentTransaction 上设置它,同时:

final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setAllowOptimization(true);
transaction.replace(...);

这为我解决了这个问题。

归功于:https://stackoverflow.com/a/42597413/5310016

关于android - popbackstack 后 fragment 不可见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42484358/

10-10 08:01