最近在擼新的東西玩汁展,自定義View我也算是半個老司機(jī)了。首先在onMeasure中處理了wrap_content的情況勿她,然后我驚奇的在log中發(fā)現(xiàn)适荣,我測量出來的結(jié)果竟然是1080?這是什么操作苹享?后來調(diào)試發(fā)現(xiàn)測量寬度時進(jìn)入了精確模式双絮,沒跑了肯定是match_parent。我是怎么把View添加到父View的呢得问?代碼如下:
ll_container!!.addView(v)
這是一個LinearLayout囤攀,不說多的點(diǎn)進(jìn)addView看一下:
public void addView(View child) {
addView(child, -1);
}
public void addView(View child, int index) {
if (child == null) {
throw new IllegalArgumentException("Cannot add a null child view to a ViewGroup");
}
LayoutParams params = child.getLayoutParams();
if (params == null) {
params = generateDefaultLayoutParams();
if (params == null) {
throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
}
}
addView(child, index, params);
}
可以看到首先addView(View)方法調(diào)用了重載方法,并在在添加之前判斷了LayoutParams宫纬,如果為null則生成一個焚挠,不為null則添加到ViewGroup中。我這里沒有設(shè)置LayoutParams漓骚,所以必定為null蝌衔,那看一下生成參數(shù)的代碼吧:
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}
納尼?蝌蹂?噩斟?看到這真是黑人問號了,倆wrap_content進(jìn)入了exactly測量模式孤个,除非Android系統(tǒng)爆炸還差不多剃允。后來突然想起來Java有一種玩意叫做后期綁定,可能是LinearLayout復(fù)寫了這個生成參數(shù)的方法,點(diǎn)進(jìn)LinearLayout搜索了一下斥废,果然如此:
protected LayoutParams generateDefaultLayoutParams() {
if (mOrientation == HORIZONTAL) {
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
} else if (mOrientation == VERTICAL) {
return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
return null;
}
沒辦法椒楣,剛好設(shè)置的vertical方向,果然width設(shè)置了match_parent营袜∪龆伲看來以后還是要多了解一下ViewGroup加矛。