我有一个DialogFragment,它包含具有自定义视图的自定义AlertDialog。在配置更改时更改布局并保存DialogFragment中的状态
并且存在定位变化的问题。它需要:
- 如果需要,保存对话状态(在AlertDialog中的自定义视图中的视图状态)。
- 更改警报对话框的布局和大小;
在活动上旋转一切重建是好的,但它足以实现和AlertDialog.onRestoreInstanceState()
和DialogFragment将做休息。
问题是当活动是不是重新定位改变,但它仍然需要执行上述两个步骤。完美的解决方案是将派生的AlertDialog或DialogFragment内部的逻辑封装起来,以便使用该对话的用户不会担心任何事情。
我到目前为止试过的东西。
- 简单的方法。不要重新创建对话框。
我们可以计算出该方向被改变无论是在我们的AlertDialog或DialogFragment.onConfigurationChanged()
实施ViewTreeObserver.OnGlobalLayoutListener()
。此时此刻,我试图挽救国家,重新查找并呼吁AlertDialog.setView()
。它不工作。状态正在保存,对话框大小正在改变,但视图仍然是旧视图。我不知道为什么,也许不允许在对话框显示时重新查看视图。
- 关闭对话框,重新创建,再次显示。
我正在尝试做这样的事情。在DialogFragment中:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dismiss();
show(getFragmentManager(), getTag());
}
因此隐藏,重新创建对话框,再次显示。 它的工作原理!
但是。如果我:
- 打开对话框
- 转到主屏幕(隐藏应用程序)活动的
onSaveInstanceState
方法和DialogFragment被调用。- 旋转装置
- 恢复应用
DialogFragment.onConfigurationChanged()
将被调用,如果我尝试在这里呼吁dismiss()
或show()
这个时候,我会收到"Can not perform this action after onSaveInstanceState"
,因为在这一刻活动实际上并没有恢复。
而我没有看到正确的地方做这样的事情。
那么,还有其他的事情要尝试吗?
什么原因为您的活动使用'configChanges = orientation'? –