在 AlertDialog 中顯示文件夾列表(通過 ListView),要求:
使用 AlertDialog.Builder 構建對話框,但 setPositiveButton 和 setNegativeButton 在構建時即確定,無法根據運行時數據動態顯示/隱藏。
AlertDialog 創建並 show() 後,可通過 getButton() 獲取按鈕實例並動態控制可見性:
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("文件夾列表")
.setView(listView) // 設置自定義 ListView
.setPositiveButton("保存", null) // 先設置監聽為 null
.setNegativeButton("取消", null)
.create();
dialog.show(); // 必須先 show,才能獲取按鈕
// 獲取按鈕引用並動態控制
Button positiveBtn = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
Button negativeBtn = dialog.getButton(AlertDialog.BUTTON_NEGATIVE);
// 根據列表數據決定是否顯示保存按鈕
if (adapter.getCount() == 0) {
positiveBtn.setVisibility(View.GONE);
} else {
positiveBtn.setVisibility(View.VISIBLE);
// 此處設置真正的點擊邏輯
positiveBtn.setOnClickListener(v -> {
// 保存邏輯
dialog.dismiss();
});
}
// 取消按鈕始終顯示,設置邏輯
negativeBtn.setOnClickListener(v -> dialog.dismiss());
getButton() 在對話框顯示前返回 null。getButton() 更新可見性。public void showFolderDialog(List<String> folders) {
ListView listView = new ListView(this);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, folders);
listView.setAdapter(adapter);
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("選擇文件夾")
.setView(listView)
.setPositiveButton("保存", null)
.setNegativeButton("取消", null)
.create();
dialog.show();
Button btnPositive = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
Button btnNegative = dialog.getButton(AlertDialog.BUTTON_NEGATIVE);
// 列表為空隱藏保存按鈕
btnPositive.setVisibility(folders.isEmpty() ? View.GONE : View.VISIBLE);
btnPositive.setOnClickListener(v -> {
int pos = listView.getCheckedItemPosition();
if (pos != ListView.INVALID_POSITION) {
String selected = folders.get(pos);
// 處理選中項
}
dialog.dismiss();
});
btnNegative.setOnClickListener(v -> dialog.dismiss());
// 啟用單選模式
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
若需更複雜的按鈕佈局(如按鈕順序、顏色、圖標),建議使用 setView() 傳入包含自定義按鈕的佈局,完全掌控 UI 與邏輯。
掌握 getButton() 動態控制技巧,可靈活應對各種對話框按鈕顯示邏輯需求。