我有一个DialogFragment,它包含自定义AlertDialog和自定义视图。
在方向改变方面存在问题。这是必要的:
当在旋转时重新创建活动时,一切都很好,它足以实现AlertDialog.onSaveInstanceState()
和AlertDialog.onRestoreInstanceState()
,而DialogFragment将完成其余的工作。
问题是当活动不重新定位方向更改时,但仍然需要执行上述两个步骤。完美的解决方案是将该逻辑封装在内部派生的AlertDialog或DialogFragment,因此使用该对话框的用户不会担心任何事情。
到目前为止我尝试过的。
我们可以发现,在我的AlertDialog或ViewTreeObserver.OnGlobalLayoutListener()
中实施DialogFragment.onConfigurationChanged()
时,方向已更改。此时,我正试图保存状态,重新定位视图并调用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"
,因为此时活动实际上并未恢复。 我认为没有合适的地方做这样的事情。
那么,还有其他的尝试吗?
答案 0 :(得分:1)
如果我正确理解您的问题,您想要为横向/纵向方向设置不同的布局吗?
如果是,并且由于显示configChanges = orientation
您的活动未重新创建,则您有onConfigurationChanged
回调来处理任何内容,即您的布局更改。
在创建自定义对话框时,您可能正在使用setContentView(View view)
。
因此,在第一次创建对话框时,设置一些内容视图,这只是FrameLayout
等常规容器。
然后创建方法,使用您想要显示的所有内容为您的内部布局充气,并将其动态添加到容器FrameLayout
。当方向改变时......删除内部布局,再次以不同的方向对其进行充气,然后再次添加。