Blog para desarrollo de aplicaciones en Android, aprende paso a paso como crear aplicaciones.

Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus h谩bitos de navegaci贸n para mostrarle publicidad personalizada y realizar an谩lisis de uso de nuestro sitio.
Si contin煤a navegando consideramos que acepta su uso. OK M谩s informaci贸n | Y m谩s

C贸mo Crear Chips en Android con Material Design

C贸mo Crear Chips en Android con Material Design
C贸mo Crear Chips en Android con Material Design

Hola amigos 馃憢 Bienvenidos a un nuevo tutorial de Universo Android. Hoy aprenderemos a crear Chips en Android utilizando Material Design, uno de los componentes m谩s vers谩tiles y modernos para mostrar informaci贸n compacta e interactiva.

Al finalizar este tutorial tendr谩s una aplicaci贸n que incluir谩:

  • Chips con diferentes estilos (Entry, Filter, Choice, Action)
  • Chips con iconos y avatares
  • Chips seleccionables y eliminables
  • ChipGroup para agrupar m煤ltiples chips
  • Validaci贸n y manejo de eventos
  • Dise帽o profesional con Material Design

馃煩 1. ¿Qu茅 son los Chips en Android?

Los Chips son elementos compactos que representan una entrada, atributo o acci贸n. Se utilizan para mostrar informaci贸n de manera visual, permitir selecciones m煤ltiples, filtrar contenido o representar contactos y etiquetas.

馃煩 2. Tipos de Chips

Material Design ofrece 4 tipos principales:

  • Entry Chip: Representa informaci贸n ingresada (contactos, etiquetas)
  • Filter Chip: Permite filtrar contenido (categor铆as, opciones)
  • Choice Chip: Permite selecci贸n 煤nica (similar a RadioButton)
  • Action Chip: Ejecuta una acci贸n espec铆fica

馃煩 3. Crear el Proyecto en Android Studio

Creamos un nuevo proyecto en Android Studio con Empty Activity.

馃煩 4. Agregar la Dependencia de Material Design

Abre el archivo build.gradle (Module: app) y agrega:

dependencies {
    implementation 'com.google.android.material:material:1.9.0'
}

Sincroniza el proyecto despu茅s de agregar la dependencia.

馃煩 5. Dise帽o XML con Chips

Crea un archivo llamado:

馃搫 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <!-- T铆tulo: Action Chips -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Action Chips"
            android:textSize="18sp"
            android:textStyle="bold"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="8dp" />

        <!-- Action Chips -->
        <com.google.android.material.chip.ChipGroup
            android:id="@+id/chipGroupAction"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleLine="false">

            <com.google.android.material.chip.Chip
                android:id="@+id/chipCamera"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="C谩mara"
                app:chipIcon="@android:drawable/ic_menu_camera"
                style="@style/Widget.MaterialComponents.Chip.Action" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipGallery"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Galer铆a"
                app:chipIcon="@android:drawable/ic_menu_gallery"
                style="@style/Widget.MaterialComponents.Chip.Action" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipShare"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Compartir"
                app:chipIcon="@android:drawable/ic_menu_share"
                style="@style/Widget.MaterialComponents.Chip.Action" />

        </com.google.android.material.chip.ChipGroup>

        <!-- T铆tulo: Filter Chips -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Filter Chips"
            android:textSize="18sp"
            android:textStyle="bold"
            android:layout_marginTop="24dp"
            android:layout_marginBottom="8dp" />

        <!-- Filter Chips -->
        <com.google.android.material.chip.ChipGroup
            android:id="@+id/chipGroupFilter"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleLine="false"
            app:selectionRequired="false">

            <com.google.android.material.chip.Chip
                android:id="@+id/chipAndroid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Android"
                android:checkable="true"
                app:chipIcon="@android:drawable/ic_menu_info_details"
                style="@style/Widget.MaterialComponents.Chip.Filter" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipJava"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Java"
                android:checkable="true"
                style="@style/Widget.MaterialComponents.Chip.Filter" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipKotlin"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Kotlin"
                android:checkable="true"
                style="@style/Widget.MaterialComponents.Chip.Filter" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipFirebase"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Firebase"
                android:checkable="true"
                style="@style/Widget.MaterialComponents.Chip.Filter" />

        </com.google.android.material.chip.ChipGroup>

        <!-- T铆tulo: Choice Chips -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Choice Chips (Selecci贸n 煤nica)"
            android:textSize="18sp"
            android:textStyle="bold"
            android:layout_marginTop="24dp"
            android:layout_marginBottom="8dp" />

        <!-- Choice Chips -->
        <com.google.android.material.chip.ChipGroup
            android:id="@+id/chipGroupChoice"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleLine="false"
            app:singleSelection="true"
            app:selectionRequired="true">

            <com.google.android.material.chip.Chip
                android:id="@+id/chipSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Peque帽o"
                android:checkable="true"
                style="@style/Widget.MaterialComponents.Chip.Choice" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipMedium"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Mediano"
                android:checkable="true"
                android:checked="true"
                style="@style/Widget.MaterialComponents.Chip.Choice" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipLarge"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Grande"
                android:checkable="true"
                style="@style/Widget.MaterialComponents.Chip.Choice" />

        </com.google.android.material.chip.ChipGroup>

        <!-- T铆tulo: Entry Chips -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Entry Chips (Eliminables)"
            android:textSize="18sp"
            android:textStyle="bold"
            android:layout_marginTop="24dp"
            android:layout_marginBottom="8dp" />

        <!-- Entry Chips -->
        <com.google.android.material.chip.ChipGroup
            android:id="@+id/chipGroupEntry"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleLine="false">

            <com.google.android.material.chip.Chip
                android:id="@+id/chipUser1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Juan P茅rez"
                app:chipIcon="@android:drawable/ic_menu_myplaces"
                app:closeIconEnabled="true"
                style="@style/Widget.MaterialComponents.Chip.Entry" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipUser2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Mar铆a Garc铆a"
                app:chipIcon="@android:drawable/ic_menu_myplaces"
                app:closeIconEnabled="true"
                style="@style/Widget.MaterialComponents.Chip.Entry" />

            <com.google.android.material.chip.Chip
                android:id="@+id/chipUser3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Carlos L贸pez"
                app:chipIcon="@android:drawable/ic_menu_myplaces"
                app:closeIconEnabled="true"
                style="@style/Widget.MaterialComponents.Chip.Entry" />

        </com.google.android.material.chip.ChipGroup>

        <!-- Bot贸n para mostrar selecci贸n -->
        <Button
            android:id="@+id/btnShowSelection"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Mostrar Selecci贸n"
            android:layout_marginTop="24dp" />

        <!-- TextView para mostrar resultados -->
        <TextView
            android:id="@+id/txtResult"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Resultados aparecer谩n aqu铆"
            android:textSize="16sp"
            android:padding="16dp"
            android:layout_marginTop="16dp"
            android:background="#F5F5F5" />

    </LinearLayout>

</ScrollView>

馃煩 6. L贸gica Java para Chips

馃搫 MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;

public class MainActivity extends AppCompatActivity {

    ChipGroup chipGroupAction, chipGroupFilter, chipGroupChoice, chipGroupEntry;
    Button btnShowSelection;
    TextView txtResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Inicializar vistas
        chipGroupAction = findViewById(R.id.chipGroupAction);
        chipGroupFilter = findViewById(R.id.chipGroupFilter);
        chipGroupChoice = findViewById(R.id.chipGroupChoice);
        chipGroupEntry = findViewById(R.id.chipGroupEntry);
        btnShowSelection = findViewById(R.id.btnShowSelection);
        txtResult = findViewById(R.id.txtResult);

        // Configurar Action Chips
        setupActionChips();

        // Configurar Entry Chips (eliminables)
        setupEntryChips();

        // Bot贸n para mostrar selecci贸n
        btnShowSelection.setOnClickListener(v -> showSelection());
    }

    private void setupActionChips() {
        Chip chipCamera = findViewById(R.id.chipCamera);
        Chip chipGallery = findViewById(R.id.chipGallery);
        Chip chipShare = findViewById(R.id.chipShare);

        chipCamera.setOnClickListener(v -> 
            Toast.makeText(this, "Abrir C谩mara", Toast.LENGTH_SHORT).show()
        );

        chipGallery.setOnClickListener(v -> 
            Toast.makeText(this, "Abrir Galer铆a", Toast.LENGTH_SHORT).show()
        );

        chipShare.setOnClickListener(v -> 
            Toast.makeText(this, "Compartir", Toast.LENGTH_SHORT).show()
        );
    }

    private void setupEntryChips() {
        // Configurar listener para chips eliminables
        for (int i = 0; i < chipGroupEntry.getChildCount(); i++) {
            Chip chip = (Chip) chipGroupEntry.getChildAt(i);
            chip.setOnCloseIconClickListener(v -> {
                chipGroupEntry.removeView(v);
                Toast.makeText(this, "Chip eliminado", Toast.LENGTH_SHORT).show();
            });
        }
    }

    private void showSelection() {
        StringBuilder result = new StringBuilder();

        // Filter Chips seleccionados
        result.append("馃搶 Filtros seleccionados:\n");
        int filterCount = 0;
        for (int i = 0; i < chipGroupFilter.getChildCount(); i++) {
            Chip chip = (Chip) chipGroupFilter.getChildAt(i);
            if (chip.isChecked()) {
                result.append("• ").append(chip.getText()).append("\n");
                filterCount++;
            }
        }
        if (filterCount == 0) {
            result.append("Ninguno\n");
        }

        // Choice Chip seleccionado
        result.append("\n馃幆 Tama帽o seleccionado:\n");
        int selectedId = chipGroupChoice.getCheckedChipId();
        if (selectedId != -1) {
            Chip selectedChip = findViewById(selectedId);
            result.append("• ").append(selectedChip.getText()).append("\n");
        }

        // Entry Chips restantes
        result.append("\n馃懃 Contactos agregados:\n");
        if (chipGroupEntry.getChildCount() == 0) {
            result.append("Ninguno");
        } else {
            for (int i = 0; i < chipGroupEntry.getChildCount(); i++) {
                Chip chip = (Chip) chipGroupEntry.getChildAt(i);
                result.append("• ").append(chip.getText()).append("\n");
            }
        }

        txtResult.setText(result.toString());
    }
}

馃煩 7. Crear Chips Din谩micamente desde Java

Puedes agregar chips program谩ticamente:

private void addChipDynamically(String text) {
    Chip chip = new Chip(this);
    chip.setText(text);
    chip.setChipIcon(getDrawable(android.R.drawable.ic_menu_info_details));
    chip.setCloseIconEnabled(true);
    chip.setCheckable(false);
    
    // Listener para eliminar
    chip.setOnCloseIconClickListener(v -> chipGroupEntry.removeView(v));
    
    // Agregar al ChipGroup
    chipGroupEntry.addView(chip);
}

馃煩 8. Propiedades Importantes de Chips

PropiedadDescripci贸n
app:chipIconIcono al inicio del chip
app:closeIconEnabledHabilita icono de cerrar (X)
android:checkablePermite que el chip sea seleccionable
app:checkedIconIcono cuando est谩 seleccionado
app:chipBackgroundColorColor de fondo del chip
app:chipStrokeColorColor del borde
app:chipStrokeWidthGrosor del borde
app:chipMinHeightAltura m铆nima
app:singleSelectionSelecci贸n 煤nica en ChipGroup
app:selectionRequiredRequiere una selecci贸n

馃煩 9. Personalizar Colores de Chips

Crea un archivo res/color/chip_background_color.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#4CAF50" android:state_checked="true"/>
    <item android:color="#E0E0E0" android:state_checked="false"/>
</selector>

Aplicar en el XML:

<com.google.android.material.chip.Chip
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Personalizado"
    app:chipBackgroundColor="@color/chip_background_color" />

▶️ C贸mo Ejecutar tu Aplicaci贸n

  1. Abre Android Studio
  2. Presiona Run para ejecutar el proyecto
  3. Si no tienes un emulador, crea uno desde AVD Manager
  4. Ver谩s tus Chips funcionando con diferentes estilos y comportamientos

馃И Resultado Final

Tu aplicaci贸n mostrar谩:

  • Action Chips con iconos para ejecutar acciones
  • Filter Chips para selecci贸n m煤ltiple
  • Choice Chips para selecci贸n 煤nica
  • Entry Chips eliminables con icono de cerrar
  • Validaci贸n y visualizaci贸n de selecciones

馃摜 Descargar Proyecto de Ejemplo

Puedes descargar el proyecto completo desde el siguiente enlace:

馃憠 Descargar

馃檶 Gracias por Visitar mi Blog

Si este tutorial te fue 煤til:

✔️ Comp谩rtelo
✔️ D茅jame un comentario
✔️ S铆gueme para m谩s contenido sobre Android y programaci贸n

¡Estoy aqu铆 para ayudarte!

❓ Preguntas Frecuentes (FAQ)

1. ¿Cu谩l es la diferencia entre Chip y Button?
Los Chips son m谩s compactos y vers谩tiles, dise帽ados para representar informaci贸n o filtros. Los Buttons son para acciones principales m谩s destacadas.

2. ¿Puedo usar im谩genes personalizadas en los Chips?
S铆, puedes usar app:chipIcon con tus propios drawables o incluso im谩genes circulares como avatares.

3. ¿C贸mo limito el n煤mero de Chips seleccionados?
Puedes usar un listener en ChipGroup y controlar manualmente cu谩ntos chips est谩n seleccionados, desmarcando el m谩s antiguo.

4. ¿Los Chips son compatibles con versiones antiguas de Android?
S铆, Material Components es compatible desde Android API 14 (Android 4.0) en adelante.

No hay comentarios:

Publicar un comentario