Sobes.tech
Middle

¿Cómo agregar atributos personalizados para una vista personalizada en Android?

sobes.tech AI

Respuesta de la IA

  1. Definición de atributos en attrs.xml: Se crea el archivo res/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>  
    
  2. 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"/>  
    
  3. Lectura de atributos en el código de la vista: En el constructor de la vista personalizada (generalmente en el que recibe Context y AttributeSet), se usan las clases TypedArray y obtainStyledAttributes para 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 obtainStyledAttributes devuelve un TypedArray, 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 a recycle() para liberar recursos.