Android中的AttributeSet是什么?
如何将其用于自定义视图?
答案 0 :(得分:19)
对于其他人来说,虽然有详细的描述,但是回答很晚。
AttributeSet(Android文档)
与XML文档中的标记关联的属性集合。
基本上,如果您尝试创建自定义视图,并且希望传递尺寸,颜色等值,则可以使用AttributeSet
执行此操作。
想象一下,您想要创建一个View
,如下所示
有一个黄色背景的矩形,里面有一个圆圈,比方说半径为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
数组值。