1

我有一个DialogFragment,它包含具有自定义视图的自定义AlertDialog。在配置更改时更改布局并保存DialogFragment中的状态

并且存在定位变化的问题。它需要:

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

在活动上旋转一切重建是好的,但它足以实现​​和AlertDialog.onRestoreInstanceState()和DialogFragment将做休息。

问题是当活动是不是重新定位改变,但它仍然需要执行上述两个步骤。完美的解决方案是将派生的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方法和DialogFragment被调用。
  4. 旋转装置
  5. 恢复应用
  6. DialogFragment.onConfigurationChanged()将被调用,如果我尝试在这里呼吁dismiss()show()这个时候,我会收到"Can not perform this action after onSaveInstanceState",因为在这一刻活动实际上并没有恢复。

而我没有看到正确的地方做这样的事情。


那么,还有其他的事情要尝试吗?

+0

什么原因为您的活动使用'configChanges = orientation'? –

回答

1

如果我正确理解你的问题,你想拥有不同的风景/人像取向布局? 如果是,并且您的活动因清单而未重新创建,则您有onConfigurationChanged回调来处理任何事情,即您的布局更改。

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

因此,虽然创建对话框首次设置一些内容视图这是只喜欢FrameLayout一般容器等

然后创建方法,它与您要OT节目,并将其添加的所有内容充气内部布局动态到您的容器FrameLayout。当方向更改...删除内部布局时,再次用不同方向对其进行充气并再次添加。

+0

你说得对,为什么它不能重新创建。目前,我没有使用'setContentView(View view)',因为我使用在DialogFragment.createDialog()中创建的自定义'AlertDialog',所以'DialogFragment'只是作为'AlertDialog'的行为包装处理保存状态,所有的逻辑都在'AlertDialog'中。但我会尝试你的建议,并尝试使用'setContentView(View view)'而不是使用'AlertDialog'。 – nicolausYes

+0

但是,如果你使用自定义的AleryDialog,你是如何设置它的自定义布局? –

+0

现在我在初始化阶段为派生的AlertDialog类中的视图充气并调用AlertDialog.setView()。然后在轮换时,我试图做同样的操作(再次查看并再次调用'AlertDialog.setView()')。我会尽量不要再次调用AlertDialog.setView(),但删除子项并将我的内容重新添加到现有容器中,谢谢! – nicolausYes