Necesito implementar mis propios atributos como en com.android.R.attr
No encontré nada en la documentación oficial, así que necesito información sobre cómo definir estos atributos y cómo usarlos desde mi código.
android
android-resources
android-attributes
Alexander Oleynikov
fuente
fuente
Respuestas:
Actualmente la mejor documentación es la fuente. Puedes echarle un vistazo aquí (attrs.xml) .
Puede definir atributos en el
<resources>
elemento superior o dentro de un<declare-styleable>
elemento. Si voy a usar un atributo en más de un lugar, lo pongo en el elemento raíz. Tenga en cuenta que todos los atributos comparten el mismo espacio de nombres global. Eso significa que incluso si crea un nuevo atributo dentro de un<declare-styleable>
elemento, puede usarse fuera de él y no puede crear otro atributo con el mismo nombre de un tipo diferente.Un
<attr>
elemento tiene dos atributos xmlname
yformat
.name
le permite llamar a algo y esto es como se llega a referirse a ella en el código, por ejemplo,R.attr.my_attribute
. Elformat
atributo puede tener valores diferentes según el 'tipo' de atributo que desee.Puede establecer el formato de múltiples tipos utilizando
|
, por ejemplo,format="reference|color"
.enum
Los atributos se pueden definir de la siguiente manera:flag
los atributos son similares, excepto que los valores necesitan ser definidos para que puedan ser mordidos juntos:Además de los atributos existe el
<declare-styleable>
elemento. Esto le permite definir atributos que una vista personalizada puede usar. Para ello, especifica un<attr>
elemento, si se definió previamente, no especifique elformat
. Si desea reutilizar un atributo de Android, por ejemplo, android: gravity, puede hacerlo de laname
siguiente manera.Un ejemplo de una vista personalizada
<declare-styleable>
:Al definir sus atributos personalizados en XML en su vista personalizada, debe hacer algunas cosas. Primero debe declarar un espacio de nombres para encontrar sus atributos. Hace esto en el elemento de diseño raíz. Normalmente solo hay
xmlns:android="http://schemas.android.com/apk/res/android"
. Ahora también debes agregarxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Ejemplo:
Finalmente, para acceder a ese atributo personalizado, normalmente lo hace en el constructor de su vista personalizada de la siguiente manera.
El fin. :)
fuente
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/…xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
, sin copiar attrs.xml. Tenga en cuenta que la ruta URI del espacio de nombres debe ser / apk / * lib * not / apk / res.apk/lib
truco no funcionó para mí en atributos personalizados con formato de referencia de un proyecto de biblioteca. Lo que sí funcionó fue usarapk/res-auto
, como se sugiere en stackoverflow.com/a/13420366/22904 justo debajo y también en stackoverflow.com/a/10217752enum
yflag
: el primero nos permite elegir un único valor, el segundo nos permite combinar varios. Escribí una respuesta más larga en una pregunta similar aquí , y ahora que he encontrado esta pregunta, pensé que vincularía a eso.a.recycle()
es muy importante aquí para liberar memoriaLa respuesta de Qberticus es buena, pero falta un detalle útil. Si está implementando estos en una biblioteca, reemplace:
con:
De lo contrario, la aplicación que usa la biblioteca tendrá errores de tiempo de ejecución.
fuente
La respuesta anterior cubre todo con gran detalle, aparte de un par de cosas.
Primero, si no hay estilos, la
(Context context, AttributeSet attrs)
firma del método se usará para instanciar la preferencia. En este caso, solo usecontext.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
para obtener el TypedArray.En segundo lugar, no cubre cómo tratar con los recursos naturales (cadenas de cantidad). No se pueden tratar con TypedArray. Aquí hay un fragmento de código de mi SeekBarPreference que establece el resumen de la preferencia formateando su valor de acuerdo con el valor de la preferencia. Si el xml para la preferencia establece android: summary en una cadena de texto o una cadena de recursos, el valor de la preferencia está formateado en la cadena (debe tener% d, para recoger el valor). Si android: summary está configurado como un recurso plaural, entonces se usa para formatear el resultado.
notifyChanged()
alonDialogClosed
método de preferencia .fuente
El enfoque tradicional está lleno de código repetitivo y manejo de recursos torpe. Es por eso que hice el framework Spyglass . Para demostrar cómo funciona, aquí hay un ejemplo que muestra cómo hacer una vista personalizada que muestre un título de Cadena.
Paso 1: crea una clase de vista personalizada.
Paso 2: defina un atributo de cadena en el
values/attrs.xml
archivo de recursos:Paso 3: aplique la
@StringHandler
anotación alsetTitle
método para indicarle al marco de Spyglass que enrute el valor del atributo a este método cuando la vista se infla.Ahora que su clase tiene una anotación Spyglass, el marco Spyglass lo detectará en tiempo de compilación y generará automáticamente la
CustomView_SpyglassCompanion
clase.Paso 4: use la clase generada en el
init
método de la vista personalizada :Eso es. Ahora, cuando crea una instancia de la clase desde XML, el compañero Spyglass interpreta los atributos y realiza la llamada al método requerido. Por ejemplo, si inflamos el siguiente diseño
setTitle
, se llamará con"Hello, World!"
el argumento.El marco no se limita a los recursos de cadena tiene muchas anotaciones diferentes para manejar otros tipos de recursos. También tiene anotaciones para definir valores predeterminados y para pasar valores de marcador de posición si sus métodos tienen múltiples parámetros.
Eche un vistazo al repositorio de Github para obtener más información y ejemplos.
fuente
android:title="@{"Hello, world!"}"
.si omite el
format
atributo delattr
elemento, puede usarlo para hacer referencia a una clase de diseños XML.Refactor > Rename
trabajosFind Usages
trabajosno especifique un
format
atributo en ... / src / main / res / values / attrs.xmlúselo en algún archivo de diseño ... / src / main / res / layout / activity__main_menu.xml
analizar la clase en su código de inicialización de vista ... / src / main / java /.../ MyCustomView.kt
fuente