美文网首页
AlertDialog不能全屏?

AlertDialog不能全屏?

作者: cqj | 来源:发表于2023-10-07 15:42 被阅读0次

近期在用AlertDialog.Builder创建Dialog的时候发现全屏布局的xml失效了,但用Dialog的时候发现同样的xml可以全屏,瞬间emo

为什么,差异在哪??跟踪源码发现AlertDialog.Builder setView是将View保存在AlertController.AlertParams的成员变量里,当show的时候,执行onCreate生命周期--->mAlert.installContent()->setupView()->setupCustomContent(customPanel)->

final FrameLayout custom = (FrameLayout)mWindow.findViewById(R.id.custom);

custom.addView(customView, new LayoutParams(MATCH_PARENT, MATCH_PARENT));

预先设置的View会保存到R.id.custom容器里,R.id.custom的高度竟然是wrap_content??

图1

而普通Dialog的setContentView插入的容器是ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);而ID_ANDROID_CONTENT的容器高度是0dp,但layout_weight =1,也就是充满剩余布局,当没有title等控件时,也就是全屏的大小

图2

那为什么父布局的大小会影响xml全屏的显示呢??当父布局大小为wrap_content,子视图的大小会match_parent,此时子布局的测量模式为AT_MOST,大小为父布局大小,当执行子视图大小测量时onMeasure方法,一般View会覆盖该方法,以RelativeLayout为例,会计算每个实际大小,所以这时候就不会充满全屏了。

有什么解决办法吗?在xml布局里增加一个View让其高度match_parent,当执行该子View的测量时,由于onMeasure方法没有被重写,故该View的高度会采用父容器的高度,父容器的临时高度是其父容器高度也就是全屏高度。

这一点也验证了为什么自定义View要重写onMeasure方法,不然大小会充满父布局!!

相关文章

网友评论

      本文标题:AlertDialog不能全屏?

      本文链接:https://www.haomeiwen.com/subject/sbcvbdtx.html