繼承ViewGroup研究(3)--在XML向ViewGroup中添加組件


這節我們研究的是在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布局的博文,供大家參考。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM