当指定布局的宽度为wrapcontent时,自定义控件的onMesure方法的参数的值为什么是父控件的大小?

啥佛大学 2016-04-21 03:30:26
这是布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<com.example.test_viewmeasure.MyLinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#f00" >
<TextView
android:text="哈哈"
android:textColor="#000"
android:layout_width="10dp"
android:layout_height="10dp"
/>
</com.example.test_viewmeasure.MyLinearLayout>

</LinearLayout>
这是自定义控件:
package com.example.test_viewmeasure;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class MyLinearLayout extends LinearLayout {

public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

/*public MyLinearLayout(Context context) {
super(context);
}*/

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}

private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = 200;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}

private int measureHeight(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = 200;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}

}

自定义布局的大小我写成了wrapcontent 那么 result = Math.min(result, specSize);的值就应该是textView和200中的较小值 TextView的大小我写成了10dp 肯定比200px小 但是 最终 的result的值竟然是200px 这是为什么 也就是说 此时的onMesur方法的参数值默认是父控件的大小的数值 而不是子控件的大小值。
...全文
167 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklwan 2016-04-22
  • 打赏
  • 举报
回复
因为他是测量子控件的宽高之后才去确定自身宽高的,而且是不限制子控件宽高的。

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧