当前位置: 首页 > news >正文

Android中自定义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的特别的ViewViewGroup是各个LayoutView组件的基类。(翻译的不太好,能看懂就行了)

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

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

2ViewGroup是一个基类,并且是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);
    }

然后我们看看运行效果:

     

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • jstl学习
  • Eclipse中java文件和jsp字体大小设置
  • mysql卸载
  • 长连接与短连接
  • 我的工具连接
  • mongodb 安装配置
  • nginx 安装配置
  • Win7 家庭版远程连接问题
  • mysql 表结构文档整理
  • mysql分组获取最大时间的数据
  • CentOS7 查找应用名称并关闭进程的定时任务
  • CentOS7 yum安装步骤
  • CentOS7 RabbitMQ安装
  • CentOS7 查看目录大小
  • JS计算两个日期的时间差
  • 【前端学习】-粗谈选择器
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS居中完全指南——构建CSS居中决策树
  • CSS实用技巧干货
  • echarts的各种常用效果展示
  • HashMap ConcurrentHashMap
  • jdbc就是这么简单
  • JS数组方法汇总
  • opencv python Meanshift 和 Camshift
  • PhantomJS 安装
  • PHP 小技巧
  • python学习笔记-类对象的信息
  • Rancher如何对接Ceph-RBD块存储
  • VUE es6技巧写法(持续更新中~~~)
  • 对JS继承的一点思考
  • 码农张的Bug人生 - 见面之礼
  • 手写双向链表LinkedList的几个常用功能
  • 以太坊客户端Geth命令参数详解
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #NOIP 2014# day.1 T2 联合权值
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (02)Hive SQL编译成MapReduce任务的过程
  • (arch)linux 转换文件编码格式
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)四层和七层负载均衡的区别
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET Core 2.1路线图
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET MVC之AOP
  • .net web项目 调用webService
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...