La clase TypedArray obtiene atributos

AttributeSet
AttributeSet es una colección de atributos de elementos en el archivo xml. Proporciona varias API para que podamos obtener valores de atributos de archivos xml compilados, como getAttributeIntValue, getAttributeBooleanValue, getAttributeFloatValue, etc., que devolverán el tipo correspondiente de valor de atributo. Los parámetros entrantes generalmente tienen dos formas, de la siguiente manera:

getAttributeXXXValue (int index, XXX defaultValue): obtenga el valor del atributo correspondiente de acuerdo con el índice del atributo correspondiente. El rango del valor del índice está entre 0 ~ count-1 y no se puede encontrar el valor predeterminado
. Obtenga el valor del atributo correspondiente de acuerdo con el nombre del atributo del espacio de nombres especificado

Sin embargo, raramente usamos los métodos proporcionados por la clase AttributeSet para obtener sus atributos, a menudo a través del método Theme.obtainStyledAttributes para obtener los atributos.

Por qué ? Ejemplo usando el atributo en el archivo xml para obtener atributos

<?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"/>

Si usa AttributeSet directamente para obtener el valor del atributo, tiene las siguientes desventajas:

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);

Obtener atributos de elementos a través del índice índice es bastante problemático, y es difícil para las personas que no están familiarizadas con el orden de los atributos hacer coincidir el índice con los valores de los atributos uno por uno; al obtener a través del espacio de nombres, debe completar el espacio de nombres de Android "http: //schemas.android.com/apk/res/android ", no es muy conveniente escribir.
Para" @ String / hello_world "este tipo de valor de atributo se obtiene al indexar el archivo de recursos, y solo el recurso se obtiene directamente por getAttributeValue id, aunque puede obtener el id a través de getAttributeResourceValue y obtener el valor del atributo correspondiente a través de la clase Resources, pero habrá varios pasos de operación.

Echemos un vistazo a cómo obtener el valor de la propiedad usando TypedArray. TypedArray es un contenedor para almacenar matrices de valores de atributos. Por lo general, TypedArray se obtiene de la siguiente manera:

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

AttributeSet set: indica que el atributo se selecciona de AttributeSet, que puede estar vacío
int [] attrs: indica el atributo que desea seleccionar, qué atributos desea obtener, puede escribirlo en esta matriz de
int int defStyleAttr: indica que el atributo está seleccionado de defStyleAttr , Puede estar vacío
int defStyleRes: indica que los atributos seleccionados de defStyleRes, pueden estar vacíos

El uso específico es el siguiente

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 proporciona varias API, como getInteger, getString, getDimension y otros métodos para obtener valores de atributo. Estos métodos requieren el índice de posición de la matriz int correspondiente al nombre del atributo en getStyledAttributes.

16 artículos originales publicados · Me gusta0 · Visitas 854

Supongo que te gusta

Origin blog.csdn.net/weixin_45830683/article/details/103016202
Recomendado
Clasificación