【问题标题】:FragmentTransaction hide() upon Activity recreation(config change/etc)Activity 重新创建时的 FragmentTransaction hide()(配置更改/等)
【发布时间】:2016-10-11 00:41:33
【问题描述】:

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

它将所有片段重新添加到后台堆栈中,因此之前隐藏的片段变得可见。例如)片段 A(隐藏)、B(显示)、C(隐藏)、D(隐藏)在后堆栈中。例如,当我旋转时,它会在加载 A、B 和 C 后在顶部显示 Fragment 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 类中。 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();
    }
}

【问题讨论】:

  • 为什么要隐藏片段而不是添加/删除它们?
  • 我进行了编辑以提供问题的更多背景信息。当我添加/删除/替换时,片段将经历像 onCreateView 这样的生命周期来重建自身。我可以通过生命周期方法,但我希望片段具有与以前相同的视图状态;例如回收站视图滚动位置等。
  • 您应该将片段的状态保存在 onSaveInstanceState 中,包括 recyclerview 滚动位置,然后根据 onCreate 或 onCreateView 中的捆绑包设置滚动位置
  • 您是否确保不重新添加片段?我可以在活动中看到您的 onCreate 吗?您是否正在检查 savedInstanceStateBundle 是否存在,如果存在则不重新创建片段?您是否将交易添加到后台堆栈?

标签: android android-fragments fragmenttransaction fragmentmanager


【解决方案1】:

在您展示的应用程序中,它们可能正在根据容器 ID 删除/添加片段。同时还使用 onSaveInstanceState 和 onCreate 或 onCreateView 中的 savedInstanceState 包维护片段状态

【讨论】:

  • onSaveInstanceState() 仅在调用 replace() 时不会被调用。我错过了什么吗?
【解决方案2】:

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

感谢@Scrotos 聊天。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多