Cara Membuat Alert Dialog di Android Studio (Lengkap + Loading)
Oleh Afa HernandesDiperbarui 8 menit baca
Seri · Bagian 5 dari 9Komponen UI Android
- 1Cara Membuat Project Baru di Android Studio
- 2Membuat Loading/Splash Screen di Android Studio
- 3Spinner (Combo Box) di Android: Data Statis & dari JSON
- 4Cara Menggunakan RadioButton di Android
- 5Cara Membuat Alert Dialog di Android Studio (Lengkap + Loading)
- 6Date Picker Dialog di Android
- 7Cara Load Gambar dari URL di Android
- 8Membuka URL & Aplikasi Lain dari Button Android (Uri.parse)
- 9Source Code Halaman Dashboard UI Android
Daftar isi
- Persiapan
- Langkah 1: Siapkan teks di strings.xml
- Langkah 2: Buat layout
- Langkah 3: Tampilkan AlertDialog OK/Batal
- Langkah 4: Konfirmasi sebelum keluar aplikasi
- Langkah 5: Dialog berisi daftar pilihan
- Langkah 6: Dialog loading
- Kode lengkap MainActivity.java
- Error yang sering muncul
- Pertanyaan yang sering diajukan
- Kesimpulan
AlertDialog adalah jendela kecil yang muncul di atas layar aplikasi Android untuk menyampaikan pesan penting atau meminta keputusan pengguna, misalnya “Hapus data ini?” atau “Yakin ingin keluar?”. Pengguna harus merespons dialog tersebut sebelum kembali ke layar sebelumnya.
Di tutorial ini kita akan membuat empat jenis dialog yang paling sering dipakai di aplikasi sungguhan:
- Dialog dengan tombol OK dan Batal
- Dialog konfirmasi keluar saat tombol Back ditekan
- Dialog berisi daftar pilihan
- Dialog loading (pengganti
ProgressDialogyang sudah usang)
Semua contoh memakai Java dan AlertDialog dari library AndroidX. Kode lengkapnya ada di bagian akhir.
Persiapan
- Android Studio versi terbaru
- Project baru dengan template Empty Views Activity dan bahasa Java
Catatan: Di Android Studio versi baru, template Empty Activity sudah memakai Jetpack Compose. Untuk tutorial berbasis XML seperti ini, pilih Empty Views Activity.
Buat project baru lewat File → New → New Project, pilih Empty Views Activity, lalu isi nama project dan pilih bahasa Java.

Tampilan jendela di atas berasal dari Android Studio versi lama. Di versi terbaru letak isiannya sedikit berbeda, tetapi isinya sama: nama, package, lokasi, bahasa, dan minimum SDK.
Langkah 1: Siapkan teks di strings.xml
Simpan semua teks di res/values/strings.xml agar mudah diubah dan diterjemahkan:
<resources> <string name="app_name">Contoh AlertDialog</string> <string name="tap_test">Sentuh tombol untuk menampilkan dialog</string> <string name="alert_button">Tampilkan Alert</string> <string name="alert_title">Alert</string> <string name="alert_message">Tekan OK untuk melanjutkan atau Batal untuk berhenti.</string> <string name="ok">OK</string> <string name="cancel">Batal</string> <string name="pressed_ok">Anda menekan OK</string> <string name="pressed_cancel">Anda menekan Batal</string></resources>Langkah 2: Buat layout
Buka res/layout/activity_main.xml dan ganti isinya. Kita siapkan tiga tombol, satu untuk setiap contoh dialog:
<?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="match_parent" android:gravity="center" android:orientation="vertical" android:padding="24dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:text="@string/tap_test" android:textStyle="bold" />
<Button android:id="@+id/btnAlert" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/alert_button" />
<Button android:id="@+id/btnPilihan" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Dialog Pilihan" />
<Button android:id="@+id/btnLoading" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Dialog Loading" />
</LinearLayout>Langkah 3: Tampilkan AlertDialog OK/Batal
Dialog dibuat dengan AlertDialog.Builder. Builder ini menyusun judul, pesan, dan tombol, lalu show() menampilkannya. Buka MainActivity.java:
import androidx.appcompat.app.AlertDialog;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
Button btnAlert = findViewById(R.id.btnAlert); btnAlert.setOnClickListener(v -> tampilkanAlert()); }
private void tampilkanAlert() { new AlertDialog.Builder(this) .setTitle(R.string.alert_title) // judul dialog .setMessage(R.string.alert_message) // isi pesan .setPositiveButton(R.string.ok, (dialog, which) -> Toast.makeText(this, R.string.pressed_ok, Toast.LENGTH_SHORT).show()) .setNegativeButton(R.string.cancel, (dialog, which) -> Toast.makeText(this, R.string.pressed_cancel, Toast.LENGTH_SHORT).show()) .show(); }}Penjelasan method yang dipakai:
| Method | Fungsi |
|---|---|
setTitle() |
Judul di bagian atas dialog |
setMessage() |
Isi pesan |
setPositiveButton() |
Tombol aksi utama (OK, Ya, Simpan) |
setNegativeButton() |
Tombol pembatal (Batal, Tidak) |
setNeutralButton() |
Tombol ketiga yang opsional (Nanti, Bantuan) |
setCancelable(false) |
Dialog tidak bisa ditutup dengan tombol Back atau sentuhan di luar dialog |
show() |
Membuat lalu menampilkan dialog |
Jalankan aplikasi dan tekan tombol Tampilkan Alert:


Langkah 4: Konfirmasi sebelum keluar aplikasi
Pola ini sering dipakai agar pengguna tidak keluar aplikasi karena tidak sengaja menekan Back. Cara modern menangkap tombol Back adalah lewat OnBackPressedDispatcher, karena onBackPressed() dan onKeyDown() sudah tidak disarankan.
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { konfirmasiKeluar(); }});private void konfirmasiKeluar() { new AlertDialog.Builder(this) .setTitle("Konfirmasi") .setMessage("Apakah Anda yakin ingin keluar dari aplikasi?") .setPositiveButton("Ya", (dialog, which) -> finish()) .setNegativeButton("Tidak", null) // null = cukup tutup dialognya .show();}Langkah 5: Dialog berisi daftar pilihan
Gunakan setItems() untuk menampilkan daftar. Dialog otomatis tertutup saat salah satu item dipilih, dan which berisi posisi item yang dipilih:
private void tampilkanPilihan() { String[] bahasa = {"Java", "Kotlin", "Dart (Flutter)"}; new AlertDialog.Builder(this) .setTitle("Pilih bahasa favorit") .setItems(bahasa, (dialog, which) -> Toast.makeText(this, "Anda memilih " + bahasa[which], Toast.LENGTH_SHORT).show()) .show();}Kalau ingin pengguna bisa memilih lebih dari satu item, ganti setItems() dengan setMultiChoiceItems(). Untuk pilihan tunggal dengan tombol konfirmasi, gunakan setSingleChoiceItems().
Langkah 6: Dialog loading
Versi lama tutorial ini memakai ProgressDialog. Class tersebut sudah deprecated sejak Android 8.0 (API 26), jadi sebaiknya tidak dipakai lagi. Penggantinya cukup sederhana, yaitu AlertDialog dengan layout berisi ProgressBar.
Buat file layout baru res/layout/dialog_loading.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:gravity="center_vertical" android:orientation="horizontal" android:padding="24dp">
<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:text="Mohon tunggu..." />
</LinearLayout>Lalu tampilkan dari activity. Contoh di bawah menutup dialog setelah 3 detik untuk mensimulasikan proses seperti mengambil data dari server:
private void tampilkanLoading() { View view = LayoutInflater.from(this).inflate(R.layout.dialog_loading, null); AlertDialog loading = new AlertDialog.Builder(this) .setView(view) .setCancelable(false) // jangan bisa ditutup selama proses berjalan .create(); loading.show();
new Handler(Looper.getMainLooper()).postDelayed(() -> { if (!isFinishing()) loading.dismiss(); }, 3000);}Di aplikasi sungguhan, panggil loading.dismiss() saat proses selesai (misalnya di callback request jaringan), bukan memakai jeda waktu tetap. Hindari juga Thread.sleep() di thread utama, karena aplikasi akan macet dan bisa memunculkan error Application Not Responding.
Kode lengkap MainActivity.java
Berikut gabungan semua langkah di atas. Sesuaikan package dengan nama package project Anda:
package com.example.alertdialogdemo;
import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;import android.widget.Toast;
import androidx.activity.OnBackPressedCallback;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
Button btnAlert = findViewById(R.id.btnAlert); btnAlert.setOnClickListener(v -> tampilkanAlert()); findViewById(R.id.btnPilihan).setOnClickListener(v -> tampilkanPilihan()); findViewById(R.id.btnLoading).setOnClickListener(v -> tampilkanLoading());
// Konfirmasi saat tombol Back ditekan getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { konfirmasiKeluar(); } }); }
private void tampilkanAlert() { new AlertDialog.Builder(this) .setTitle(R.string.alert_title) .setMessage(R.string.alert_message) .setPositiveButton(R.string.ok, (dialog, which) -> Toast.makeText(this, R.string.pressed_ok, Toast.LENGTH_SHORT).show()) .setNegativeButton(R.string.cancel, (dialog, which) -> Toast.makeText(this, R.string.pressed_cancel, Toast.LENGTH_SHORT).show()) .show(); }
private void konfirmasiKeluar() { new AlertDialog.Builder(this) .setTitle("Konfirmasi") .setMessage("Apakah Anda yakin ingin keluar dari aplikasi?") .setPositiveButton("Ya", (dialog, which) -> finish()) .setNegativeButton("Tidak", null) .show(); }
private void tampilkanPilihan() { String[] bahasa = {"Java", "Kotlin", "Dart (Flutter)"}; new AlertDialog.Builder(this) .setTitle("Pilih bahasa favorit") .setItems(bahasa, (dialog, which) -> Toast.makeText(this, "Anda memilih " + bahasa[which], Toast.LENGTH_SHORT).show()) .show(); }
private void tampilkanLoading() { View view = LayoutInflater.from(this).inflate(R.layout.dialog_loading, null); AlertDialog loading = new AlertDialog.Builder(this) .setView(view) .setCancelable(false) .create(); loading.show();
// Simulasi proses selama 3 detik new Handler(Looper.getMainLooper()).postDelayed(() -> { if (!isFinishing()) loading.dismiss(); }, 3000); }}Error yang sering muncul
Dialog tidak muncul sama sekali. Biasanya karena lupa memanggil .show() di akhir builder. AlertDialog.Builder hanya menyusun dialog, sedangkan show() yang menampilkannya.
WindowManager$BadTokenException: Unable to add window -- token null is not valid. Dialog dibuat dengan getApplicationContext() atau ditampilkan saat activity sudah ditutup. Selalu gunakan context activity (this atau MainActivity.this), dan periksa isFinishing() sebelum menampilkan dialog dari proses yang berjalan di latar belakang.
IllegalStateException: You need to use a Theme.AppCompat theme. Muncul jika activity memakai tema yang bukan turunan AppCompat atau Material Components. Pastikan tema di res/values/themes.xml mewarisi Theme.Material3.* atau Theme.AppCompat.*, dan import yang dipakai adalah androidx.appcompat.app.AlertDialog, bukan android.app.AlertDialog.
Dialog tertutup saat pengguna menyentuh area di luarnya. Itu perilaku bawaan. Tambahkan setCancelable(false) jika dialog harus dijawab, misalnya dialog loading atau persetujuan syarat.
Pertanyaan yang sering diajukan
Apa bedanya android.app.AlertDialog dan androidx.appcompat.app.AlertDialog?
Versi AndroidX tampil konsisten di semua versi Android dan mengikuti tema aplikasi. Untuk project baru, selalu gunakan versi AndroidX.
Bagaimana agar dialog bergaya Material Design 3?
Ganti AlertDialog.Builder dengan MaterialAlertDialogBuilder dari library Material Components (com.google.android.material.dialog.MaterialAlertDialogBuilder). Method-nya sama persis, dan tampilannya otomatis mengikuti tema Material 3.
Bagaimana versi Kotlin-nya?
AlertDialog.Builder(this) .setTitle("Alert") .setMessage("Tekan OK untuk melanjutkan atau Batal untuk berhenti.") .setPositiveButton("OK") { _, _ -> Toast.makeText(this, "Anda menekan OK", Toast.LENGTH_SHORT).show() } .setNegativeButton("Batal", null) .show()Kesimpulan
Dengan AlertDialog.Builder Anda bisa membuat berbagai dialog hanya dengan beberapa baris kode: pesan dengan tombol OK/Batal, konfirmasi keluar, daftar pilihan, sampai dialog loading. Ingat tiga hal penting: selalu panggil show(), gunakan context activity, dan tinggalkan ProgressDialog yang sudah deprecated.
Lanjutkan ke bagian berikutnya di seri Komponen UI Android untuk mempelajari komponen lain seperti Date Picker Dialog.

