更改配置更改后,在DialogFragment中更改布局和保存状态

时间:2015-11-27 21:22:59

标签: android alertdialog android-alertdialog android-dialogfragment savestate

我有一个DialogFragment,它包含自定义AlertDialog和自定义视图。

在方向改变方面存在问题。这是必要的:

  1. 如果需要,保存对话框状态(AlertDialog中自定义视图中的视图状态)。
  2. 更改警告对话框的布局及其大小;
  3. 当在旋转时重新创建活动时,一切都很好,它足以实现AlertDialog.onSaveInstanceState()AlertDialog.onRestoreInstanceState(),而DialogFragment将完成其余的工作。

    问题是当活动重新定位方向更改时,但仍然需要执行上述两个步骤。完美的解决方案是将该逻辑封装在内部派生的AlertDialog或DialogFragment,因此使用该对话框的用户不会担心任何事情。

    到目前为止我尝试过的。

    1. 简单的方法。不要重新创建对话框。
    2. 我们可以发现,在我的AlertDialog或ViewTreeObserver.OnGlobalLayoutListener()中实施DialogFragment.onConfigurationChanged()时,方向已更改。此时,我正试图保存状态,重新定位视图并调用AlertDialog.setView()。它不起作用。状态正在保存,对话框大小正在改变,但视图仍然是旧视图。我不知道为什么,也许在对话框显示时不允许重新填充视图。

      1. 关闭对话框,重新创建,再次显示。
      2. 我试图做那样的事情。在DialogFragment中:

        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
        
            dismiss();
            show(getFragmentManager(), getTag());
        }
        

        然后隐藏,重新创建对话框,再次显示。 它有效!

        但是。如果我:

        1. 打开对话框
        2. 转到主屏幕(隐藏应用程序)
        3. 调用
        4. onSaveInstanceState Activity和DialogFragment方法。
        5. 旋转设备
        6. 还原应用程序
        7. DialogFragment.onConfigurationChanged()将被调用,如果我这次尝试拨打dismiss()show(),我会收到"Can not perform this action after onSaveInstanceState",因为此时活动实际上并未恢复。
        8. 我认为没有合适的地方做这样的事情。

          那么,还有其他的尝试吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您想要为横向/纵向方向设置不同的布局吗? 如果是,并且由于显示configChanges = orientation您的活动未重新创建,则您有onConfigurationChanged回调来处理任何内容,即您的布局更改。

在创建自定义对话框时,您可能正在使用setContentView(View view)

因此,在第一次创建对话框时,设置一些内容视图,这只是FrameLayout等常规容器。

然后创建方法,使用您想要显示的所有内容为您的内部布局充气,并将其动态添加到容器FrameLayout。当方向改变时......删除内部布局,再次以不同的方向对其进行充气,然后再次添加。