ngodingdulu

Cara Membuat Alert Dialog di Android Studio (Lengkap + Loading)

Oleh Afa HernandesDiperbarui 8 menit baca

Seri · Bagian 5 dari 9Komponen UI Android
  1. 1Cara Membuat Project Baru di Android Studio
  2. 2Membuat Loading/Splash Screen di Android Studio
  3. 3Spinner (Combo Box) di Android: Data Statis & dari JSON
  4. 4Cara Menggunakan RadioButton di Android
  5. 5Cara Membuat Alert Dialog di Android Studio (Lengkap + Loading)
  6. 6Date Picker Dialog di Android
  7. 7Cara Load Gambar dari URL di Android
  8. 8Membuka URL & Aplikasi Lain dari Button Android (Uri.parse)
  9. 9Source Code Halaman Dashboard UI Android
Daftar isi

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:

  1. Dialog dengan tombol OK dan Batal
  2. Dialog konfirmasi keluar saat tombol Back ditekan
  3. Dialog berisi daftar pilihan
  4. Dialog loading (pengganti ProgressDialog yang 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.

Jendela Configure your project di Android Studio dengan nama AppPost, bahasa Java, dan minimum API 16

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:

res/values/strings.xml
<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:

res/layout/activity_main.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="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:

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:

Layar aplikasi App Post Blog dengan tombol ALERT sebelum dialog muncul

AlertDialog berjudul Alert dengan tombol BATAL dan OK tampil di atas layar aplikasi

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.

MainActivity.java (di dalam onCreate)
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
konfirmasiKeluar();
}
});
MainActivity.java
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:

MainActivity.java
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:

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:

MainActivity.java
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:

MainActivity.java
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?

MainActivity.kt
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.

Bagikan:WhatsAppTelegramXFacebook
MobileSource Code

Source Code Halaman Dashboard UI Android

Pada tutorial bahasa pemrograman kali ini, saya akan membagikan sebuah tutorial tentang bagaimana caranya membuat Halaman Menu Utama yang

4 Februari 20216 mnt

Cara Membuat Project Baru di Android Studio
MobileTutorial

Cara Membuat Project Baru di Android Studio

Android Studio merupakan software yang cukup populer saat ini untuk membuat aplikasi yang di khususkan untuk perangkat android. kali ini saya akan memberikan tutorial bagaimana cara membuat…

3 Februari 20211 mnt

Enter bukaEsc tutupHalaman pencarian