近期在用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??
![](https://img.haomeiwen.com/i27952537/b9106f168f70e852.png)
而普通Dialog的setContentView插入的容器是ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);而ID_ANDROID_CONTENT的容器高度是0dp,但layout_weight =1,也就是充满剩余布局,当没有title等控件时,也就是全屏的大小
![](https://img.haomeiwen.com/i27952537/bb70086c2fe45ec9.png)
那为什么父布局的大小会影响xml全屏的显示呢??当父布局大小为wrap_content,子视图的大小会match_parent,此时子布局的测量模式为AT_MOST,大小为父布局大小,当执行子视图大小测量时onMeasure方法,一般View会覆盖该方法,以RelativeLayout为例,会计算每个实际大小,所以这时候就不会充满全屏了。
有什么解决办法吗?在xml布局里增加一个View让其高度match_parent,当执行该子View的测量时,由于onMeasure方法没有被重写,故该View的高度会采用父容器的高度,父容器的临时高度是其父容器高度也就是全屏高度。
这一点也验证了为什么自定义View要重写onMeasure方法,不然大小会充满父布局!!
网友评论