Android 更改布局并在配置更改时在DialogFragment中保存状态

Android 更改布局并在配置更改时在DialogFragment中保存状态,android,android-alertdialog,android-dialogfragment,savestate,Android,Android Alertdialog,Android Dialogfragment,Savestate,我有一个DialogFragment,它拥有一个自定义视图的自定义AlertDialog 还有一个问题,关于方向的改变。需要: 如果需要,保存对话框状态(AlertDialog中自定义视图中的视图状态) 更改警报对话框的布局及其大小 在rotate上重新创建活动时,一切正常,只需实现AlertDialog.onSaveInstanceState()和AlertDialog.onRestoreInstanceState()和DialogFragment即可 问题是当活动不是在方向改变时重新创建时,

我有一个DialogFragment,它拥有一个自定义视图的自定义AlertDialog

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

  • 如果需要,保存对话框状态(AlertDialog中自定义视图中的视图状态)
  • 更改警报对话框的布局及其大小 在rotate上重新创建活动时,一切正常,只需实现
    AlertDialog.onSaveInstanceState()
    AlertDialog.onRestoreInstanceState()
    和DialogFragment即可

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


    到目前为止我都试过了

  • 简单的方法。不要重新创建对话框
  • 我们可以在AlertDialog或DialogFragment.OnConfiguration changed()中发现方向已更改,可以在AlertDialog中实现
    ViewTreeObserver.OnGlobalYoutListener()
    。此时,我正试图保存状态,重新展开视图并调用
    AlertDialog.setView()
    。它不起作用了。状态正在保存,对话框大小正在更改,但视图仍保持旧视图。我不知道为什么,可能在显示对话框时不允许重新展开视图

  • 关闭对话框,重新创建,再次显示
  • 我正试着做那样的事。在DialogFragment中:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        dismiss();
        show(getFragmentManager(), getTag());
    }
    
    所以隐藏,重新创建对话框,再次显示。而且它有效

    但是。如果我:

  • 打开对话框
  • 转到主屏幕(隐藏应用程序)
  • 调用Activity和DialogFragment的方法
  • 旋转装置
  • 还原应用程序
  • 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()
    ,而是删除子项并将我的内容重新格式化到现有容器中,谢谢!