什么是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数组值。