Android attr 属性介绍
attr属性的定义/读取/出错/使用
1.1 自定义attr属性与读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/**
* 初始化。
*
* @param context 上下文。
* @param attributeSet 属性。
*/
private void initialize(Context context, AttributeSet attributeSet) {
mPaint.setAntiAlias(true);
TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.CircleProgressbar);
if (typedArray.hasValue(R.styleable.CircleProgressbar_circle_color)){
inCircleColors = typedArray.getColorStateList(R.styleable.CircleProgressbar_circle_color);
} else{
inCircleColors = ColorStateList.valueOf(Color.TRANSPARENT);
}
circleColor = inCircleColors.getColorForState(getDrawableState(), Color.TRANSPARENT);
typedArray.recycle();
}1.2在res/values 文件下定义一个attrs.xml 文件
1
2
3
4
5
6
7<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View名称">
<attr name="textColor" format="color"/>
<attr name="textSize" format="dimension"/>
</declare-styleable>
</resources>- format有以下几种类型及读取
1.3如果在attr中不同View引用相同属性名字时出现错误的解决方法
问题代码【引用代码(两个都引用了textColor会出错)】
1
2
3
4
5
6
7
8
9
10
11<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View名称">
<attr name="textColor" format="color"/>
<attr name="textSize" format="dimension"/>
</declare-styleable>
<declare-styleable name="View2名称">
<attr name="textColor" format="color"/>
<attr name="hint" format="reference" />
</declare-styleable>
</resources>错误报告提示:
1
2Error:Execution failed for task ':包路径:mergeReleaseResources'.
> 本地包路径\src\main\res\values\attrs.xml: Error: Found item Attr/textColor more than one time解决方式:
第一种方式,更改名称,不要出现相同的name
1
2
3
4
5
6
7
8
9
10
11<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View名称">
<attr name="textColor" format="color"/>
<attr name="textSize" format="dimension"/>
</declare-styleable>
<declare-styleable name="View2名称">
<attr name="inTextColor" format="color"/>
<attr name="hint" format="reference" />
</declare-styleable>
</resources>第二种方式,抽取相同属性
1
2
3
4
5
6
7
8
9
10
11
12<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="textColor" format="color"/>
<declare-styleable name="View名称">
<attr name="textColor"/>
<attr name="textSize" format="dimension"/>
</declare-styleable>
<declare-styleable name="View2名称">
<attr name="textColor"/>
<attr name="hint" format="reference" />
</declare-styleable>
</resources>
1.4 enum/flag的特殊之处
下面就列举flag(enum也类似),先看代码:
1
2
3
4
5
6
7
8
9<declare-styleable name = "View名称">
<attr name="inputType">
<flag name = "text" value = "0" />
<flag name = "number" value = "1" />
<flag name = "textPassword" value = "2" />
<flag name = "numberPassword" value = "3" />
<flag name = "numberDecimal" value = "4" />
</attr>
</declare-styleable>这里是我在自定义一个EditText的时候,为了设置输入内容的类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21setInputType(attrs.getInt(R.styleable.View名称_inputType, 0));
public void setInputType(int type) {
switch (type) {
case 0:
mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
break;
case 1:
mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
break;
case 2:
mEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
break;
case 3:
mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
break;
case 4:
mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
break;
}
}