Atributos personalizados en styles.xml

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 tags en styles.xml, incluidos , , y , 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.

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

     

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

      

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 statement debe usarse en VerticalView o subclases de VerticalView. para que podamos declarar un estilo como este:

    

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

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 :

    

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.

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

valores / styles.xml

  

valores / attrs.xml

     

valores / colors.xml

  #f00  

valores / dimens.xml

  100dp  

Utilizando

  

enter image description here

MANIFESTACIÓN