一、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组件的基类。(翻译的不太好,能看懂就行了)

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的源代码中方法是这样定义的,也就是父类没有提供方法的内容,需要我们自己实现。

当View要为所有子对象分配大小和位置时,调用此方法

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);
    }

然后我们看看运行效果:

继承viewgroup相关推荐

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

    转载过来:为一.二.三版本. 仅供参考: 继承ViewGroup研究(1) --简介和一个小Demo 又翻开一个新篇章了,哈哈,上一回学习的是继承View,关于继承View个人感觉不是那么完美,做技术 ...

  2. 继承ViewGroup:重写onMeasure方法和onLayout、requestlayout方法

    为什么80%的码农都做不了架构师?>>>    在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout. 1,在方法onMeasure中调用set ...

  3. 自定义控件---继承ViewGroup类方式(循序渐进之第1步效果----图片左右拖动)

    -----------------------下面这个效果只是整个效果的刚开始-(目前只可以左右拖动图片)---一会继续更新博客------------------------- 配置文件 activ ...

  4. 自定义控件---继承ViewGroup类方式(循序渐进之第2步效果----图片左右拖动+自动回弹效果)

    -----------------------下面这个效果只是整个效果的第二步-(目前左右拖动图片+回弹效果)---一会继续更新博客------------------------- 配置文件 act ...

  5. 继承ViewGroup类

    Android中,布局都是直接或间接的继承自ViewGroup类,其中,ViewGroup的直接子类目前有: AbsoluteLayout, AdapterView<T extends Adap ...

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

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

  7. Android自定义控件----继承ViewGroup侧滑菜单5,抽屉式侧滑,QQ5.0效果(完结)

    效果图: 项目结构: QQ5.0的侧滑 和抽屉菜单的区别 简单的说就是在onScrollChanged方法中加入了缩放,偏移,渐变属性动画效果 区别1:内容1:内容区域 1.0到0.7 缩放效果 sc ...

  8. 自定义控件---继承ViewGroup类方式(循序渐进之第3步效果----图片左右拖动+RadioGroup切换效果)

    -----------------------下面这个效果只是整个效果的第三步-(目前左右拖动图片+回弹效果+RadioGroup切换效果)---一会继续更新博客------------------- ...

  9. Android ViewGroup等容器控件的使用

    在Android中,可以自定义类,继承ViewGroup等容器类,以实现自己需要的布局显示.如果你在ViewGroup中增加了控件,却无法显示出 来,那么下面这个例子,就可以用来参考了.(主要是要实现 ...

  10. 教你搞定Android自定义ViewGroup

    ViewGroup 我们知道ViewGroup就是View的容器类,我们经常用的LinearLayout,RelativeLayout等都是ViewGroup的子类,因为ViewGroup有很多子Vi ...

最新文章

  1. python列表操作:追加元素到列表的代码
  2. mysql in边界_mysql中 where in 用法详解
  3. 多线程学习-基础(十三)(学习参考·网摘) ArrayBlockingQueue源代碼解析(base jdk 1.8)...
  4. Android开发之搜Ya项目说明(3)
  5. 2021音视频开发的“坑”,等你来填!
  6. php angular使用,如何使用angular.js PHP从mysql显示数据?
  7. oracle10g检测未通过,win64bit安装oracle 10g版本检查未通过解决 提示要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1...
  8. python设计模式12-代理模式
  9. 跑步是冻龄,还是催人老?
  10. 全栈开发者意味着什么?
  11. 区块链 交易怎么验证是否被篡改 SPV验证
  12. HDOJ 1035 模拟 水
  13. 多图详解IT架构师完整知识体系及技术栈
  14. 元素周期表排列的规律_元素周期表中的几个规律
  15. win10系统 双击bat文件无法运行,只是以普通txt文件打开该文件,简单解决
  16. 关闭Dell笔记本触摸板
  17. windows11 任务栏 wifi、音量、电源还有通知无法左击弹出内容框
  18. lpx寒假作业案例9
  19. isosurface matlab,matlab isosurface
  20. java.lang.IllegalArgumentException: Could not find class异常解决方式

热门文章

  1. 面经:中国人民银行金融科技研究院
  2. 基于Python的深度学习的中文语音识别系统
  3. 阿里巴巴字体库使用方法
  4. L298N电机驱动模块的接线使用与代码实现
  5. 【神通数据库】图形化界面安装、命令行安装、静默安装、命令行建数据库、日常维护(超详细)
  6. 关于NVIDIA显卡驱动更新后,没有NVIDIA 控制面板的解决办法
  7. 未来行业发展趋势分析
  8. 自定义id的几种思路分享以及税务单据编号实现
  9. MySQL生日转年龄
  10. [noip2011]铺地毯(carpet)解题报告