10. LinearLayout RelativeLayout
2018-03-29 本文已影响20人
真胖大海
- LinearLayout 子View测量一次,但是实现复杂的布局要使用嵌套
- elativeLayout 子View测量两次,但是实现复杂的布局不用嵌套
-
ConstraintLayout既能减少布局嵌套又不会测量两次
RelativeLayout.onmeasure方法中会对子控件测量两次,源码如下
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
for (int i = 0; i < count; i++) {
View child = views[i];
measureChildHorizontal(child, params, myWidth, myHeight);
}
}
for (int i = 0; i < count; i++) {
final View child = views[i];
measureChild(child, params, myWidth, myHeight);
}
}
注意
-
有一个细节一个View至少会被测量两次
如下面一个布局文件
根布局文件1
LinearLayout被测量2次,View被测量2次
<LinearLayout>
<View/>
</LinearLayout>
如下的布局文件
RelativeLayout被测量2次,因为View会被RelativeLayout测量两次,所以View被测量4次
<RelativeLayout>
<View/>
</RelativeLayout>
- 对于垂直方向的LinearLayout,如果其layout_height="wrap_cont",而其子View的layout_width="match_parent",则子View会被测量两次。(水平方向的LinearLayout同理)
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
</LinearLayout>