在 Android 中使用 AlertDialog.Builder.setSingleChoiceItems() 顯示單選列表時,用戶選擇項目後對話框不會自動關閉,需在點擊監聽器中手動調用 dialog.dismiss()。
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
// 缺少 dialog.dismiss(),對話框不會關閉
}
});
final CharSequence[] items = {"第一個選項", "第二個選項"};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("請選擇選項");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 1. 處理選擇邏輯
String selected = items[which].toString();
Toast.makeText(context, "已選擇: " + selected, Toast.LENGTH_SHORT).show();
// 2. 關鍵:手動關閉對話框
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
private int selectedIndex = -1; // 成員變量保存選擇
builder.setSingleChoiceItems(items, selectedIndex, (dialog, which) -> {
selectedIndex = which; // 更新選中索引
dialog.dismiss();
// 後續處理:如保存到 SharedPreferences
// prefs.edit().putInt("selected_option", which).apply();
});
dialog.dismiss() 必須在 onClick 回調中調用,否則對話框保持打開checkedItem 設置初始選中項 (-1 表示無選中)setItems() 配合按鈕,而非 setSingleChoiceItems()new MaterialDialog.Builder(this)
.title("請選擇")
.items(items)
.itemsCallbackSingleChoice(selectedIndex, (dialog, view, which, text) -> {
selectedIndex = which;
return true; // true 表示允許關閉
})
.positiveText("確定")
.show();
| 方法 | 特點 | 適用場景 |
|---|---|---|
| setSingleChoiceItems | 單選圓點、即時選中、需手動 dismiss | 簡單單選、設置類選項 |
| setItems | 無選中標記、點擊項目觸發 onClick、通常配合按鈕 | 動作列表、功能選單 |
| setMultiChoiceItems | 多選框、支持多選 | 標籤選擇、權限設置 |