這節我們研究的是在XML中向ViewGroup中添加組件。關於這個的研究可以破費周折,為什么呢??因為向其中添加的組件他都不顯示啊。郁悶了好長一段時間,不多最終還是突破了,研究出來了,呵呵,路漫漫其修遠兮,吾將上下而求索。繼續我們的探索之旅。
一、簡述
在XML中向ViewGroup中添加組件,這個問題貌似很簡單,但是只有在簡單中才會發現不簡單,其實好多復雜的東西都是由簡單的東西一步一步演化而來的,這是道家所謂的一生二、二生三、三生萬物,以后我們還將通過剖析一個布局類來更深入的了解ViewGroup,不過那是后話了,呵呵。
那么我們可以通過怎樣的方式來添加了。請看:
<com.fxhy.stady.myviewGroup.HelloViewGroup
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="繁星皓月繼承ViewGroup研究"/>
</com.fxhy.stady.myviewGroup.HelloViewGroup>
|
貌似這個方法可以先ViewGroup中加入組件,但是,實際上我們運行后會發現,其實這個組件是不會顯示的。
有興趣的讀者可以運行試試。效果是下面這樣的。
二、為啥不顯示
那么為啥這個ViewGroup里面的TextView沒有顯示呢,我也為這個問題困擾過很久,其實,有時候我們不是學不會,而是不會學,知識千萬遍,方法有多少。那到底要怎樣做呢?
其實很簡單,我們只需要在ViewGroup中的onMeasure方法里添加一個對子元素的遍歷,並且在onLayout中添加一個布局遍歷就實現了簡單的布局了。
下面給出代碼:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int childCount = getChildCount();
for(int i = 0; i < childCount; i ++){
View v = getChildAt(i);
v.measure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childCount = getChildCount();
for(int i = 0; i < childCount; i ++){
View v = getChildAt(i);
v.layout(l, t, r, b);
}
}
運行效果:
三、注意
各位讀者請注意:
以上的方法僅僅是一個實驗,實際上布局要比上述的復雜的多,有興趣的可以看看LinearLayout里面是怎樣實現的來研究下,以后如果有時間我會寫一篇淺析Android布局的博文,供大家參考。