¿Cómo agregar atributos personalizados para una vista personalizada en Android?
sobes.tech AI
Respuesta de la IA
-
Definición de atributos en
attrs.xml: Se crea el archivores/values/attrs.xml(o se añade a uno existente). En él se define<declare-styleable>con el nombre de la vista personalizada y se enumeran<attr>para cada atributo personalizado, indicando su formato (format).<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustomView"> <attr name="customText" format="string"/> <attr name="customColor" format="color"/> <attr name="customEnabled" format="boolean"/> </declare-styleable> </resources> -
Uso de atributos en el diseño XML: En el diseño XML donde se usa la vista personalizada, se añaden atributos específicos usando el espacio de nombres
app.<com.example.MyCustomView android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" app:customText="Hola Vista Personalizada" app:customColor="@color/colorPrimary" app:customEnabled="true"/> -
Lectura de atributos en el código de la vista: En el constructor de la vista personalizada (generalmente en el que recibe
ContextyAttributeSet), se usan las clasesTypedArrayyobtainStyledAttributespara leer los valores de los atributos especificados en XML.class MyCustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr) { // Variables para almacenar los valores de los atributos private var customText: String? = null private var customColor: Int = 0 private var customEnabled: Boolean = false init { // Obtención de TypedArray con los atributos val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, 0) try { // Lectura de los valores de los atributos customText = typedArray.getString(R.styleable.MyCustomView_customText) customColor = typedArray.getColor(R.styleable.MyCustomView_customColor, 0) // Valor por defecto customEnabled = typedArray.getBoolean(R.styleable.MyCustomView_customEnabled, false) // Valor por defecto // Ahora se pueden usar customText, customColor y customEnabled para configurar la vista // Por ejemplo: // if (customEnabled) { /* ... */ } } finally { // ¡Importante! Liberar recursos llamando a recycle() typedArray.recycle() } } // ... resto de la lógica de la vista ... }El método
obtainStyledAttributesdevuelve unTypedArray, del cual se pueden extraer los valores de los atributos por sus índices (generados por la clase R). Después de usarlos, es necesario llamar arecycle()para liberar recursos.