继承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布局的博文,供大家参考。

 

 

posted @ 2012-03-21 13:19  繁星皓月  阅读(4442)  评论(4编辑  收藏  举报