NoSuchMethodException 或 NoSuchMethodError:AlertDialog.Builder.setOnDismissListener 於 API 17 (Android 4.2) 才加入,API 16 呼叫會崩潰。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // API 17
builder.setOnDismissListener(dialog -> { /* ... */ });
}
builder.show();
public class MyDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.select_province)
.setMessage("內容")
.setPositiveButton("確定", null);
return builder.create();
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
// 此處處理 dismiss 邏輯,全 API 相容
}
}
// 顯示
new MyDialogFragment().show(getSupportFragmentManager(), "tag");
public class CustomAlertDialog extends AlertDialog {
private OnDismissListener listener;
public CustomAlertDialog(Context context) { super(context); }
public void setOnDismissListenerCompat(OnDismissListener l) { this.listener = l; }
@Override
public void dismiss() {
super.dismiss();
if (listener != null) listener.onDismiss(this);
}
}
DialogFragment,生命週期自動管理、支援旋轉保持。AlertDialog.Builder,務必做版本檢查或反射調用。minSdkVersion 時評估 API 可用性,避免在舊版裝置崩潰。