Hola amigos 👋 Bienvenidos a un nuevo tutorial de Universo Android. Hoy aprenderemos a usar AlertDialog, uno de los componentes más importantes para la interacción con usuarios en Android. Los diálogos son ventanas emergentes que requieren una acción del usuario antes de continuar.
Al finalizar este tutorial tendrás:
- ✅ AlertDialog básico con botones
- ✅ Diálogos con listas simples y múltiples
- ✅ Diálogos con campos de texto (EditText)
- ✅ Diálogos personalizados con layouts propios
- ✅ Diálogos con imágenes y estilos
- ✅ BottomSheetDialog y DatePickerDialog
- ✅ Material Design 3 aplicado
- ✅ Mejores prácticas y ejemplos reales
🟨 1. ¿Qué es AlertDialog?
AlertDialog es una subclase de Dialog que permite crear ventanas emergentes para mostrar mensajes importantes, confirmar acciones, solicitar información o presentar opciones al usuario. Es fundamental para mejorar la experiencia de usuario (UX) en tus aplicaciones Android.
Componentes principales:
- Título: Encabezado del diálogo (opcional)
- Mensaje: Contenido principal o descripción
- Botones: Positive, Negative, Neutral (hasta 3 botones)
- Vista personalizada: Layout XML propio
Tipos de diálogos más comunes:
- Diálogo de confirmación (Sí/No)
- Diálogo informativo (solo OK)
- Diálogo con lista de opciones
- Diálogo con input de texto
- Diálogo personalizado
- BottomSheetDialog (Material Design)
🟨 2. Crear el Proyecto
- Abre Android Studio
- Crea un nuevo proyecto: Empty Activity
- Nombre:
AlertDialogMasterApp - Package:
com.example.dialogapp - Lenguaje: Java
- Minimum SDK: API 24 (Android 7.0)
🟨 3. Agregar Dependencias
📄 build.gradle (Module: app)
plugins {
id 'com.android.application'
}
android {
namespace 'com.example.dialogapp'
compileSdk 34
defaultConfig {
applicationId "com.example.dialogapp"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
// Para DatePicker y TimePicker modernos
implementation 'com.google.android.material:material:1.11.0'
}🟨 4. Diseño Principal
📄 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:background="#F5F5F5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- Header -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🎯 AlertDialog Master"
android:textSize="28sp"
android:textStyle="bold"
android:textColor="#1976D2"
android:gravity="center"
android:padding="16dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Aprende todos los tipos de diálogos"
android:textSize="14sp"
android:textColor="#666666"
android:gravity="center"
android:layout_marginBottom="24dp" />
<!-- Sección: Diálogos Básicos -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="📋 DIÁLOGOS BÁSICOS"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:layout_marginBottom="12dp" />
<Button
android:id="@+id/btnSimpleDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Diálogo Simple"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnConfirmDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Diálogo de Confirmación"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnThreeButtons"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Diálogo con 3 Botones"
android:textAllCaps="false"
android:layout_marginBottom="24dp" />
<!-- Sección: Diálogos con Listas -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="📝 DIÁLOGOS CON LISTAS"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:layout_marginBottom="12dp" />
<Button
android:id="@+id/btnListDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Lista Simple"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnSingleChoice"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Selección única (RadioButton)"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnMultiChoice"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Selección múltiple (CheckBox)"
android:textAllCaps="false"
android:layout_marginBottom="24dp" />
<!-- Sección: Diálogos con Input -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="✏️ DIÁLOGOS CON INPUT"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:layout_marginBottom="12dp" />
<Button
android:id="@+id/btnInputDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Input de Texto"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnLoginDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Formulario de Login"
android:textAllCaps="false"
android:layout_marginBottom="24dp" />
<!-- Sección: Diálogos Especiales -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🎨 DIÁLOGOS ESPECIALES"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:layout_marginBottom="12dp" />
<Button
android:id="@+id/btnCustomDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Diálogo Personalizado"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnBottomSheet"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="BottomSheet Dialog"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnDatePicker"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Selector de Fecha"
android:textAllCaps="false"
android:layout_marginBottom="8dp" />
<Button
android:id="@+id/btnProgressDialog"
style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Diálogo de Progreso"
android:textAllCaps="false"
android:layout_marginBottom="24dp" />
<!-- Resultado -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="12dp"
app:cardElevation="4dp"
android:layout_marginTop="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="📊 Resultado"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:layout_marginBottom="8dp" />
<TextView
android:id="@+id/txtResult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Presiona un botón para ver el resultado"
android:textSize="14sp"
android:textColor="#666666"
android:minHeight="60dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</ScrollView>🟨 5. Layout Personalizado para Login
📄 res/layout/dialog_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Usuario"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Contraseña"
android:layout_marginTop="16dp"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
app:endIconMode="password_toggle"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>🟨 6. Layout para BottomSheet
📄 res/layout/bottom_sheet_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<View
android:layout_width="40dp"
android:layout_height="4dp"
android:background="#CCCCCC"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Compartir"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="16dp" />
<LinearLayout
android:id="@+id/layoutWhatsApp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="💬"
android:textSize="24sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="WhatsApp"
android:textSize="16sp"
android:layout_marginStart="16dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layoutFacebook"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="📘"
android:textSize="24sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Facebook"
android:textSize="16sp"
android:layout_marginStart="16dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layoutTwitter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🐦"
android:textSize="24sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Twitter"
android:textSize="16sp"
android:layout_marginStart="16dp" />
</LinearLayout>
</LinearLayout>🟨 7. MainActivity - Implementación Completa
📄 MainActivity.java
package com.example.dialogapp;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.textfield.TextInputEditText;
import java.util.ArrayList;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
private TextView txtResult;
private String[] colorsArray = {"Rojo", "Azul", "Verde", "Amarillo", "Naranja"};
private boolean[] checkedItems = {false, false, false, false, false};
private int selectedPosition = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtResult = findViewById(R.id.txtResult);
// Diálogos básicos
findViewById(R.id.btnSimpleDialog).setOnClickListener(v -> showSimpleDialog());
findViewById(R.id.btnConfirmDialog).setOnClickListener(v -> showConfirmDialog());
findViewById(R.id.btnThreeButtons).setOnClickListener(v -> showThreeButtonsDialog());
// Diálogos con listas
findViewById(R.id.btnListDialog).setOnClickListener(v -> showListDialog());
findViewById(R.id.btnSingleChoice).setOnClickListener(v -> showSingleChoiceDialog());
findViewById(R.id.btnMultiChoice).setOnClickListener(v -> showMultiChoiceDialog());
// Diálogos con input
findViewById(R.id.btnInputDialog).setOnClickListener(v -> showInputDialog());
findViewById(R.id.btnLoginDialog).setOnClickListener(v -> showLoginDialog());
// Diálogos especiales
findViewById(R.id.btnCustomDialog).setOnClickListener(v -> showCustomDialog());
findViewById(R.id.btnBottomSheet).setOnClickListener(v -> showBottomSheetDialog());
findViewById(R.id.btnDatePicker).setOnClickListener(v -> showDatePickerDialog());
findViewById(R.id.btnProgressDialog).setOnClickListener(v -> showProgressDialog());
}
// 1. DIÁLOGO SIMPLE
private void showSimpleDialog() {
new AlertDialog.Builder(this)
.setTitle("Mensaje Informativo")
.setMessage("Este es un diálogo simple con información para el usuario.")
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton("Entendido", (dialog, which) -> {
updateResult("Usuario presionó: Entendido");
})
.show();
}
// 2. DIÁLOGO DE CONFIRMACIÓN
private void showConfirmDialog() {
new AlertDialog.Builder(this)
.setTitle("Confirmar Acción")
.setMessage("¿Estás seguro de que deseas eliminar este elemento?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("Sí", (dialog, which) -> {
updateResult("✅ Usuario confirmó la acción");
Toast.makeText(this, "Elemento eliminado", Toast.LENGTH_SHORT).show();
})
.setNegativeButton("No", (dialog, which) -> {
updateResult("❌ Usuario canceló la acción");
})
.setCancelable(false) // No se puede cerrar tocando fuera
.show();
}
// 3. DIÁLOGO CON 3 BOTONES
private void showThreeButtonsDialog() {
new AlertDialog.Builder(this)
.setTitle("Guardar Cambios")
.setMessage("¿Deseas guardar los cambios realizados?")
.setPositiveButton("Guardar", (dialog, which) -> {
updateResult("💾 Cambios guardados");
})
.setNegativeButton("Descartar", (dialog, which) -> {
updateResult("🗑️ Cambios descartados");
})
.setNeutralButton("Cancelar", (dialog, which) -> {
updateResult("Operación cancelada");
})
.show();
}
// 4. DIÁLOGO CON LISTA SIMPLE
private void showListDialog() {
new AlertDialog.Builder(this)
.setTitle("Selecciona un color")
.setItems(colorsArray, (dialog, which) -> {
updateResult("Color seleccionado: " + colorsArray[which]);
})
.show();
}
// 5. DIÁLOGO CON SELECCIÓN ÚNICA (RadioButton)
private void showSingleChoiceDialog() {
new AlertDialog.Builder(this)
.setTitle("Selecciona tu color favorito")
.setSingleChoiceItems(colorsArray, selectedPosition, (dialog, which) -> {
selectedPosition = which;
})
.setPositiveButton("Confirmar", (dialog, which) -> {
if (selectedPosition != -1) {
updateResult("Tu color favorito es: " + colorsArray[selectedPosition]);
}
})
.setNegativeButton("Cancelar", null)
.show();
}
// 6. DIÁLOGO CON SELECCIÓN MÚLTIPLE (CheckBox)
private void showMultiChoiceDialog() {
new AlertDialog.Builder(this)
.setTitle("Selecciona tus colores favoritos")
.setMultiChoiceItems(colorsArray, checkedItems, (dialog, which, isChecked) -> {
checkedItems[which] = isChecked;
})
.setPositiveButton("Confirmar", (dialog, which) -> {
ArrayList<String> selectedColors = new ArrayList<>();
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]) {
selectedColors.add(colorsArray[i]);
}
}
updateResult("Colores seleccionados: " + selectedColors.toString());
})
.setNegativeButton("Cancelar", null)
.show();
}
// 7. DIÁLOGO CON INPUT DE TEXTO
private void showInputDialog() {
EditText input = new EditText(this);
input.setHint("Escribe tu nombre");
input.setPadding(50, 20, 50, 20);
new AlertDialog.Builder(this)
.setTitle("Ingresa tu nombre")
.setView(input)
.setPositiveButton("Aceptar", (dialog, which) -> {
String name = input.getText().toString().trim();
if (!name.isEmpty()) {
updateResult("👤 Hola, " + name + "!");
} else {
updateResult("No ingresaste ningún nombre");
}
})
.setNegativeButton("Cancelar", null)
.show();
}
// 8. DIÁLOGO DE LOGIN PERSONALIZADO
private void showLoginDialog() {
View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_login, null);
TextInputEditText etUsername = dialogView.findViewById(R.id.etUsername);
TextInputEditText etPassword = dialogView.findViewById(R.id.etPassword);
new AlertDialog.Builder(this)
.setTitle("Iniciar Sesión")
.setView(dialogView)
.setPositiveButton("Ingresar", (dialog, which) -> {
String username = etUsername.getText().toString().trim();
String password = etPassword.getText().toString().trim();
if (username.isEmpty() || password.isEmpty()) {
updateResult("❌ Completa todos los campos");
} else {
updateResult("✅ Bienvenido, " + username);
}
})
.setNegativeButton("Cancelar", null)
.show();
}
// 9. DIÁLOGO PERSONALIZADO COMPLETO
private void showCustomDialog() {
View customView = LayoutInflater.from(this).inflate(R.layout.dialog_login, null);
AlertDialog dialog = new AlertDialog.Builder(this)
.setView(customView)
.create();
dialog.show();
// Puedes personalizar el diálogo aquí
updateResult("Diálogo personalizado mostrado");
}
// 10. BOTTOMSHEET DIALOG
private void showBottomSheetDialog() {
BottomSheetDialog bottomSheet = new BottomSheetDialog(this);
View view = LayoutInflater.from(this).inflate(R.layout.bottom_sheet_layout, null);
view.findViewById(R.id.layoutWhatsApp).setOnClickListener(v -> {
updateResult("Compartir en WhatsApp");
bottomSheet.dismiss();
});
view.findViewById(R.id.layoutFacebook).setOnClickListener(v -> {
updateResult("Compartir en Facebook");
bottomSheet.dismiss();
});
view.findViewById(R.id.layoutTwitter).setOnClickListener(v -> {
updateResult("Compartir en Twitter");
bottomSheet.dismiss();
});
bottomSheet.setContentView(view);
bottomSheet.show();
}
// 11. DATE PICKER DIALOG
private void showDatePickerDialog() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(
this,
(view, selectedYear, selectedMonth, selectedDay) -> {
String date = selectedDay + "/" + (selectedMonth + 1) + "/" + selectedYear;
updateResult("📅 Fecha seleccionada: " + date);
},
year, month, day
);
datePickerDialog.show();
}
// 12. PROGRESS DIALOG
private void showProgressDialog() {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Cargando");
progressDialog.setMessage("Por favor espera...");
progressDialog.setCancelable(false);
progressDialog.show();
// Simular proceso largo
new Handler().postDelayed(() -> {
progressDialog.dismiss();
updateResult("✅ Proceso completado");
}, 3000);
}
private void updateResult(String text) {
txtResult.setText(text);
}
}🟨 8. Mejores Prácticas
✅ DO (Hacer):
- Usar títulos descriptivos que expliquen claramente el propósito
- Mensajes concisos y fáciles de entender
- Botones con acciones claras: "Eliminar" en lugar de "Sí"
- setCancelable(false) para acciones críticas
- Material Design 3 para una UI moderna
- Validar inputs antes de cerrar el diálogo
❌ DON'T (No hacer):
- No usar diálogos para mensajes largos
- No abusar de los diálogos (afecta UX)
- No bloquear la UI innecesariamente
- No usar más de 3 botones
- No usar ProgressDialog en producción (deprecated)
🟨 9. Casos de Uso Reales
Confirmación de Eliminación
new AlertDialog.Builder(this)
.setTitle("Eliminar cuenta")
.setMessage("Esta acción no se puede deshacer")
.setPositiveButton("Eliminar", (d, w) -> deleteAccount())
.setNegativeButton("Cancelar", null)
.setCancelable(false)
.show();Calificación de App
new AlertDialog.Builder(this)
.setTitle("¿Te gusta la app?")
.setMessage("Calíficanos en Google Play")
.setPositiveButton("Calificar", (d, w) -> openPlayStore())
.setNegativeButton("Después", null)
.setNeutralButton("No, gracias", null)
.show();🟨 10. Estilos Personalizados
📄 res/values/themes.xml
<style name="CustomAlertDialog" parent="Theme.Material3.Light.Dialog.Alert">
<item name="colorPrimary">#1976D2</item>
<item name="colorAccent">#FF4081</item>
<item name="android:textColorPrimary">#000000</item>
</style>Uso:
new AlertDialog.Builder(this, R.style.CustomAlertDialog)
.setTitle("Título")
.show();▶️ Cómo Ejecutar
- Abre Android Studio
- Copia el código completo
- Sync Gradle
- Presiona Run
- Prueba todos los tipos de diálogos
🧪 Resultado Final
App completa con 12 tipos diferentes de AlertDialog, desde básicos hasta personalizados con Material Design 3.
📥 Descargar Proyecto Completo
👉
🙌 Gracias por Visitar mi Blog
✔️ Compártelo en tus redes sociales
✔️ Déjame un comentario con tus dudas o sugerencias
✔️ Sígueme para más contenido de desarrollo Android
✔️ Suscríbete al newsletter para no perderte ningún tutorial
🎯 Conclusión
AlertDialog es un componente fundamental en Android que mejora significativamente la experiencia de usuario cuando se usa correctamente. Dominar los diferentes tipos de diálogos te permitirá crear aplicaciones más profesionales e intuitivas.
Recuerda:
- Usa diálogos con moderación
- Sigue las guías de Material Design
- Proporciona acciones claras al usuario
- Valida los inputs antes de procesar
- Considera usar DialogFragment para mayor control
Próximos temas: Notifications, WorkManager, Navigation Component
¡Nos vemos en el próximo tutorial! 🚀
❓ Preguntas Frecuentes
1. ¿Cuál es la diferencia entre AlertDialog y Dialog?
AlertDialog es una subclase especializada de Dialog que facilita la creación de diálogos estándar con botones y listas. Dialog es la clase base más genérica.
2. ¿Por qué ProgressDialog está deprecated?
Google recomienda usar ProgressBar dentro de tu layout o usar Snackbar para operaciones cortas. ProgressDialog bloquea completamente la UI.
3. ¿Cómo evito que se cierre al tocar fuera?
Usa setCancelable(false) para evitar que el diálogo se cierre al tocar fuera o presionar el botón de retroceso.
4. ¿Puedo usar diálogos en Fragments?
Sí, pero es mejor usar DialogFragment para manejar correctamente el ciclo de vida y las rotaciones de pantalla.
5. ¿BottomSheetDialog es mejor que AlertDialog?
BottomSheetDialog es más moderno y amigable en dispositivos móviles, especialmente para listas de opciones. AlertDialog es mejor para confirmaciones.
6. ¿Cómo personalizo completamente un diálogo?
Crea un layout XML personalizado y úsalo con setView() en el AlertDialog.Builder, o extiende DialogFragment para control total.
7. ¿Los diálogos sobreviven a la rotación de pantalla?
AlertDialog NO sobrevive automáticamente. Para eso necesitas usar DialogFragment que maneja correctamente el ciclo de vida.
8. ¿Puedo cambiar el color de los botones?
Sí, usando estilos personalizados o accediendo a los botones después de mostrar el diálogo con getButton().

No hay comentarios:
Publicar un comentario