在配置更改时更改 DialogFragment 中的布局和保存状态

Change layout and save state in DialogFragment on configuration changed

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

还有一个问题,方向改变。需要:

  1. 如果需要,保存对话框状态(AlertDialog 中自定义视图中的视图状态)。
  2. 更改警报对话框的布局和大小;

当 activity 在旋转时重新创建一切都很好,实现 AlertDialog.onSaveInstanceState()AlertDialog.onRestoreInstanceState() 就足够了,DialogFragment 将完成剩下的工作。

问题是当 activity NOT 重新创建方向更改时,但仍然需要执行上述两个步骤。 完美的解决方案是将该逻辑封装在派生的 AlertDialog 或 DialogFragment 中,这样使用该对话框的用户就不会担心任何事情。


到目前为止我已经尝试了什么。

  1. 简单的方法。不要重新创建对话框。

我们可以发现,在我们的 AlertDialog 或 DialogFragment.onConfigurationChanged() 中实施 ViewTreeObserver.OnGlobalLayoutListener() 时方向发生了变化。此时此刻,我正在尝试保存状态、重新填充视图并调用 AlertDialog.setView()。它不工作。状态正在保存,对话框大小正在改变,但视图仍然是旧视图。不知道为什么,可能是在对话框显示时不允许重新填充视图。

  1. 关闭对话框,重新创建,再次显示。

我正在尝试做类似的事情。在 DialogFragment 中:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    dismiss();
    show(getFragmentManager(), getTag());
}

所以隐藏,重新创建对话框,再次显示。 而且有效!

但是。如果我:

  1. 打开对话框
  2. 转到主屏幕(隐藏应用程序)
  3. onSaveInstanceState Activity 和 DialogFragment 的方法被调用。
  4. 旋转设备
  5. 恢复应用程序
  6. DialogFragment.onConfigurationChanged() 将被调用,如果我这次尝试在这里调用 dismiss()show(),我将收到 "Can not perform this action after onSaveInstanceState" 因为此时 activity 实际上并没有恢复。

而且我看不到做类似事情的合适地方。


那么,还有什么可以尝试的吗?

如果我正确理解了你的问题,你想要 landscape/portrait 方向有不同的布局吗? 如果是,并且您的 activity 由于清单 configChanges = orientation 而未重新创建,您有 onConfigurationChanged 回调来处理任何事情,即您的布局更改。

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

因此,在第一次创建对话框时设置一些内容视图,它只是一般容器,如 FrameLayout

然后创建方法,用您想要显示的所有内容填充您的内部布局,并将其动态添加到您的容器中 FrameLayout。当方向改变时...删除内部布局,用不同的方向再次膨胀它并再次添加。