在开发Android的时候或多或少都离不开自定义控件,而我们在一个好的自定义控件又离不开自定义属性。原因很简单,我们写某个功能的组件的时候不要局限当前,要把它扩展开来。比如我们当前组件的字体颜色是红色,当产品把它变为绿色的时候我们又要新建一个控件。这是一个很不好的编程习惯。
1. 在讲自定义属性之前,我来说说我们自定义控件,所重写的构造方法吧
-
我们自定义控件一般都是继承View、View的子类、ViewGroup.而继承它们之后,系统会要求我们重写三个构造方法。你们知道那三个构造方法在什么时候会被调用吗?
- 第一个构造方法
它是我们在代码中用new的方式创建该控件的时候调用 - 第二个构造方法
它是当我们在布局中使用时调用该构造方法 -
第三个构造方法
它是我们在布局中但是布局中有Style的时候调用
也就是在布局中这样写的时候调用
2. 自定义属性
- 步骤
1. 在res/value文件夹下新建一个attrs.xml(注:名字可以随便命名,但是建议使用attrs命名)文件
文件格式如图
2. attirs.xml中的代码代码中基本上已经包含了所有
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="text_color" format="color"/>
<attr name="text_size" format="dimension"/>
<attr name="background" format="reference|color"/>
<attr name="style_type">
<enum name="number" value="1"/>
<enum name="text" value="2"/>
</attr>
</declare-styleable>
</resources>
分析一下以上代码代表的含义:
declare-styleable: 表示一个属性组。它的name可以随便命名但是建议和我们自定义控件的名字一致
attr:表示单独的一个属性。format代表属性的格式。格式包括很多种:比如颜色,数值,枚举等
format的格式有
1、reference 引用类型值 : @id/...
2、 color 颜色类型值
3、 boolean 布尔类型值 true , false
4、 dimension 尺寸类型值 dp / px /sp
5、 integer 整数类型值
6、float 浮点型值
7、string 字符串类型值
8、<enum> 枚举类型值
9、 flag:位或运算
10、fraction:百分数
3. 在我们自定义控件中如何获取这些属性
- 获取TypedArray对象
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyView);
其中有两个参数第一个是构造中的,第二个是attirs.xml中declare-styleable节点下的name
- 获取相应的属性值
textColor =typedArray.getColor(R.styleable.MyView_text_color,textColor);
textSize =typedArray.getDimensionPixelSize(R.styleable.MyView_text_size,textSize);
styleType =typedArray.getInt(R.styleable.MyView_style_type,styleType);
- 释放资源
typedArray.recycle();
4. 布局中使用
-
布局中使用就是1的位置添加命名空间,也不用我们特别记忆,就是在相应位置打app,编译器会给我们自动提示,选择我选中的那个就行
- 就是使用我们的自定义属性了,也就是图4-1中的2的写法