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

AlertDialog en Android

AlertDialog en Android

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:

  1. Diálogo de confirmación (Sí/No)
  2. Diálogo informativo (solo OK)
  3. Diálogo con lista de opciones
  4. Diálogo con input de texto
  5. Diálogo personalizado
  6. BottomSheetDialog (Material Design)

🟨 2. Crear el Proyecto

  1. Abre Android Studio
  2. Crea un nuevo proyecto: Empty Activity
  3. Nombre: AlertDialogMasterApp
  4. Package: com.example.dialogapp
  5. Lenguaje: Java
  6. 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):

  1. Usar títulos descriptivos que expliquen claramente el propósito
  2. Mensajes concisos y fáciles de entender
  3. Botones con acciones claras: "Eliminar" en lugar de "Sí"
  4. setCancelable(false) para acciones críticas
  5. Material Design 3 para una UI moderna
  6. Validar inputs antes de cerrar el diálogo

❌ DON'T (No hacer):

  1. No usar diálogos para mensajes largos
  2. No abusar de los diálogos (afecta UX)
  3. No bloquear la UI innecesariamente
  4. No usar más de 3 botones
  5. 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

  1. Abre Android Studio
  2. Copia el código completo
  3. Sync Gradle
  4. Presiona Run
  5. 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