Android中的AttributeSet是什么?
如何将其用于自定义视图?
Answers:
对于其他人,尽管提供了详细的说明,但答案较晚。
AttributeSet(Android文件)
与XML文档中的标记相关联的属性的集合。
基本上,如果您尝试创建自定义视图,并且想要传递尺寸,颜色等值,则可以使用进行操作AttributeSet
。
假设您要在View
下面创建一个赞
有一个带有黄色背景的矩形,里面有一个圆形,假设半径为5dp,绿色为背景。如果希望您的视图通过XML获取背景颜色和半径的值,如下所示:
<com.anjithsasindran.RectangleView
app:radiusDimen="5dp"
app:rectangleBackground="@color/yellow"
app:circleBackground="@color/green" />
好吧,那AttributeSet
是使用的地方。您可以attrs.xml
使用以下属性将其放在values文件夹中。
<declare-styleable name="RectangleViewAttrs">
<attr name="rectangle_background" format="color" />
<attr name="circle_background" format="color" />
<attr name="radius_dimen" format="dimension" />
</declare-styleable>
由于这是一个视图,因此java类从 View
public class RectangleView extends View {
public RectangleView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.RectangleViewAttrs);
mRadiusHeight = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_radius_dimen, getDimensionInPixel(50));
mCircleBackgroundColor = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_circle_background, getDimensionInPixel(20));
mRectangleBackgroundColor = attributes.getColor(R.styleable.RectangleViewAttrs_rectangle_background, Color.BLACK);
attributes.recycle()
}
}
因此,现在我们可以RectangleView
在您的xml布局中使用这些属性,并在RectangleView
构造函数中获取这些值。
app:radius_dimen
app:circle_background
app:rectangle_background
getDimensionInPixel(50)
?
您可以使用AttributeSet来获取在xml中定义的视图的其他自定义值。例如。有一个有关定义自定义属性的教程,其中指出:“可以直接从AttributeSet中读取值”,但没有说明如何实际执行此操作。但是,它确实警告说,如果您不使用样式属性,则:
如果要忽略整个样式化的属性,而直接获取属性:
example.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://www.chooseanything.org">
<com.example.CustomTextView
android:text="Blah blah blah"
custom:myvalue="I like cheese"/>
</LinearLayout>
请注意,xmlns有两行(xmlns = XML名称空间),第二行定义为xmlns:custom。然后在下面的custom:myvalue定义。
CustomTextView.java
public CustomTextView( Context context, AttributeSet attrs )
{
super( context, attrs );
String sMyValue = attrs.getAttributeValue( "http://www.chooseanything.org", "myvalue" );
// Do something useful with sMyValue
}
AttributeSet是在xml资源文件中指定的属性集。您不必在自定义视图中做任何特别的事情。在View(Context context, AttributeSet attrs)
被调用初始化从布局文件的视图。只需将此构造函数添加到您的自定义视图即可。查看SDK中的“自定义视图”示例以查看其使用情况。
android-sdk\samples\android-17\ApiDemos\src\com\example\android\apis\view
从XML布局创建视图时,将从资源束中读取XML标记中的所有属性,并将其作为传递给视图的构造函数。 AttributeSet
尽管可以AttributeSet
直接从中读取值,但这样做有一些缺点:
而是传递AttributeSet
给obtainStyledAttribute()
。此方法将返回TypedArray
已引用和设置样式的值数组。