继承ViewGroup研究(汇总) 一、二、三

转载过来:为一、二、三版本。

仅供参考:

继承ViewGroup研究(1)
--简介和一个小Demo

又翻开一个新篇章了,哈哈,上一回学习的是继承View,关于继承View个人感觉不是那么完美,做技术的总是想让一切完美,但世界上本就没有完美,由他吧。这回研究的是ViewGroup。说实话,个人感觉这个类的功能还是很强大的,这里我们只给出最基本的东西,好了,继续开始研究吧,,路漫漫其修远兮,吾将上下而求索。

 

一、ViewGroup概述

 

研究ViewGroup之前,我们先来看看ViewGroup的介绍:                     


 /**

 * A ViewGroup is a special view that can contain other views

 * (called children.) The view group is the base class for layouts and views

 * containers. This class also defines the

 * android.view.ViewGroup.LayoutParams class which serves as the base

 * class for layouts parameters.


一个ViewGroup是一个可以包含其他view的特别的View,ViewGroup是各个Layout和View组件的基类,这个类还定义了LayoutParams类来指定这个基类的布局参数。(翻译的不太好,能看懂就行了)

 

Android关于ViewGroup的解释还是比较清楚的,通过这个我们可以看出几点:

1、ViewGroup是一个容器,而这个容器是继承与View的。

2、ViewGroup是一个基类,并且是Layout和一些View组件的基类。

等等,不一而足,眼界有多高相信看到的就有多远,呵呵。

 

二、ViewGroup的三个方法

 

在继承ViewGroup时有三个重要的方法,下面我们就来看看:

 

1、onLayout方法

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

}

在我们继承ViewGroup时会在除了构造函数之外提供这个方法,我们可以看到,在ViewGroup的源代码中方法是这样定义的,也就是父类没有提供方法的内容,需要我们自己实现。

这个是我们布局的时候用的,待会我们就会使用到这个。

 

2、addView方法

public void addView(View child) {
        addView(child, -1);
}

这个方法是用来想View容器中添加组件用的。我们可以使用这个方法想这个ViewGroup中添加组件。

 

3、getChildAt方法

 

public View getChildAt(int index) {
        try {
            return mChildren[index];
        } catch (IndexOutOfBoundsException ex) {
            return null;
        }
}

 

 这个方法用来返回指定位置的View。

 注意:ViewGroup中的View是从0开始计数的。

 可以说我们自定义ViewGroup时这三个方法是至关重要的,下面我们就来看看自定义ViewGroup使用。

 

三、一个小Demo

 

我们新建一个叫AndroidViewGroup的工程,Activity起名为MainActivity。在写一个继承于ViewGroup的类,名叫HelloViewGroup。

 

-->HelloViewGroup类

public class HelloViewGroup extends ViewGroup {

    public HelloViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }
    
    public HelloViewGroup(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub

    }

}

 

 

 

-->MainActivity类

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new HelloViewGroup(this));
    }
}

 

 

这时你可以运行一下,发现屏幕除了状态栏了那个Label是一片黑,呵呵。下面我们来修改代码,让自己的ViewGroup火起来。

我们新建一个名叫myAddView的方法,这个方法用来向ViewGroup中添加组件:

 

 

/**
     * 添加View的方法
     * */
    public void myAddView(){
        ImageView mIcon = new ImageView(mContext);
        mIcon.setImageResource(R.drawable.haha);
        addView(mIcon);
    }

 

 

然后我们修改onLayout方法:

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        View v = getChildAt(0);
        v.layout(l, t, r, b);
    }

 

然后我们看看运行效果: 

是不是出效果了,哈哈,自己试一试吧,不过是之前记得创建一个mContext并在构造函数里初始化一下。

继承ViewGroup研究(2)--在XML中使用ViewGroup初探

这次研究的是XML中布局自定义ViewGroup,为什么要在XML中自定义ViewGroup,呵呵,其实这个东西吧,还真没法说,我个人的感觉是可以方便的使用Android中已经给出的各种组件,还有自己的组件。下面我们就来看看在XML中布局。

 

一、XML中使用ViewGroup概述

 

首先我们要知道Android中的View以及ViewGroup,甚至是自己继承Android中系统组件的View,都可以在XML中使用。不过要注意的一点就是一定要在自定义的类中添加上以下的构造器:

public MyView(Context context, AttributeSet attrs) {

       super(context, attrs);

       // TODO Auto-generated constructor stub

    }

 

同样,在XML中定义ViewGroup也必须有这个方法。因为从Android系统解析自定义的View时是根据这个方法来解析的,没有这个方法是不行的。各位可以试一试。

 

 

二、在XML中使用

 

我们先来修改MainActivity类

 


public class MainActivity extends Activity {

    /** Called when the activity is first created. */

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

}

 

 

 

 

 

 

 

 

修改main.xml

 


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

    <com.fxhy.stady.myviewGroup.HelloViewGroup

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"/>

</LinearLayout>

 

 

 

 

 

 

 

 

 

 

 

 

  

 

我们运行一下: 图省略 

完美运行,哈哈,有没点成就感啊,哈哈。

 

三、关于三种在XML使用ViewGroup

 

其实我们有三种在XML布局中使用ViewGroup的方法:

 

1、直接使用ViewGroup

这个就是我们刚才使用的那个方法,这个方法是在自己写的ViewGroup中通过addView方法一个一个添加子View,个人感觉这样使用不太爽,呵呵,但是不可否认这样使用有其独挡一面的地方。

 

2、在XML中向ViewGroup中添加View。

这个方法我们将在下一节研究,关于这个的话会涉及到一些其他的知识点,我们现在先不探讨这个。

 

3、混合布局

就像css+table一样,呵呵,我们是不是可以既使用XML中声明的ViewGroup中添加View,又在自己写的类中添加View???那这样添加的View是先添加XML中的,还是先添加在自定义的类中的???

呵呵,这个一个需要探究的问题,有兴趣的可以先自己研究下,在以后的章节中我会给出研究结果。

 

未完待续......

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

时间: 2024-11-16 03:59:49

继承ViewGroup研究(汇总) 一、二、三的相关文章

layout-android 中 继承ViewGroup的问题。

问题描述 android 中 继承ViewGroup的问题. 我自己写了一个控件mylayout继承frameLayout. 里头有一个imageView 和一个 textView . 我新建一个Activity 在其Layout里头 addView(mylayout) ; 控件可以正常显示. 但是我新建一个类mygroup 继承 ViewGroup. 在mygroup里头的构造函数 addView(mylayout). 只能显示出framelayout 不能显示出 imageView 和 te

Android自定义ViewGroup之WaterfallLayout(二)_Android

上一篇我们学习了自定义ViewGroup的基本步骤,并做了一个CustomGridLayout的实例,这篇我们继续来说说自定义ViewGroup. Android中当有大量照片需要展示的时候,我们可以用GridView作为照片墙,但是GridView太整齐了,有时候不规则也是一种美,瀑布流模型就是这样一个不规则的展示墙,接下来我们尝试用自定义ViewGroup来实现瀑布流. 实现瀑布流的方式也有很多,下面我们一一道来: 一.继承ViewGroup 其实这种实现方式我们只需要在上篇博客的基础上稍作

继承ViewGroup重写onMeasure方法的详解

我们继承重写ViewGroup的目的是要做自定义控件,所以我们有必要先看一下安卓View的绘制过程: 首先当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree,绘画通过遍历整个树来完成,不可见的区域的View被放弃. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍

数据实践之美:33位大数据专家的方法、技术与思想. NO.2 数据化营销中的“一•二•三”

NO.2 数据化营销中的"一·二·三" 叶秋萍 专注数据分析多年,做过物流行业.保健品行业及秀场行业的数据分析,也做过银行电商项目的咨询顾问,传统行业和互联网行业都有涉猎.对用户心理学.用户行为学.商业学颇有兴趣,一直致力于CRM的学习和实践.对BI和可视化分析也有一定的研究和了解. 个人微信号:binglingzi3344 这个时代,瞬息万变,传统的商业模式在悄无声息中被"革命",互联网蓝海中的风浪再大也无法阻挡我们向前迈步的热情,梅特卡夫定律所概括的经济效应随着

Android自定义控件之继承ViewGroup创建新容器

欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建可以复用的组合控件还没有学习的同学请先去学习下,因为本节将使用到上几节所讲述的内容. 在学习新内容之前,我们先来弄清楚两个问题: 1 . 什么是ViewGroup? ViewGroup是一种容器.它包含零个或以上的View及子View. 2 . ViewGroup有什么作用? ViewGroup内部可以用来存放多个View控件,并且根据自身的测量模式,来测量

研究一下标题间隔符三种形式的优差对比的重要性

摘要: 一些朋友都知道网站的前期策划对网站运营的意义,很多新手甚至一些老手当网站运营一段时间以后突然发现某些设置不太合理这个时候就想对网站进行局部微调,标题的间隔符就是其 一些朋友都知道网站的前期策划对网站运营的意义,很多新手甚至一些老手当网站运营一段时间以后突然发现某些设置不太合理这个时候就想对网站进行局部微调,标题的间隔符就是其中很多站长朋友比较迷惑的地方,今天减肥亲小编就以亲身经历和大家一起研究一下标题间隔符三种形式的优差对比的重要性: 一.半角逗号形式的间隔符 应该说以前甚至现在用的比较

《SOA与REST:用REST构建企业级SOA解决方案》—第2章2.3节案例研究背景之二:KioskEtc有限公司

2.3 案例研究背景之二:KioskEtc有限公司KioskEtc公司是一家中型咖啡特许经营商,最初在美国中西部地区的校园内及周边开设商店.除了各种烘焙食品之外,KioskEtc还出售一系列特色咖啡和茶. 2.3.1 历史KioskEtc由中西部大学联盟主校区的学生会创立于20世纪90年代早期.它最终被一家私企收购,现已扩张到中西部地区的其他校园,目前有超过200家分店,超过60%的收入来自校园内店铺.最初的店铺扩张由原始KioskEtc管理团队开展,他们采取租用廉价的校园建筑的策略,建立了第一

IBM DB2 日常维护汇总(二)_DB2

正在看的db2教程是:IBM DB2 日常维护汇总(二).    10.AIX下用哪个命令来安装DB2? INSTALLP命令 11.同一操作系统下可以安装多个DB2数据库? 可以的 12.如何停止实例? DB2STOP 13.如何启动实例? DB2START 14.如何修改注册项的值? DB2SET可以修改 如: 设定当前实例的一个参数 DB2SETPARAMETER=VALUE 设定一个全局级的参数 DB2SETPARAMETER=VALUE-G(小写) 查看能在配置文件注册表中设置的所有变

Android 第三方应用接入微信平台研究情况分享(二)_Android

微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方面的开销,我最近由于实习需要也在研究这个东西,不过发现网上的相关资料还是挺少的,这里把我的整个研究情况给出来,希望可以共同学习. 第三方应用接入微信平台(1) 二.第三方应用与微信通信的时序图 2.接收微信的请求信息 前面四步和之前的"1.向微信发送消息"是一样的,不需要重复执行,这里给出来只是为了 流程的整体性.当我们注册后,应用图标会出现在微信聊天的列