studio programacion herramientas fundamentos con avanzado aplicaciones android styles declare-styleable

programacion - manual de android en pdf



Diferencia entre declarar estilo y estilo. (2)

Compruebe este thread .

Sin la declare-styleable , no sería posible crear un nuevo estado dibujable personalizado.

He empezado a jugar con estilos y cosas así en mis aplicaciones de Android, y he conseguido que todo funcione hasta ahora. Entendí bastante la sección de ''estilo'' de la guía .

Pero, mirando a mi alrededor, como en este hilo , realmente no puedo entender la diferencia entre los dos ( declare-stylable y style ). A mi entender, declare-styleable toma el atributo especificado en él y lo especifica como styleable, y luego desde el código uno lo cambia como quiera.

Pero si esto es lo que realmente hace, ¿no sería más simple simplemente definir el atributo en el diseño? ¿O declarar un estilo especificándolo?


Creo que solo existe la siguiente diferencia entre declarar un atributo como styleable o no.

En attrs.xml puede declarar atributos personalizados, ya sea directamente dentro de la sección "recursos" o dentro de "declarar-styleable":

<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="attrib1" format="string" /> <declare-styleable name="blahblah"> <attr name="attrib2" format="string" /> </declare-styleable>

Así que ahora definimos "attrib1" como no styleable y "attrib2" como styleable.

En layout/someactivity.xml podemos usar estos atributos directamente (no se necesita espacio de nombres):

<com.custom.ViewClass attrib1="xyz" attrib2="abc"/>

Puede usar el atributo "styleable" "attrib2" dentro de una declaración style.xml . De nuevo, aquí no se necesita ningún espacio de nombres (incluso si se usó un espacio de nombres en el diseño XML).

<style name="customstyle" parent="@android:style/Widget.TextView"> <item name="attrib2">text value</item> <!-- customize other, standard attributes too: --> <item name="android:textColor">@color/white</item> </style>

A continuación, también puede establecer los atributos por estilo.

<com.custom.CustomView attrib1="xyz" style="@style/customstyle"/>

Supongamos que hacemos esto: establecemos attrib1 directamente en XML, y establecemos attrib2 en un estilo.

En otros lugares, he visto descripciones que indican que " blahblah " debe ser el nombre de la clase de vista personalizada que usa estos atributos, y que necesita usar un espacio de nombres para referirse a sus atributos personalizados en el diseño XML. Pero nada de esto parece ser necesario.

La diferencia entre styleable y no styleable parece ser que:

  • Puede usar atributos de estilo en las declaraciones de " style.xml ".
  • El constructor de la clase personalizada necesita leer los atributos de estilo y los que no tienen estilo de una manera diferente: los atributos de estilo con obtainStyledAttributes() y los atributos sin estilo con attr.getAttributeValue() o similar.

En la mayoría de los tutoriales y ejemplos que he visto en la Web, solo se usó obtainStyledAttributes() . Sin embargo, esto no funciona con los atributos declarados directamente en el diseño, sin utilizar un estilo. Si obtainStyledAttributes() como se muestra en la mayoría de los tutoriales, no obtendrá el atributo attrib1 en absoluto; solo obtendrás attrib2 ya que fue declarado en el estilo. El método directo que usa attr.getAttributeValue() funciona:

public CustomView(Context context, AttributeSet attrs) { super(context, attrs); String attrib1 = attrs.getAttributeValue(null, "attrib1"); // do something with this value }

Como no usamos ningún espacio de nombres para declarar " attrib1 ", pasamos null como el argumento de espacio de nombres en getAttributeValue() .