AlertDialog với Multi-Choice (Checkbox)
Sử dụng AlertDialog.Builder.setMultiChoiceItems() để hiển thị danh sách checkbox, cho phép chọn nhiều mục cùng lúc.
Bước 1: Tạo dự án mới
Khởi tạo project Android Studio.
Bước 2: Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click to show checkbox dialog"
android:textSize="24sp"
android:padding="24dp" />
</LinearLayout>
Bước 3: MainActivity.java
package com.example.myapplication;
import android.annotation.TargetApi;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView text;
private List<String> selectedItems = new ArrayList<>();
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.click);
text.setOnClickListener(v -> showAlertDialog());
}
private void showAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Chọn môn học yêu thích");
final String[] items = {"Toán", "Vật lý", "Hóa học", "Sinh học", "Tin học", "Ngữ văn"};
// Trạng thái ban đầu (false = chưa chọn)
final boolean[] checkedItems = {false, false, true, false, false, false}; // Mặc định chọn "Hóa học"
builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
String item = items[which];
if (isChecked) {
selectedItems.add(item);
Toast.makeText(MainActivity.this, "Đã chọn: " + item, Toast.LENGTH_SHORT).show();
} else {
selectedItems.remove(item);
Toast.makeText(MainActivity.this, "Bỏ chọn: " + item, Toast.LENGTH_SHORT).show();
}
}
});
builder.setPositiveButton("Xác nhận", (dialog, which) -> {
String result = selectedItems.isEmpty() ? "Chưa chọn môn nào" : "Đã chọn: " + String.join(", ", selectedItems);
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
// Xử lý logic lưu lựa chọn tại đây
});
builder.setNegativeButton("Hủy", (dialog, which) -> {
selectedItems.clear(); // Reset khi hủy
dialog.dismiss();
});
builder.setNeutralButton("Xóa tất cả", (dialog, which) -> {
// Uncheck tất cả
ListView listView = ((AlertDialog) dialog).getListView();
for (int i = 0; i < items.length; i++) {
listView.setItemChecked(i, false);
}
selectedItems.clear();
});
AlertDialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
}
Lấy danh sách đã chọn khi bấm OK (Cách tốt hơn)
Thay vì dùng list bên ngoài, lấy trực tiếp từ ListView của dialog:
AlertDialog dialog = builder.create();
dialog.setOnShowListener(d -> {
// Có thể set checked items ở đây nếu cần restore
});
builder.setPositiveButton("OK", (dialogInterface, which) -> {
AlertDialog alertDialog = (AlertDialog) dialogInterface;
ListView listView = alertDialog.getListView();
StringBuilder selected = new StringBuilder();
for (int i = 0; i < items.length; i++) {
if (listView.isItemChecked(i)) {
if (selected.length() > 0) selected.append(", ");
selected.append(items[i]);
}
}
Toast.makeText(MainActivity.this, "Selected: " + selected.toString(), Toast.LENGTH_LONG).show();
});
Custom Layout cho Checkbox (Nâng cao)
// res/layout/dialog_checkbox_custom.xml
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<CheckBox
android:id="@+id/cbOption1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tùy chọn 1"
android:padding="12dp" />
<CheckBox
android:id="@+id/cbOption2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tùy chọn 2"
android:padding="12dp" />
<CheckBox
android:id="@+id/cbOption3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tùy chọn 3"
android:padding="12dp" />
</LinearLayout>
// Java
View customView = getLayoutInflater().inflate(R.layout.dialog_checkbox_custom, null);
CheckBox cb1 = customView.findViewById(R.id.cbOption1);
CheckBox cb2 = customView.findViewById(R.id.cbOption2);
CheckBox cb3 = customView.findViewById(R.id.cbOption3);
builder.setView(customView)
.setPositiveButton("OK", (dialog, which) -> {
List selected = new ArrayList<>();
if (cb1.isChecked()) selected.add(cb1.getText().toString());
if (cb2.isChecked()) selected.add(cb2.getText().toString());
if (cb3.isChecked()) selected.add(cb3.getText().toString());
// Xử lý selected...
});
So sánh các loại danh sách Dialog
| Phương thức | Chọn | UI | Callback |
|---|---|---|---|
setItems() |
Single click | Text | OnClickListener(index) |
setSingleChoiceItems() |
Single choice | Radio button | OnClickListener(index) |
setMultiChoiceItems() |
Multiple choice | Checkbox | OnMultiChoiceClickListener(index, isChecked) |
Lưu ý quan trọng
- Mảng
checkedItemsphải cùng độ dài vớiitems OnMultiChoiceClickListenerđược gọi mỗi khi user tick/bỏ tick- Dialog KHÔNG tự dismiss khi click checkbox (khác với setItems)
- Cần nút Positive/Negative để user xác nhận/hủy
- Dùng
ListView.getCheckedItemPositions()hoặcisItemChecked()để lấy kết quả cuối
Ứng dụng thực tế
- Filter sản phẩm (brand, color, size, price range)
- Cài đặt thông báo (chọn loại nhận)
- Chia sẻ đến nhiều contact/app
- Chọn quyền truy cập (permission groups)