什么是AttributeSet,我该如何使用?


Answers:


25

对于其他人,尽管提供了详细的说明,但答案较晚。

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

2
为什么在中提供一个整数值 getDimensionInPixel(50)
Daksh Gargas

2
感谢您的漂亮回答,这很容易理解。要提供此答案,需要提供一些更有用的信息。完成后,回收TypedArray。这将使其稍后的调用方可以重新使用。
MuhammedYalçınKuru '18

@MuhammedYalçınKuru好的建议,我已经进行了更改。
capt.swag

9

您可以使用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
}

6

AttributeSet是在xml资源文件中指定的属性集。您不必在自定义视图中做任何特别的事情。在View(Context context, AttributeSet attrs)被调用初始化从布局文件的视图。只需将此构造函数添加到您的自定义视图即可。查看SDK中的“自定义视图”示例以查看其使用情况。


1
不知道示例链接是否曾经显示过实际示例,但是它们总是重定向到同一页面。我经常做的是从SDK的samples文件夹中引用相同的示例。例如,上面引用的示例存在于文件夹中android-sdk\samples\android-17\ApiDemos\src\com\example\android\apis\view
Sundeep

0

从XML布局创建视图时,将从资源束中读取XML标记中的所有属性,并将其作为传递给视图的构造函数。 AttributeSet

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

  • 属性值内的资源引用无法解析
  • 不应用样式

而是传递AttributeSetobtainStyledAttribute()。此方法将返回TypedArray已引用和设置样式的值数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.