Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Thêm CheckBox list vào AlertDialog Android

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 checkedItems phải cùng độ dài với items
  • 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ặc isItemChecked() để 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)