首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android AlertDialog setOnDismissListener 在 API 16 (4.1.2) 崩潰:版本相容性處理

     編輯:程式設計綜合問答

錯誤現象

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();

方案二:使用 DialogFragment(推薦)

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");

方案三:自訂 Dialog 繼承並覆寫 dismiss()

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 可用性,避免在舊版裝置崩潰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved