使用AlertDialog時,當點在Dialog的外圍,Android會讓此Dialog消失,並且什麼動作都不執行。
如果剛好positive和negative的按鈕都是有明確動作的,並不想被取消,可以透過setCancelable(boolean)這個函式來強制使用者不得取消。
不過有時會希望使用者可以透過點擊按鈕或點擊Dialog外圍來執行取消動作(非null空動作),但在AlertDialog的函式庫中是無能為力的,我查了

  • setOnCancelListener
  • setOnDismissListener

這兩個函式都會導致程式異常停止。最後查到應該使用DialogFragment當中的onCancel動作來解決這個問題。
以下範例程式碼

public class MyDialogFragment extends DialogFragment {
    private final static String TAG = "MyDialog";

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Hello")
                .setPositiveButton("YA", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Log.i(TAG, "Positive");
                    }
                })
                .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Log.i(TAG, "Negative");
                    }
                });
        return builder.create();
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
        Log.i(TAG, "OnCancel");
    }
}

重點如下

  1. 繼承DialogFragment
  2. 複寫onCreateDialog方法,並回傳一個Dialog (跟以往AlertDialog的使用方法一樣)
  3. 複寫onCancel方法,裡面放上點擊外框使AlertDialog消失時要觸發的事件。
    • 注意:如果是點positive Button或negative Button皆不會觸發這個函式。