在 DialogInterface.OnClickListener 匿名類中創建新 AlertDialog,傳入 this 導致編譯錯誤:The constructor AlertDialog.Builder(new DialogInterface.OnClickListener(){}) is undefined。
匿名類內部 this 指向 OnClickListener 實例,而非 Activity/Context。AlertDialog.Builder 構造函數需要 Context 參數。
public class Example extends Activity {
void func() {
new AlertDialog.Builder(this) // 外部類 this = Activity
.setPositiveButton("Yes", (dialog, which) -> {
// 正確:Example.this 指向 Activity
new AlertDialog.Builder(Example.this)
.setMessage("Saved!")
.setNeutralButton("OK", null)
.show();
})
.show();
}
}
// 假設在某個 View 的點擊事件中,或持有 view 引用
View view = ...; // 如按鈕、列表項
new AlertDialog.Builder(view.getContext()) // 關鍵:view.getContext()
.setMessage("Saved!")
.show();
public class MyFragment extends Fragment {
void showNestedDialog() {
new AlertDialog.Builder(requireContext()) // 非空 Context
.setPositiveButton("Yes", (dialog, which) -> {
new AlertDialog.Builder(requireContext())
.setMessage("Saved!")
.show();
})
.show();
}
}
new AlertDialog.Builder(context)
.setTitle("確認刪除")
.setMessage("此操作不可恢復")
.setPositiveButton("刪除", (dialog, which) -> {
// 執行刪除邏輯...
boolean success = deleteData();
// 結果彈窗
new AlertDialog.Builder(context) // 同一 context
.setTitle(success ? "成功" : "失敗")
.setMessage(success ? "已刪除" : "刪除失敗,請重試")
.setPositiveButton("確定", null)
.show();
})
.setNegativeButton("取消", null)
.show();
public class ConfirmDialogFragment extends DialogFragment {
public static ConfirmDialogFragment newInstance(String title, String msg) {
Bundle args = new Bundle();
args.putString("title", title);
args.putString("msg", msg);
ConfirmDialogFragment f = new ConfirmDialogFragment();
f.setArguments(args);
return f;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(requireActivity())
.setTitle(getArguments().getString("title"))
.setMessage(getArguments().getString("msg"))
.setPositiveButton("確定", (dialog, which) -> {
// 通過接口回調宿主
if (getTargetFragment() instanceof OnConfirmListener) {
((OnConfirmListener) getTargetFragment()).onConfirm();
}
})
.setNegativeButton("取消", null)
.create();
}
public interface OnConfirmListener {
void onConfirm();
}
}
// 使用
ConfirmDialogFragment.newInstance("刪除", "確定嗎?")
.setTargetFragment(this, 0)
.show(getSupportFragmentManager(), "confirm");
OuterClass.this、view.getContext()、requireContext()