Android 更改布局并在配置更改时在DialogFragment中保存状态
我有一个DialogFragment,它拥有一个自定义视图的自定义AlertDialog 还有一个问题,关于方向的改变。需要:Android 更改布局并在配置更改时在DialogFragment中保存状态,android,android-alertdialog,android-dialogfragment,savestate,Android,Android Alertdialog,Android Dialogfragment,Savestate,我有一个DialogFragment,它拥有一个自定义视图的自定义AlertDialog 还有一个问题,关于方向的改变。需要: 如果需要,保存对话框状态(AlertDialog中自定义视图中的视图状态) 更改警报对话框的布局及其大小 在rotate上重新创建活动时,一切正常,只需实现AlertDialog.onSaveInstanceState()和AlertDialog.onRestoreInstanceState()和DialogFragment即可 问题是当活动不是在方向改变时重新创建时,
AlertDialog.onSaveInstanceState()
和AlertDialog.onRestoreInstanceState()
和DialogFragment即可
问题是当活动不是在方向改变时重新创建时,仍然需要执行上述两个步骤。完美的解决方案是将该逻辑封装在派生的AlertDialog或DialogFragment中,这样将使用该对话框的用户就不会担心任何事情
到目前为止我都试过了
ViewTreeObserver.OnGlobalYoutListener()
。此时,我正试图保存状态,重新展开视图并调用AlertDialog.setView()
。它不起作用了。状态正在保存,对话框大小正在更改,但视图仍保持旧视图。我不知道为什么,可能在显示对话框时不允许重新展开视图
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dismiss();
show(getFragmentManager(), getTag());
}
所以隐藏,重新创建对话框,再次显示。而且它有效
但是。如果我:
DialogFragment.onConfigurationChanged()
将被调用,如果我这次尝试在这里调用discouse()
或show()
,我将收到“在onSaveInstanceState之后无法执行此操作”
,因为此时活动实际上没有恢复李>
我看不到合适的地方做这样的事情
那么,还有什么可以尝试的吗?如果我正确理解您的问题,您希望横向/纵向的布局不同吗? 如果是,并且您的活动由于清单
configChanges=orientation
而没有重新创建,则您有onConfigurationChanged
回调来处理任何内容,例如布局更改
创建自定义对话框时,您可能正在使用setContentView(视图视图)
因此,在第一次创建对话框时,请设置一些内容视图,这是唯一的常规容器,如FrameLayout
等
然后创建一个方法,该方法使用您想要显示的所有内容扩展您的内部布局,并将其动态添加到您的容器
FrameLayout
。当方向改变时。。。删除内部布局,用不同的方向再次充气,然后再次添加。您使用configChanges=orientation
进行活动的原因是什么?您说得对,为什么不重新创建。目前,我没有使用setContentView(View View视图)
,因为我使用的是在DialogFragment.createDialog()
中创建的自定义AlertDialog
,所以DialogFragment
只是充当AlertDialog
的包装器来处理保存状态,所有逻辑都在AlertDialog
中。但我会尝试您的建议,并尝试使用setContentView(View View)
而不是使用AlertDialog
。但是如果您使用自定义AleryDialog,您如何设置它的自定义布局?现在,我正在扩展派生AlertDialog
类中的视图,并调用AlertDialog.setView()
在初始化阶段。然后在轮换时,我尝试着做同样的事情(重新调整视图并再次调用AlertDialog.setView()
)。我将尝试不再调用AlertDialog.setView()
,而是删除子项并将我的内容重新格式化到现有容器中,谢谢!