Estoy escribiendo algunas vistas personalizadas que comparten algunos atributos con el mismo nombre. En su <declare-styleable>
sección respectiva , attrs.xml
me gustaría usar los mismos nombres para los atributos:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Recibo un error que dice eso myattr1
y myattr2
ya estoy definido. Descubrí que debería omitir el format
atributo for myattr1
and myattr2
in MyView2
, pero si lo hago, obtengo el siguiente error en la consola:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
¿Hay alguna manera de lograr esto, tal vez algún tipo de espacio de nombres (solo adivinando)?
myattr1
se introducen una cadenaMyView1
y un enteroMyView2
?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr
Por toda la vista que intento declarar. ¿Algunas ideas?<attr name="myattr1" format="string|integer" />
. Funciona para mi.Estoy publicando esta respuesta ya que la solución publicada anteriormente no funcionó para mí en Android Studio. Necesito compartir mis atributos personalizados entre mis vistas personalizadas, así que probé la solución anterior en Android Studio pero no tuve suerte. Entonces experimento y hago un camino para hacerlo. Espero que pueda ayudar a alguien que busca el mismo problema.
Esto funciona para mí por completo. Necesitamos hacer que un padre tenga estilo y luego debemos heredar ese padre con estilo. Por ejemplo, como he hecho anteriormente: Nombre con estilo de los padres MyView y heredé esto a mi otro estilo como MyView1 y MyView2 respectivamente.
fuente
MyView2
correcta:R.styleable.MyView2_myattr1
incorrectaR.styleable.MyView_myattr1
)Como respondió Priya Singhal, Android Studio requiere que los nombres de atributos comunes se definan dentro de su propio nombre de estilo. Ya no pueden estar en la raíz.
Sin embargo, hay un par de otras cosas a tener en cuenta (por eso también estoy agregando una respuesta):
Ejemplo
Esto es lo que hice en un proyecto reciente que tiene dos vistas personalizadas que comparten los mismos atributos. Siempre que las vistas personalizadas sigan teniendo los nombres de los atributos y no incluyan un
format
, todavía puedo acceder a ellos de forma normal desde el código.Ejemplo simplificado
De hecho, ni siquiera necesito poner los atributos bajo un nombre personalizado. Siempre que los defina (déles un
format
) para al menos una vista personalizada, puedo usarlos en cualquier lugar (sin elformat
). Entonces esto también funciona (y se ve más limpio):Sin embargo, para un proyecto grande, esto podría ser complicado y definirlos en la parte superior en una sola ubicación podría ser mejor (como se recomienda aquí ).
fuente
parent
atributo, pero no he visto muchas publicaciones que sugieran su uso.parent
. Creo que solo decía que no era necesario.Gracias Lewis, tuve el mismo problema, y su solución de herencia me dio la pista para hacerlo como se muestra a continuación y funciona bien. Acabo de declarar atributos comunes en lo anterior y volver a escribirlo en el cuerpo de la declaración de estilo sin formato. Espero que esto ayude a alguien
fuente
En caso de que alguien aún se quede con este problema después de probar la solución disponible. Me quedé con agregar
subtitle
atributo constring
formato.Mi solución es eliminar el formato.
antes de:
<attr name="subtitle" format="string"/>
después:
<attr name="subtitle"/>
fuente