Sobes.tech
Middle

¿Cómo vincular una vista personalizada con un diseño personalizado?

sobes.tech AI

Respuesta de la IA

Hay varias formas:

  1. Uso del constructor con un conjunto de atributos AttributeSet: Esta es la forma más común. En el constructor de View, puedes leer los atributos del marcado XML y aplicarlos.

    public class MyCustomView extends View {
    
        public MyCustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // Leer atributos de attrs
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
            // Obtener valores de atributos, por ejemplo:
            // int someValue = a.getInt(R.styleable.MyCustomView_someAttribute, defaultValue);
            a.recycle(); // Es importante liberar TypedArray
    
            // Inicializar la vista basada en los atributos leídos
            // ...
        }
    
        // ... otros constructores y métodos
    }
    

    Al definir un layout personalizado en XML, puedes usar estos atributos:

    <com.example.app.MyCustomView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:someAttribute="someValue" />
    
  2. Inflado del layout dentro de la vista: Si la vista consiste en varias otras vistas, puedes inflarlas desde un archivo XML separado dentro de la vista personalizada.

    public class MyCompositeView extends LinearLayout {
    
        public MyCompositeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            LayoutInflater.from(context).inflate(R.layout.my_custom_layout, this, true);
            // Ahora puedes encontrar elementos dentro de my_custom_layout
            // TextView myTextView = findViewById(R.id.myTextView);
            // ...
        }
    
        // ... otros constructores y métodos
    }
    

    my_custom_layout.xml podría verse así:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/myTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="¡Hola, diseño personalizado!" />
    
        <!-- otros elementos del layout -->
    
    </LinearLayout>
    

    Luego, este layout personalizado MyCompositeView se usa en otro archivo XML:

    <com.example.app.MyCompositeView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    

La elección del método depende de la complejidad de la vista personalizada: para vistas simples con pocos elementos, el primer método es suficiente; para vistas compuestas con estructura interna más compleja, el segundo método es más adecuado.