android - 怎么解释安卓下这种布局?
问题描述

代码片段如图,RelativeLayout定了一个固定的高度。
当LinearLayout内容较少时,Srollview维持wrapcontent的表现并在RelativeLayout中垂直居中。
当LinearLayout内容比较多、高度增大到大于RelativeLayout的高度时,ScrollView的高度不会继续变大,而是维持跟Relativelayout一样高并开始可以滚动。
看了一下RelativeLayout和ScrollView的代码都没发现这种“自动加maxHeight”的解释,求高手指点一下这种表现的原理是什么
问题解答
回答1:控件的高度问题看onMeasure
直接自己继承ScrollView重写onMeasure方法, 打印传进来的参数如下
@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Log.d(TAG, 'mode: ' + (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST)); Log.d(TAG, 'size: ' + MeasureSpec.getSize(heightMeasureSpec)); super.onMeasure(widthMeasureSpec, heightMeasureSpec);}
日志打印
mode: truesize: 1581
就可以知道模式是AT_MOST, 也就说高度有限制
看了一下RelativeLayout和ScrollView的代码都没发现这种“自动加maxHeight”的解释,求高手指点一下这种表现的原理是什么
所以maxHeight是在RelativeLayout 的measureChild中加进去的.
回答2:受 @assistne 启发,去查了下RelativeLayout的源码在 getChildMeasureSpec方法中发现了如下代码
} else if (childSize == LayoutParams.WRAP_CONTENT) {// Child wants to wrap content. Use AT_MOST// to communicate available space if we know// our max sizeif (maxAvailable >= 0) { // We have a maxmum size in this dimension. childSpecMode = MeasureSpec.AT_MOST; childSpecSize = maxAvailable;} else { // We can grow in this dimension. Child can be as big as it // wants childSpecMode = MeasureSpec.UNSPECIFIED; childSpecSize = 0;} }
而getChildMeasureSpec()方法最终被onMeasure()通过measureChild()和measureChildHorizontal()间接调用。
排除一些特殊情况,一般情况下,RelativeLayout的子控件,如果设置为WRAP_CONTENT,则在布局时会有最大尺寸限制。
相关文章:
1. 下一个页面的三角在上面一个页面会出现,在缩放的时候会遮住文字。2. weex - Android 原生Vue.js 使用 justify-content: flex-end; 不起作用3. javascript - vue-cli热更新的问题【webpack配置】4. python - Django ManyToManyField 字段数据在 admin后台 显示不正确,这是怎么回事?5. android - jni生成的char*在NewStringUTF时报错6. mysql 能不能创建一个 有列级函数 的联合视图?7. javascript - swiper.js嵌套了swiper 初始设置不能向下一个滑动 结束后重新初始8. php由5.3升级到5.6后,登录网站,返回的是php代码,不是登录界面,各位大神有知道的吗?9. java - Ckeditor上传图片时出现mutipartRequest 转换异常10. java - 初学SSM 在import自己写的包下的类的时候飘红,求大神解答?

网公网安备