TypedArray类获取属性

AttributeSet
AttributeSet是xml文件中元素属性的一个集合。其中提供了各种Api,供我们从已编译好的xml文件获取属性值,如getAttributeIntValue,getAttributeBooleanValue,getAttributeFloatValue等,会返回对应类型的属性值,传入的参数一般有两种形式,如下:

getAttributeXXXValue(int index, XXX defaultValue):根据对应属性的索引获取对应的属性值,index取值范围在0~count-1之间,找不到返回defaultValue
getAttributeXXXValue(String namespace, String attribute, XXX defaultValue):根据指定命名空间的属性名获取对应的属性值,找不到返回defaultValue

但是我们很少用到AttributeSet类提供的方法来获取它的属性,常常都是通过Theme.obtainStyledAttributes方法来获取其中的属性的。

为什么??例子在xml文件利用Attribute获取属性

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="@dimen/w_50dp"
  android:layout_height="@dimen/w_50dp"
  android:orientation="vertical"/>

如果直接使用AttributeSet来获取属性值有以下缺点:

final XmlResourceParser parser = getResources().getLayout(R.layout.ll);
int type;
while ((type = parser.getEventType()) != XmlPullParser.START_TAG
    && type != XmlPullParser.END_DOCUMENT) {
  parser.next();
}
int count = parser.getAttributeCount();
Log.d(TAG, "count: " + parser.getAttributeCount());
AttributeSet attributeSet = Xml.asAttributeSet(parser);
for (int i = 0; i < count; i++) {
  String name = attributeSet.getAttributeName(i);
  String value = attributeSet.getAttributeValue(i);
  Log.d(TAG, "attribute: " + name + "   value: " + value);
}
int resourceId = attributeSet.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "layout_height", 0);
float dimension = getResources().getDimension(resourceId);
Log.d(TAG, "layout_height: " + dimension);

通过索引index获取元素属性颇为麻烦,而且对于属性的顺序不熟悉的人很难将将index和属性值一一对应;而通过命名空间来获取,又要必须填入android的命名空间"http://schemas.android.com/apk/res/android",编写起来都是不太方便的
对于"@String/hello_world"这一类通过索引资源文件获取属性值的,直接通过getAttributeValue获得的只是资源的id,虽然可以通过getAttributeResourceValue获取到id后,通过Resources类来获取对应的属性值,但是这样会有多步的操作。

我们来看看使用TypedArray是如何获取属性值的。TypedArray是一个存放属性值数组的一个容器,通常通过如下方式来获得TypedArray的:

Resources.Theme.obtainStyledAttributes(AttributeSet set,
	@StyleableRes int[] attrs, 
	@AttrRes int defStyleAttr, 
	@StyleRes int defStyleRes)

AttributeSet set:表示从AttributeSet中挑选属性,可以为空
int[] attrs:表示你想挑选的属性,你想得到哪些属性,你就可以将其写到这个int数组中
int defStyleAttr:表示从defStyleAttr中挑选属性,可以为空
int defStyleRes:表示从defStyleRes中挑选属性,可以为空

具体使用如下

TypedArray a = obtainStyledAttributes(attributeSet,
        new int[] { android.R.attr.layout_width, android.R.attr.layout_height});
float width = a.getDimension(0, 0f); //第一个参数表示在int数组中的索引,第二个参数为默认值
Log.d(TAG, "typedarray layout_width: " + width);
float height = a.getDimension(1, 0f); //第一个参数表示在int数组中的索引,第二个参数为默认值
Log.d(TAG, "typedarray layout_width: " + height);

TypedArray提供了各种Api,如getInteger,getString,getDimension等方法来获取属性值,这些方法都需要传入对应属性名在obtainStyledAttributes中的int数组的位置索引。

发布了16 篇原创文章 · 获赞 0 · 访问量 854

猜你喜欢

转载自blog.csdn.net/weixin_45830683/article/details/103016202