在配置更改时更改 DialogFragment 中的布局和保存状态
Change layout and save state in DialogFragment on configuration changed
我有一个 DialogFragment,它包含带有自定义视图的自定义 AlertDialog。
还有一个问题,方向改变。需要:
- 如果需要,保存对话框状态(AlertDialog 中自定义视图中的视图状态)。
- 更改警报对话框的布局和大小;
当 activity 在旋转时重新创建一切都很好,实现 AlertDialog.onSaveInstanceState()
和 AlertDialog.onRestoreInstanceState()
就足够了,DialogFragment 将完成剩下的工作。
问题是当 activity NOT 重新创建方向更改时,但仍然需要执行上述两个步骤。 完美的解决方案是将该逻辑封装在派生的 AlertDialog 或 DialogFragment 中,这样使用该对话框的用户就不会担心任何事情。
到目前为止我已经尝试了什么。
- 简单的方法。不要重新创建对话框。
我们可以发现,在我们的 AlertDialog 或 DialogFragment.onConfigurationChanged()
中实施 ViewTreeObserver.OnGlobalLayoutListener()
时方向发生了变化。此时此刻,我正在尝试保存状态、重新填充视图并调用 AlertDialog.setView()
。它不工作。状态正在保存,对话框大小正在改变,但视图仍然是旧视图。不知道为什么,可能是在对话框显示时不允许重新填充视图。
- 关闭对话框,重新创建,再次显示。
我正在尝试做类似的事情。在 DialogFragment 中:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dismiss();
show(getFragmentManager(), getTag());
}
所以隐藏,重新创建对话框,再次显示。 而且有效!
但是。如果我:
- 打开对话框
- 转到主屏幕(隐藏应用程序)
onSaveInstanceState
Activity 和 DialogFragment 的方法被调用。
- 旋转设备
- 恢复应用程序
DialogFragment.onConfigurationChanged()
将被调用,如果我这次尝试在这里调用 dismiss()
或 show()
,我将收到 "Can not perform this action after onSaveInstanceState"
因为此时 activity 实际上并没有恢复。
而且我看不到做类似事情的合适地方。
那么,还有什么可以尝试的吗?
如果我正确理解了你的问题,你想要 landscape/portrait 方向有不同的布局吗?
如果是,并且您的 activity 由于清单 configChanges = orientation
而未重新创建,您有 onConfigurationChanged
回调来处理任何事情,即您的布局更改。
创建自定义对话框时,您可能正在使用 setContentView(View view)
。
因此,在第一次创建对话框时设置一些内容视图,它只是一般容器,如 FrameLayout
等
然后创建方法,用您想要显示的所有内容填充您的内部布局,并将其动态添加到您的容器中 FrameLayout
。当方向改变时...删除内部布局,用不同的方向再次膨胀它并再次添加。
我有一个 DialogFragment,它包含带有自定义视图的自定义 AlertDialog。
还有一个问题,方向改变。需要:
- 如果需要,保存对话框状态(AlertDialog 中自定义视图中的视图状态)。
- 更改警报对话框的布局和大小;
当 activity 在旋转时重新创建一切都很好,实现 AlertDialog.onSaveInstanceState()
和 AlertDialog.onRestoreInstanceState()
就足够了,DialogFragment 将完成剩下的工作。
问题是当 activity NOT 重新创建方向更改时,但仍然需要执行上述两个步骤。 完美的解决方案是将该逻辑封装在派生的 AlertDialog 或 DialogFragment 中,这样使用该对话框的用户就不会担心任何事情。
到目前为止我已经尝试了什么。
- 简单的方法。不要重新创建对话框。
我们可以发现,在我们的 AlertDialog 或 DialogFragment.onConfigurationChanged()
中实施 ViewTreeObserver.OnGlobalLayoutListener()
时方向发生了变化。此时此刻,我正在尝试保存状态、重新填充视图并调用 AlertDialog.setView()
。它不工作。状态正在保存,对话框大小正在改变,但视图仍然是旧视图。不知道为什么,可能是在对话框显示时不允许重新填充视图。
- 关闭对话框,重新创建,再次显示。
我正在尝试做类似的事情。在 DialogFragment 中:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dismiss();
show(getFragmentManager(), getTag());
}
所以隐藏,重新创建对话框,再次显示。 而且有效!
但是。如果我:
- 打开对话框
- 转到主屏幕(隐藏应用程序)
onSaveInstanceState
Activity 和 DialogFragment 的方法被调用。- 旋转设备
- 恢复应用程序
DialogFragment.onConfigurationChanged()
将被调用,如果我这次尝试在这里调用dismiss()
或show()
,我将收到"Can not perform this action after onSaveInstanceState"
因为此时 activity 实际上并没有恢复。
而且我看不到做类似事情的合适地方。
那么,还有什么可以尝试的吗?
如果我正确理解了你的问题,你想要 landscape/portrait 方向有不同的布局吗?
如果是,并且您的 activity 由于清单 configChanges = orientation
而未重新创建,您有 onConfigurationChanged
回调来处理任何事情,即您的布局更改。
创建自定义对话框时,您可能正在使用 setContentView(View view)
。
因此,在第一次创建对话框时设置一些内容视图,它只是一般容器,如 FrameLayout
等
然后创建方法,用您想要显示的所有内容填充您的内部布局,并将其动态添加到您的容器中 FrameLayout
。当方向改变时...删除内部布局,用不同的方向再次膨胀它并再次添加。