什么是AttributeSet以及如何使用它?

时间:2011-03-15 19:07:03

标签: android attributes view

Android中的AttributeSet是什么?

如何将其用于自定义视图?

4 个答案:

答案 0 :(得分:19)

对于其他人来说,虽然有详细的描述,但是回答很晚。

AttributeSet(Android文档)

  

与XML文档中的标记关联的属性集合。

基本上,如果您尝试创建自定义视图,并且希望传递尺寸,颜色等值,则可以使用AttributeSet执行此操作。

这是一个例子

想象一下,您想要创建一个View,如下所示

enter image description here

有一个黄色背景的矩形,里面有一个圆圈,比方说半径为5dp,绿色背景。如果您希望视图通过XML获取背景颜色和半径的值,请执行以下操作:

<com.anjithsasindran.RectangleView
    app:radiusDimen="5dp"
    app:rectangleBackground="@color/yellow"
    app:circleBackground="@color/green" />

那就是使用AttributeSet的地方。您可以在values文件夹中包含此文件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 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()
    }
}

现在我们可以在xml布局中使用这些属性到RectangleView,我们将在RectangleView构造函数中获取这些值。

app:radius_dimen
app:circle_background
app:rectangle_background

答案 1 :(得分:6)

AttributeSet是xml资源文件中指定的属性集。您不必在自定义视图中执行任何特殊操作。调用View(Context context, AttributeSet attrs)来初始化布局文件中的视图。只需将此构造函数添加到自定义视图即可。查看SDK中的Custom View示例,了解其使用情况。

答案 2 :(得分:6)

您可以使用AttributeSet为您在xml中定义的视图获取额外的自定义值。例如。有一个关于Defining Custom Attributes的教程,其中指出“可以直接从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。然后在该自定义下面: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
}

答案 3 :(得分:0)

从XML布局创建视图时,XML标记中的所有属性都从资源包中读取,并作为AttributeSet

传递给视图的构造函数

虽然可以直接从AttributeSet读取值,但这样做有一些缺点:

  • 未解析属性值中的资源引用
  • 未应用样式

而是将AttributeSet传递给obtainStyledAttribute()。此方法传回已经引用并设置样式的TypedArray数组值。