![]() |
| 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
| Propiedad | Descripci贸n |
|---|---|
app:chipIcon | Icono al inicio del chip |
app:closeIconEnabled | Habilita icono de cerrar (X) |
android:checkable | Permite que el chip sea seleccionable |
app:checkedIcon | Icono cuando est谩 seleccionado |
app:chipBackgroundColor | Color de fondo del chip |
app:chipStrokeColor | Color del borde |
app:chipStrokeWidth | Grosor del borde |
app:chipMinHeight | Altura m铆nima |
app:singleSelection | Selecci贸n 煤nica en ChipGroup |
app:selectionRequired | Requiere 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
- Abre Android Studio
- Presiona Run para ejecutar el proyecto
- Si no tienes un emulador, crea uno desde AVD Manager
- 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