- 自定义属性的分类
- 自定义属性的声明
- 自定义属性的获取
一:自定义属性的分类
1 | reference | 参考指定Theme中资源ID,这个类型意思就是你传的值可以说引用资源 |
2 | string | 字符串,如果你想别人既能直接写值也可以用类似"@string/test" 引用资源的方式,可以写成format="string/reference" |
3 | color | 颜色 |
4 | dimension | 尺寸值 |
5 | boolean : | 布尔值 |
6 | integer : | 整型 |
7 | float : | 浮点型 |
8 | fraction : | 百分数 |
9 | enum : | 枚举,如果你提供的属性只能让别人选择,不能随便传入 |
10 | flag : | 位或运算 |
二:自定义属性的声明
通常在values目录下的attrs.xml,如下:
<declare-styleable name="customVisitingCard">
<attr name= "background" format ="reference|color" />
<attr name= "name" fomat ="string" />
<attr name= "nameColor" format ="color" />
<attr name= "nameSize" format ="dimension" />
<attr name= "isShowShadow" format ="boolean" />
<attr name="age" format="integer" />
<attr name="percentage" format="fraction" />
<attr name="shadowX" format="float" />
<attr name="style">
<enum name="STROKE" value="0"></enum>
<enum name="FILL" value="1"></enum>
</attr>
<attr name="position">
<flag name="boss" value="0" />
<flag name="manager" value="1" />
<flag name="employee" value="2" />
</attr>
</declare-styleable >
如果你想复用这些属性,那么可以这么声明:
<attr name="background" format="reference|color" />
<attr name="name" fomat="string" />
<attr name="nameColor" format="color" />
<attr name="nameSize" format="dimension" />
<attr name="isShowShadow" format="boolean" />
<attr name="age" format="integer" />
<attr name="percentage" format="fraction" />
<attr name="shadowX" format="float" />
<attr name="style">
<enum name="STROKE" value="0"></enum>
<enum name="FILL" value="1"></enum>
</attr>
<attr name="position">
<flag name="boss" value="0" />
<flag name="manager" value="1" />
<flag name="employee" value="2" />
</attr>
<declare-styleable name="customVisitingCard">
<attr name="background" />
<attr name="name" />
<attr name="nameColor" />
<attr name="nameSize" />
<attr name="isShowShadow" />
<attr name="age" />
<attr name="percentage" />
<attr name="shadowX" />
<attr name="style" />
<attr name="position"/>
</declare-styleable>
自定义属性的获取
自定义控件有三个构造方法
public CustomProgressBar( Context context){
super(context);
}
public CustomProgressBar(Context context , AttributeSet attrs ){
super(context,attrs);
}
public CustomProgressBar(Context context , AttributeSet attrs , int defStyle){
super(context,attrs,defStyle);
}
如果在Code中实例化一个View会调用第一个构造函数,如果在xml中定义会调用第二个构造函数,而第三个函数系统是不调用的,要由View(我们自定义的或系统预定义的View,如此处的CustomTextView和Button)显式调用.
参考文章:Android中自定义样式与View的构造函数中的第三个参数defStyle的意义 - AngelDevil - 博客园
显然,要获取自定义属性,必须要在第二个和第三个构造方法中获取,获取方法
TypedArray typedArray = context.obtainStyledAttributes(attrs,
R.styleable.customVisitingCard);
// TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,
// R.styleable.customVisitingCard,0,0);
int count = typedArray.getIndexCount();
for (int i = 0; i < count; i++) {
int attr = typedArray.getIndex(i);
switch (attr) {
case R.styleable.customVisitingCard_background:
if (typedArray
.hasValue(R.styleable.customVisitingCard_background)) {
Drawable background = typedArray.getDrawable(attr);
if (null != background) {
mBackground = background;
}
}
break;
case R.styleable.customVisitingCard_name:
mName = typedArray.getString(attr);
break;
case R.styleable.customVisitingCard_nameColor:
mColor = typedArray.getColor(attr, Color.RED);
break;
case R.styleable.customVisitingCard_nameSize:
mNameSize = typedArray.getDimensionPixelSize(attr,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PX, 20, getResources()
.getDisplayMetrics()));
break;
case R.styleable.customVisitingCard_isShowShadow:
mIsShowShadow = typedArray.getBoolean(attr, false);
break;
case R.styleable.customVisitingCard_age:
mAge = typedArray.getInteger(attr, 0);
break;
case R.styleable.customVisitingCard_percentage:
mPercentage = typedArray.getFraction(attr, 1, 1, 0f);
break;
case R.styleable.customVisitingCard_shadowX:
mShadowX = typedArray.getFloat(attr, 0);
break;
case R.styleable.customVisitingCard_style:
mStyle = typedArray.getInt(attr, 0);
break;
case R.styleable.customVisitingCard_position:
mPosition = typedArray.getInteger(attr, 0);
break;
default:
break;
}
}
typedArray .recycle();
引用:
android开发教程之自定义属性用法详解Android脚本之家
android自定义属性的使用 - 竹木人 - 博客园
Android中自定义属性的使用 - 无知者无畏 - ITeye技术网站