theme tema style studio cambiar apptheme aplicacion android android-layout android-xml android-styles

tema - theme editor android studio



Atributos personalizados en styles.xml (5)

¡Me lo imaginé! La respuesta es NO especificar el espacio de nombres en el estilo.

<?xml version="1.0" encoding="utf-8" ?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="CustomStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="custom_attr">value</item> <!-- tee hee --> </style> </resources>

He creado un widget personalizado y lo estoy declarando en layout.xml. También agregué algunos atributos personalizados en attr.xml. Sin embargo, cuando trato de declarar estos atributos en un estilo en styles.xml, me da No resource found that matches the given name: attr ''custom:attribute''.

He puesto xmlns:custom="http://schemas.android.com/apk/res/com.my.package" en todas las etiquetas en styles.xml, incluidos <?xml> , <resources> , y <style> , pero todavía me da el mismo error, que no puede encontrar mi espacio de nombres XML personalizado.

Sin embargo, puedo usar mi espacio de nombres para asignar atributos manualmente a la vista en mi layout.xml, por lo que no hay nada de malo en el espacio de nombres. Mi problema radica en hacer que styles.xml tenga conocimiento de mi attr.xml.


En caso de que ayude a alguien más, mi error fue que mi clase de vista personalizada estaba llamando a AttributeSet.getAttributeValue por ejemplo

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

... lo que provocaba que no se leyera mi atributo personalizado para mi vista personalizada.

La solución fue usar obtainStyledAttributes en mi vista personalizada:

TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable); String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

Una sugerencia de que esto está funcionando correctamente es que puede Ctrl / Apple + hacer clic en R.styleable.MyTextViewStyleable_customFont para ir directamente a la definición de attrs.xml.

Me tomó un tiempo detectar esta diferencia crítica entre mi código y los otros ejemplos, ya que el atributo personalizado funcionó bien cuando se pasó directamente a través del formato XML (en lugar de a través de un estilo).


La modificación de Styler y Vince funcionó para mí. Quería señalar que la explicación de @vince puede no ser del todo exacta.

Para probar la hipótesis de que el atributo de nombre de declare-styleable coincide con el nombre de la clase de vista personalizada nos permite acceder al atributo personalizado sin un espacio de nombre, cambié el nombre de declare-styleable (la vista personalizada se denominó TestViewFont :

<declare-styleable name="TextViewFont2"> <attr name="font" format="integer"/> </declare-styleable>

Luego cambié la llamada obtainStyledAttributes en la vista personalizada para reflejar esto:

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

El código aún se ejecutó. Así que no creo que sea una especie de introspección por el estilo declare-styleable de la clase cuyo nombre lleva el nombre.

Por lo tanto, se me hace creer que cualquier atributo personalizado se puede usar para declarar un estilo sin hacer referencia a un espacio de nombres.

A pesar de todo, gracias por toda la ayuda chicos, resolvió mi problema.


la respuesta anterior se trabajó para mí, intenté un pequeño cambio, declaro estiloable para una clase en el elemento de recursos.

<declare-styleable name="VerticalView"> <attr name="textSize" format="dimension" /> <attr name="textColor" format="color" /> <attr name="textBold" format="boolean" /> </declare-styleable>

en declare-styleable , el atributo de nombre hace referencia a un nombre de clase, por lo que tuve una clase de vista llamada "com.my.package.name.VerticalView", que representaba esta declaración debe usarse en VerticalView o subclases de VerticalView. para que podamos declarar un estilo como este:

<resources> <style name="verticalViewStyle"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">36dip</item> <item name="textSize">28sp</item> <!-- not namespace prefix --> <item name="textColor">#ff666666</item> <item name="textBold">true</item> </style> </resources>

es por eso que no declaramos el espacio de nombres en el elemento resources, todavía funciona.


valores / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <item name="defaultButtonColor">@color/red</item> <item name="defaultButtonHeight">@dimen/dp_100</item> </style>

valores / attrs.xml

<resources> <attr name="defaultButtonColor" format="reference" /> <attr name="defaultButtonHeight" format="reference"/> </resources>

valores / colors.xml

<resources> <color name="red">#f00</color> </resources>

valores / dimens.xml

<resources> <dimen name="dp_100">100dp</dimen> </resources>

Utilizando

<Button android:layout_width="wrap_content" android:layout_height="?attr/defaultButtonHeight" android:text="Button" android:textColor="?attr/defaultButtonColor" />