He creado un widget personalizado y lo estoy declarando en layout.xml. También he agregado algunos atributos personalizados en attr.xml. Sin embargo, cuando intento declarar estos atributos en un estilo en styles.xml, me daNo resource found that matches the given name: attr 'custom:attribute'.
He incluido xmlns:custom="http://schemas.android.com/apk/res/com.my.package"
todas las etiquetas en styles.xml, incluidos <?xml>
, <resources>
y <style>
, pero aún 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 manualmente atributos a la vista en mi layout.xml, por lo que no hay nada de malo en el espacio de nombres. Mi problema radica en que styles.xml conozca mi attr.xml.
fuente
cutsom:xmlns=...
?? no debería serxmlns:cutsom=...
?Respuestas:
¡Me lo imaginé! La respuesta es NO especificar el espacio de nombres en el estilo.
fuente
declare-stylable
lugar de una enumeración. No estoy seguro de por qué las enumeraciones no funcionaban, pero esta solución fue lo suficientemente buena para mí.la respuesta anterior me funcionó, probé un pequeño cambio, declaro estilizable para una clase en el elemento de recursos.
en declare-styleable , el atributo de nombre hacía referencia a un nombre de clase, por lo que tuve una clase de vista llamada "com.my.package.name.VerticalView", representaba que esta declaración 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 de recursos, todavía funciona.
fuente
valores / styles.xml
valores / attrs.xml
valores / colores.xml
valores / dimens.xml
Utilizando
MANIFESTACIÓN
fuente
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 precisa.
Para probar la hipótesis de que el atributo de nombre de la
declare-styleable
coincidencia con el nombre de la clase de vista personalizada nos permite acceder al atributo personalizado sin un espacio de nombres, cambié el nombre dedeclare-styleable
(la vista personalizada se llamóTestViewFont
:Luego cambié la
obtainStyledAttributes
llamada en la vista personalizada para reflejar esto:El código seguía funcionando. Así que no creo que sea algún tipo de introspección por parte
declare-styleable
de la clase que lleva su nombre.Por lo tanto, me hacen creer que cualquier atributo personalizado se puede usar para declarar un estilo sin hacer referencia a un espacio de nombres.
De todos modos, gracias por toda la ayuda chicos, resolvió mi problema.
fuente
declare-styleable
bloque o no. (lo siento, no puedo encontrar la página de referencia para esto ...) Excepto por los atributos delandroid
espacio de nombres, solo debe indicar el nombre del atributo.Definir algunos atributos.
Úselo en el archivo de diseño como
Finalmente úsalo en el archivo de estilo
La diferencia entre el archivo de estilo y el archivo de diseño es que no agregamos prefiexapp:
Pruébalo, que tengas un buen día, esto funciona para mí.
fuente
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
... lo que resultó en que mi atributo personalizado no se leyera en mi vista personalizada.
La solución fue usar
obtainStyledAttributes
en mi vista personalizada:Una pista de que esto funciona correctamente es que puede hacer Ctrl / Apple + hacer clic en el botón
R.styleable.MyTextViewStyleable_customFont
para ir directamente a su 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 diseño XML (en lugar de a través de un estilo).
fuente