在Android中,AlertDialog.Builder.setMultiChoiceItems()配合OnMultiChoiceClickListener是處理多選對話框的標準方式。本文針對「點擊項目獲取值並Toast顯示」的需求,提供正確代碼模式並解析常見錯誤。
alert.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String value = items.toString(); // 錯誤:輸出數組地址而非選中項
Toast.makeText(getApplication(), value, Toast.LENGTH_LONG).show();
}
});
問題:
1. 使用了單選接口OnClickListener而非多選專用OnMultiChoiceClickListener。
2. items.toString()返回數組對象哈希碼,非選中文本。
3. 缺少isChecked參數判斷選中/取消狀態。
final String[] items = {"Blue", "Green", "Orange"};
final boolean[] checkedItems = {false, false, false}; // 初始勾選狀態
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Money Maker")
.setIcon(R.drawable.ic_launcher)
.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// which: 被點擊項目的下標
// isChecked: 當前是否為選中狀態
String selected = items[which];
String msg = selected + (isChecked ? " 已選中" : " 已取消");
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
// 同步更新checkedItems數組(可選,用於後續獲取所有選中項)
checkedItems[which] = isChecked;
}
})
.setPositiveButton("確定", (dialog, which) -> {
// 確定按鈕:收集所有選中項
StringBuilder sb = new StringBuilder();
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]) sb.append(items[i]).append(", ");
}
Toast.makeText(MainActivity.this, "最終選擇: " + sb, Toast.LENGTH_LONG).show();
})
.setNegativeButton("取消", null)
.show();
OnMultiChoiceClickListener,回調簽名包含which和isChecked。items[which]索引數組。checkedItems布爾數組,也可手動同步用於「確定」按鈕收集結果。getApplicationContext()或Activity.this,避免內存洩漏。若需每項顯示圖標、副標題或自定義控件,請改用RecyclerView嵌入DialogFragment,或使用MaterialDialog等第三方庫。