什么是AttributeSet,我该如何使用它?
Android中的AttributeSet是什么?
我怎样才能将它用于我的自定义视图?
一个迟到的答案,虽然详细的描述,为他人。
AttributeSet(Android文档)
与XML文档中的标签关联的属性集合。
基本上,如果你想创build一个自定义的视图,并且你想传入像尺寸,颜色等值,你可以用AttributeSet
。
这是一个例子
想象一下,你想创build一个像下面的View
有一个黄色背景矩形,里面有一个圆圈,让我们说5dp半径,绿色背景。 如果你希望你的Views通过XML获取背景颜色和半径的值,像这样:
<com.anjithsasindran.RectangleView app:radiusDimen="5dp" app:rectangleBackground="@color/yellow" app:circleBackground="@color/green" />
那么这就是使用AttributeSet
的地方。 您可以在值文件夹中具有以下属性的attrs.xml
文件。
<declare-styleable name="RectangleViewAttrs"> <attr name="rectangle_background" format="color" /> <attr name="circle_background" format="color" /> <attr name="radius_dimen" format="dimension" /> </declare-styleable>
由于这是一个View,所以Java类从View
扩展
public class RectangleView extends View { public WashingMachineView(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); }
所以现在我们可以在xml布局中使用这些属性到我们的RectangleView
,我们将在RectangleView
构造函数中获得这些值。
app:radius_dimen app:circle_background app:rectangle_background
AttributeSet是在xml资源文件中指定的一组属性。 你不应该在你的自定义视图中做任何特别的事情。 View(Context context, AttributeSet attrs)
被调用以从布局文件初始化视图。 只需将此构造函数添加到您的自定义视图。 查看SDK中的自定义视图示例以查看使用的示例。
您可以使用AttributeSet为您在xml中定义的视图获取额外的自定义值。 例如。 有一个关于定义自定义属性的教程,它指出:“可以直接从AttributeSet中读取值”,但并没有说明如何实际做到这一点。 然而,它警告说,如果你不使用样式属性,那么:
- 属性值中的资源引用不会被parsing
- 样式不适用
如果你想忽略整个风格的属性的东西,只是直接获取属性:
的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。 然后在该自定义下面: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 }
当从XML布局创build视图时,将从资源包中读取XML标记中的所有属性,并将其作为AttributeSet
传递给视图的构造函数
虽然可以直接从AttributeSet
读取值,但这样做有一些缺点:
- 属性值中的资源引用不被parsing
- 样式不适用
而是将AttributeSet
传递给obtainStyledAttribute()
。 此方法返回已被TypedArray
和devise的TypedArray
数组值。