自定义组件相信在面试过程中会经常被问到自定义组件相关问题,最近总结了下自定义View的方式;
总结来说,自定义控件的实现有三种方式,分别是:组合控件、自绘控件和继承控件。下面将分别对这三种方式进行介绍。
(一)组合控件:
像平常项目中,我们会经常自定义一个ToolBar, 多个页面都会需要这个标题栏,为了让代码复用性更强,一般会自定义一个ToolBar;
带着问题,我们会想到在继承View的构造函数中 有个AttributeSet这个属性,没错 这就是 突破口。
我们可以在attrs.xml中声明自己控件的属性,在布局xml文档中声明自己的命名空间,这时就可以对设置自己想要的值了,然后在AttributeSet这个属性中获取对应的值。好了不多说,我们来看下代码,一切尽在不言中:
第一步:
在/res/values下编写一个attrs.xml的文件,其中内容结构如下:
第二步:
自定义ToolBar,在构造方法中通过AttributeSet这个属性中获取对应的值。
final TypedArray a =context.obtainStyledAttributes(attrs,R.styleable.MyToolbar,0,0);遍历这个返回的TypedArray然后进行获取定义好的属性值;
不要忘记添加 xmlns:app="http://schemas.android.com/apk/res-auto",然后就可以直接在自定义view中直接描述定义的属性,入标题,右边按钮的名字等;
在自定义ToolBar中可以实现一些方法,入按钮的事件监听,设置标题文本的方法:
(一)自绘控件:
自绘控件的内容都是自己绘制出来的,在View的onDraw方法中完成绘制。下面就实现一个简单的计数器,每点击它一次,计数值就加1并显示出来。
1、创建CounterView类,继承自View,实现OnClickListener接口:
(三)继承控件:
就是继承已有的控件,创建新控件,保留继承的父控件的特性,并且还可以引入新特性。下面就以支持横向滑动删除列表项的自定义ListView的实现来介绍。
创建CustomListView类,继承自ListView,并实现了OnTouchListener和OnGestureListener接口: