在 Android 中使用 AlertDialog.Builder.setSingleChoiceItems() 時,第三個參數必須是 DialogInterface.OnClickListener 而非 View.OnClickListener,類型不匹配會導致編譯錯誤。
// 錯誤:使用了 View.OnClickListener
OnClickListener myClickListener = new OnClickListener() { // View.OnClickListener
@Override
public void onClick(View v) { ... } // 參數類型錯誤
};
builder.setSingleChoiceItems(data, -1, myClickListener); // 編譯錯誤
// 正確:使用 DialogInterface.OnClickListener
DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// which 是被選中的項目索引
ListView lv = ((AlertDialog) dialog).getListView();
int checkedPos = lv.getCheckedItemPosition();
Log.d("TAG", "選中位置: " + checkedPos);
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // 明確 Context
builder.setTitle(R.string.items);
builder.setSingleChoiceItems(data, -1, myClickListener); // 類型匹配
AlertDialog dialog = builder.create();
dialog.show(); // 顯示對話框
private void showSingleChoiceDialog() {
final String[] items = {"選項一", "選項二", "選項三"};
int checkedItem = 0; // 默認選中索引,-1 為無選中
new AlertDialog.Builder(this)
.setTitle("請選擇")
.setSingleChoiceItems(items, checkedItem, (dialog, which) -> {
// 處理選擇邏輯
String selected = items[which];
Toast.makeText(this, "已選: " + selected, Toast.LENGTH_SHORT).show();
// 如需選中即關閉
dialog.dismiss();
})
.setNegativeButton("取消", null)
.show();
}
| 監聽器類型 | 包名 | onClick 參數 | 適用場景 |
|---|---|---|---|
| View.OnClickListener | android.view | View v | 按鈕、視圖點擊 |
| DialogInterface.OnClickListener | android.content | DialogInterface dialog, int which | 對話框列表項、按鈕 |
| AdapterView.OnItemClickListener | android.widget | AdapterView, View, int position, long id | ListView/GridView 項目 |
View.OnClickListenerView vs DialogInterface, intthis 指向錯誤,使用 MainActivity.this 或 getApplicationContext()AlertDialog 後未調用 show()
new MaterialAlertDialogBuilder(this)
.setTitle("請選擇")
.setSingleChoiceItems(items, checkedItem, (dialog, which) -> {
// 處理選擇
dialog.dismiss();
})
.setNegativeButton("取消", null)
.show();