FragmentTransaction 在 Activity 重新创建时隐藏()(配置 change/etc)

FragmentTransaction hide() upon Activity recreation(config change/etc)

当 Activity 在配置更改(旋转等)时重新创建时,FragmentTransaction 的 hide() 不会持续存在。

它重新添加了后台堆栈中的所有片段,因此之前隐藏的片段变得可见。例如)片段 A(隐藏)、B(显示)、C(隐藏)、D(隐藏)在后栈中。例如,当我旋转时,它会在加载 A、B 和 C 后在顶部显示片段 D。

    FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();

    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);

    // Hide all fragments other than the first
    for (int i = 1; i < fragments.length; i++) {
        if (fragments[i] != null) {
            ft.hide(fragments[i]);
        }
    }

    // Display only the first fragment
    if (fragments[0].isAdded()) {
        ft.show(fragments[0]);
    }
    else {
        ft.add(R.id.content_view, fragments[0], fragmentTag);
    }

    ft.commit();

有什么解决方法吗?

[编辑] 添加问题上下文的详细信息。

我想要完成的是拥有底部栏(我的自定义视图,它只是告诉我哪个选项卡被点击),我可以在片段之间切换到它所在的相同状态。

例如 Instagram、Quora 和 Google Plus 应用程序。

[编辑 2 以回应 Scrotos]

这是我的 Presenter class。 loadFirstScreen() 执行上面的片段交易。其他的只是设置内容和注册监听器等初始化。

public void onCreate(Bundle savedInstanceState) {
    mView.initActionbar();
    mView.initViews();
    mModel.getUserProfile().subscribe(new Subscriber<UserProfile>() {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onNext(UserProfile userProfile) {
            mView.initDrawer(userProfile);
        }
    });

    if (savedInstanceState == null) {
        mView.loadFirstScreen();
    }
}

在您展示的应用程序中,它们可能是基于容器 ID 的 removing/adding 片段。同时还使用 onSaveInstanceState 和 onCreate 或 onCreateView

中的 savedInstanceState 包维护片段状态

问题中的代码确实有效。需要注意的一件事是,如果 hidden() 在从配置更改重新创建期间在片段中为真,则不要设置操作栏标题。

感谢@Scrotos 的聊天。