当我们使用Android的自定义控件或者自定义视图时,往往需要为它们添加自定义的属性,来满足不同的需求。这就是Android中的自定义属性,具体来说,包含以下几个方面:
- 定义属性:定义自定义属性,可以在xml中被使用;
- 使用属性:在xml中使用自定义属性;
- 代码中使用属性:在Java代码中获取和设置自定义属性。
接下来,我们就详细讲解一下这三个方面的操作。
一、定义属性
在Android中,我们使用属性集合(attribute set)来定义属性。属性集合就是一组键值对,其中键表示属性名,值表示属性值。一个典型的属性集合可能包含以下几个部分:
- android:系统定义的属性,可以在任何控件中被使用。
- 资源:早在Android系统中就已经定义好了的其他属性,包括布局属性和样式属性。
- 自定义属性:自己为控件或者视图定义的属性。
在定义自定义属性时,需要在res/values/attrs.xml文件中声明。
示例:
<resources>
<attr name="exampleAttr" format="string" />
</resources>
在这个示例中,我们定义了一个字符串类型的自定义属性exampleAttr。
同时,需要注意的是,format属性指定了属性的数据类型,支持的数据类型包括:
- color:颜色类型;
- boolean:布尔类型;
- dimension:尺寸类型;
- string:字符串类型;
- integer:整数类型;
- enum:枚举类型,指定可选值;
- reference:资源类型,指向相关资源的引用。
二、使用属性
在xml中使用自定义属性时,需要在xml文件中先声明命名空间,使得xml认识到它所使用的属性是自定义属性。以下是两个示例。
(1)使用自定义属性:
<com.example.CustomView
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:exampleAttr="Hello World!" />
在这个示例中,声明了命名空间custom,以及通过使用custom:exampleAttr设置了自定义属性的值。
(2)使用自定义属性和系统属性:
<com.example.CustomView
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
custom:exampleAttr="Hello World!" />
在这个示例中,我们同时使用了系统属性和自定义属性,而且需要声明两个命名空间。
三、代码中使用属性
在Java代码中也可以获取和设置自定义属性,具体分为以下两个操作。
(1)获取自定义属性:
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0);
try {
String exampleAttr = a.getString(R.styleable.CustomView_exampleAttr);
// Do something with exampleAttr
} finally {
a.recycle();
}
在这个示例中,我们使用context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0)
方法获取和自定义属性关联的TypedArray对象,跟据属性索引R.styleable.CustomView_exampleAttr
获取属性的值。
(2)设置自定义属性:
public class CustomView extends View {
private String exampleAttr;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0);
try {
exampleAttr = a.getString(R.styleable.CustomView_exampleAttr);
} finally {
a.recycle();
}
}
public String getExampleAttr() {
return exampleAttr;
}
public void setExampleAttr(String exampleAttr) {
this.exampleAttr = exampleAttr;
invalidate();
requestLayout();
}
}
在这个示例中,我们在CustomView类中定义了一个成员变量exampleAttr,并且通过setExampleAttr()和getExampleAttr()方法来设置和获取自定义属性。而且,为了在属性发生变化时,让CustomView重新渲染和测量,并调用invalidate()和requestLayout()方法。
结论
到这里,为止,我们已经学习了Android中自定义属性的三个方面:定义属性,使用属性和代码中使用属性。通过这三方面的掌握,我们就可以轻松地为我们自己的控件或者视图添加自定义属性,让自己的程序在界面和功能方面达到更佳的效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:理解Android中的自定义属性 - Python技术站