¿Cómo funciona el trabajo "? Android: attr / activatedBackgroundIndicator"?

Estaba buscando cómo resaltar un elemento seleccionado en una lista cuando se muestra una barra de acción contextual para la selección, y la solución que encontré fue establecer el atributo android:background de mi xml de diseño de fila a "?android:attr/activatedBackgroundIndicator" .

¿Cómo funciona este trabajo sin embargo?

  1. ¿Cuál es el mecanismo involucrado?
  2. ¿Qué significan los elementos de sintaxis como "?", "Attr", "activatedBackgroundIndicator"?
  3. ¿Dónde está definido el significado de "activatedBackgroundIndicator"?

Si usted está en un estado de ánimo forense aquí es cómo cavar y averiguar qué está pasando.

 android:background="?android:attr/activatedBackgroundIndicator"? 

Intuitivamente esto significa establecer el fondo a algunos dibujable.

Pero vamos a descomponer esto más allá para ver cómo llegamos a nuestro misterioso dibujable.

Para ser exactos significa "fijar el atributo del fondo a lo que el atributo" activatedBackgroundIndicator " refiere en el tema actual .

Si entiendes "se refiere a la parte del tema actual", básicamente has entendido todo lo que está sucediendo detrás de las tapas.

Básicamente, activateBackgroundIndicator no es un dibujable real sino una referencia a un drawable . Entonces, ¿dónde está el atributo "activateBackgroundIndictor" realmente definido?

Está definido en su directorio sdk en un nombre de archivo attrs.xml . Por ejemplo:

Path_to_android_sdk / plataformas / android-17 / data / res / values ​​/ attrs.xml

Si abre ese archivo, hará la declaración de la siguiente manera:

 <attr name="activatedBackgroundIndicator" format="reference" /> 

Attrs.xml es donde usted declara todos los atributos que va a utilizar más adelante en su vista xml. Tenga en cuenta que estamos declarando el atributo y su tipo y no realmente asignar un valor aquí .

El valor real se asigna en themes.xml . Este archivo se encuentra en:

Path_to_android_sdk / plataformas / android-17 / data / res / values ​​/ themes.xml

Si abre ese archivo, verá las múltiples definiciones en función del tema que esté utilizando . Por ejemplo, aquí están las definiciones de los temas nombre Tema, Theme.Light, Theme.Holo, Theme.Holo.Light respectivamente:

 <item name="activatedBackgroundIndicator">@android:drawable/activated_background</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item> 

Ahora tenemos nuestros misteriosos dibujos. Si selecciona el primero, se define en la carpeta dibujable en:

Path_to_android_sdk / plataformas / android-17 / data / res / drawable / activated_background.xml

Si abre ese archivo verá la definición de lo dibujable que es importante para entender lo que está pasando.

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" /> <item android:drawable="@color/transparent" /> </selector> 

Aquí estamos definiendo un drawable con dos estados – el estado del defecto es apenas fondo transparente y si el estado es "state_activated" entonces nuestro drawable es "list_selector_background_selected".

Vea este enlace para obtener información de antecedentes sobre los documentos y los estados.

"List_selector_background_selected" es un archivo png de 9 png que se encuentra en la carpeta drawable-hdpi.

Ahora puedes ver por qué hemos definido a activateBackgroundIndicator como una referencia en lugar de vincular directamente al archivo dibujable, que te permite elegir el dibujable adecuado dependiendo de tu tema.

Me pregunté esto también en un punto. Una gran cantidad de los recursos de Android parecen ser como una caja negra y no se pueden ver directamente. Puedo faltarlos en algún lugar, pero no puedo encontrarlos en el código fuente del SDK. Esto es lo que sí sé.

  • android:background tomará un drawable.
  • La sintaxis está en el estilo

    Debe ser una referencia a otro recurso, en la forma "@ [+] [package:] type: name" o a un atributo del tema en la forma "? [Package:] [type:] name"

En este caso el ? Significa mirar un tema en paquete android y es de tipo attr donde se activatedBackgroundIndicator .

Usted debe ser capaz de acceder a esto en el code-behind con android.R.attr.activatedBackgroundIndicator también.

Una lista de propiedades de Android attr se puede encontrar en R.attr

  • activatedBackgroundIndicator es un dibujo definido en Android 3.0+ como

    Dibujable utilizado como fondo para los elementos activados.

Es básicamente sólo un elemento estándar definido en el sistema operativo. No puedo encontrarme en la fuente de Android, pero aquí hay un enlace a la documentación. ActivatedBackgroundIndicator

Esta es una forma de adjuntar un valor a un tema. El valor no se conoce técnicamente durante la compilación de recursos porque los valores de tema pueden no ser conocidos en ese momento. En su lugar, el valor se resuelve en tiempo de ejecución basado en el tema real tomado de (más comúnmente) ContextThemeWrapper .

Esto proporciona una forma de reutilizar los valores de recursos. No estoy hablando de rendimiento en este caso, sino más bien la organización y el mantenimiento. El atributo actúa como una variable con la promesa de que contendrá un valor real en tiempo de ejecución.

Este enfoque también permite una mayor personalización – en lugar de hardcoding el valor de, por ejemplo, el fondo de la ventana dibujable que obtiene el actual estirable de un tema, el suministro de un atributo elegido como la clave. Esto le permite anular el valor de ese atributo. Sólo tiene que:

  1. Cree su propio tema (que es sólo un nombre de fantasía para un recurso de "estilo"), más comúnmente derivado de uno de los temas predeterminados.
  2. Suministre su propio valor para el atributo en cuestión.

La plataforma utilizará automáticamente su valor siempre que haya especificado el tema para una actividad o aplicación. Haces esto como se describe en la pregunta. La sintaxis general de las referencias de atributo de tema se describe aquí: Referencia de atributos de estilo . También encontrará un ejemplo y una descripción de todo el mecanismo allí.

Editar

Una cosa que debe tenerse en cuenta son los nombres reales de los atributos y su existencia en varias versiones de plataformas. Es bastante común que se introduzcan nuevos atributos en las versiones siguientes de la plataforma; por ejemplo, algunos se agregaron en la versión 3.0 con el propósito de diseñar ActionBar.

Debe tratar los nombres de los atributos como parte de la API; en otras palabras, son parte del contrato que se le permite usar. Esto es muy similar a las clases y sus firmas – se utiliza la clase LocationManager con el fin de obtener la ubicación del último dispositivo porque usted sabe de alguna fuente (tutoriales, referencia, guías oficiales, etc) cuál es el propósito de esta clase. Del mismo modo, los nombres de los atributos y su propósito son (a veces bien, a veces miserablemente) definidos en la documentación de la Plataforma Android.

Numan salati ya ofreció una respuesta perfecta, pero no ha abordado el "?" sintaxis. He aquí una cita de la Guía del API que accede a los recursos

Para hacer referencia a un atributo de estilo, la sintaxis de nombre es casi idéntica al formato de recurso normal, pero en lugar del símbolo at (@), utilice un signo de interrogación (?) Y la parte de tipo de recurso es opcional. Por ejemplo:

? [<Package_name>:] [<resource_type> /] <resource_name>

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.