自定义view首先要继承一个view或者view的子类如button
且子类最少有一个构造方法包含Context和AttributeSet
Context用来处理上下文信息
AttributeSet用来获取XML
1.构造方法
public CustomerView(Context context) {
super(context);
}//第一个方法主要用在coder中调用
public CustomerView(Context context, AttributeSet attrs) {
super(context, attrs);
// this(context, attrs, R.attr.customerstyle);//可以为控件指定style
}//第二个方法可以通过XML调用
public CustomerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}//第三个方法一般不会直接调用。可以通过第二个方法去调用。
2.添加自定义view的属性
一个良好的自定义view可以自定义属性。定义好的属性可以通过XML直接调用,也可以通过code直接设置。拿一个类型为bool的test属性来来举例。
1.coder中设置属性
在coder中获取设置test属性。
public Boolean getTestBoolean() {
return test;
}
public void setTestBoolean(Boolean boolean1) {
this.test = boolean1;
invalidate();
requestLayout();
}
请注意,在setTestBoolean方法里面有调用invalidate()和requestLayout()。
这两个调用是确保稳定运行的关键。
invalidate用来重新绘制空间内容
requestLayout用来重新确定view的大小
需要调用调用时若忘了这两个方法,将会导致hard-to-find bugs。
2.xml中设置属性
为了定义在xml中设置自定义属性。
需要先添加资源到你的项目中。放置于res/values/attrs.xml文件中。下面是一个attrs.xml文件的示例:
在XML中需要先声明命名空间。命名空间是你的http://schemas.android.com/apk/res/[your package name]
我的包名是com.test.customer。所以我的命名空间是
设置好命名空间就可以直接在view中使用customer的属性
可以通过构造方法中的AttributeSet获取xml中的属性
虽然可以直接从Attribute获取xml属性,但是不推荐这样用。因为这样做拥有属性的资源并没有经过解析。容易发生错误。
通过obtainStyledAttributes()来获取属性值会更加容易。对res目录里的每一个资源,自动生成的R.java文件定义了存放属性ID的数组和常量,常量用来索引数组中每个属性。你可以使用这些预先定义的常量来从TypedArray中读取属性。