在XML向ViewGroup中添加組件

我們研究的是在XML中向ViewGroup中添加組件。關於這個的研究可以破費周折,爲什麼呢??因爲向其中添加的組件他都不顯示啊。鬱悶了好長一段時間,不多最終還是突破了,研究出來了,呵呵,路漫漫其修遠兮,吾將上下而求索。繼續我們的探索之旅。 

 

一、簡述

在XML中向ViewGroup中添加組件,這個問題貌似很簡單,但是只有在簡單中才會發現不簡單,其實好多複雜的東西都是由簡單的東西一步一步演化而來的,這是道家所謂的一生二、二生三、三生萬物,以後我們還將通過剖析一個佈局類來更深入的瞭解ViewGroup,不過那是後話了,呵呵。

那麼我們可以通過怎樣的方式來添加了。請看:

  1. <com.fxhy.stady.myviewGroup.HelloViewGroup

  2. android:layout_width=“fill_parent”

  3. android:layout_height=“fill_parent”>

  4. <TextView

  5. android:layout_height=“wrap_content”

  6. android:layout_width=“fill_parent”

  7. android:text=“繁星皓月繼承ViewGroup研究”/>

  8. </com.fxhy.stady.myviewGroup.HelloViewGroup>

貌似這個方法可以先ViewGroup中加入組件,但是,實際上我們運行後會發現,其實這個組件是不會顯示的。

有興趣的讀者可以運行試試。效果是下面這樣的。

27023911_1.png

二、爲啥不顯示

那麼爲啥這個ViewGroup裏面的TextView沒有顯示呢,我也爲這個問題困擾過很久,其實,有時候我們不是學不會,而是不會學,知識千萬遍,方法有多少。那到底要怎樣做呢?

其實很簡單,我們只需要在ViewGroup中的onMeasure方法裏添加一個對子元素的遍歷,並且在onLayout中添加一個佈局遍歷就實現了簡單的佈局了。

下面給出代碼:

  1. @Override

  2. protectedvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec){

  3. // TODO Auto-generated method stub

  4. super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  5. int childCount = getChildCount();

  6. for(int i =0; i < childCount; i ++){

  7. View v = getChildAt(i);

  8.                v.measure(widthMeasureSpec, heightMeasureSpec);

  9. }

  10. }

  11. @Override

  12. protectedvoid onLayout(boolean changed,int l,int t,int r,int b){

  13. int childCount = getChildCount();

  14. for(int i =0; i < childCount; i ++){

  15. View v = getChildAt(i);

  16.                v.layout(l, t, r, b);

  17. }

  18. }

運行效果:

27023911_2.png

三、注意

各位讀者請注意:

以上的方法僅僅是一個實驗,實際上佈局要比上述的複雜的多,有興趣的可以看看LinearLayout裏面是怎樣實現的來研究下,以後如果有時間我會寫一篇淺析Android佈局的博文,供大家參考。 

原創文章,轉載請註明: 轉載自DEVDIV博客

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章