OnCancelListener is not called in DialogFragment

前端 未结 5 1353
盖世英雄少女心
盖世英雄少女心 2020-12-30 00:30

I have a simple AlertDialog that displays a list of some items and upon clicking one of them, the clicked item is passed back to the enclosing Activity

相关标签:
5条回答
  • 2020-12-30 01:04

    It might have to do with the fact that there is no explicit call to cancel() from your code. The OnCancelListener documentation says:

    This will only be called when the dialog is canceled

    Which probably needs an explicit cancel() call.

    Either make a positive/negative button with a OnClickListener that calls DialogInterface#cancel() or use a OnDismissListener() with an extra check to see if a list item was clicked.

    Also, to listen for a back keypress and cancel the dialog, you can set up an OnKeyListener, like outlined in this SO answer

    Also, once you have the Dialog set up, it would also be a good idea to use Dialog#setCanceledOnTouchOutside() in case the the user taps outside the Dialog.

    Edit: The below part is the easy way to handle cancel events in a DialogFragment.

    Since you are using a DialogFragment, this class has a very handy method, DialogFragment#onCancel() which gets called when the DialogFragment is cancelled. Do your logic in there.

    DialogFragments are more complex, with a slightly different lifecycle than normal dialogs. Therefore, first check the documentation if you have a certain Dialog-based approach that you are trying to port to a DialogFragment, some methods may exist that allow your new implementation to function properly!

    0 讨论(0)
  • 2020-12-30 01:08

    If you are using DialogFragment and want to listen back button then use this -

        this.getDialog().setOnKeyListener(new Dialog.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode,
                    KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    if (****) {
                        your logic
                    }
                    return true;
                }
                return false;
            }
        });
    
    0 讨论(0)
  • 2020-12-30 01:21

    Actually if you want to use DialogFragment, you can never add OnCancelListener or OnDismissListener to it, since the Dialog Fragment owns callbacks to these methods!

    You have 3 options here:

    1- go with regular dialogs.
    2- set your dialog fragment to cancellable(false) and add a cancel button to the dialog.
    3- check @Nikhil Pingle answer.

    this is from the documentation of the Dialog Fragment

     * <p><em>Note: DialogFragment own the {@link Dialog#setOnCancelListener
     * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener
     * Dialog.setOnDismissListener} callbacks.  You must not set them yourself.</em>
     * To find out about these events, override {@link #onCancel(DialogInterface)}
     * and {@link #onDismiss(DialogInterface)}.</p>
    
    0 讨论(0)
  • 2020-12-30 01:25

    Note: DialogFragment own the Dialog.setOnCancelListener and Dialog.setOnDismissListener callbacks. You must not set them yourself.

    To find out about these events, override onCancel(DialogInterface) and onDismiss(DialogInterface).

    public class SelectItemDialog extends DialogFragment {
    
        @Override
        public void onDismiss(DialogInterface dialog) {
            super.onDismiss(dialog);
            //your code hear
            dialog.cancel();
        }
    }
    

    And you should remove .setOnCancelListener()

    0 讨论(0)
  • 2020-12-30 01:27

    Cancel Listener or Dismiss listener in DialogFragment can achieve by onDismiss

                DialogFragment  newFragment = new DatePickerFragment();
                newFragment.show(getFragmentManager(), "datePicker");
                newFragment.onDismiss(new DialogInterface(){
    
                    @Override
                    public void cancel() {
                        // TODO Auto-generated method stub
    
                    }
    
                    @Override
                    public void dismiss() {
                        // TODO Auto-generated method stub
    
                    }
    
                });
    
    0 讨论(0)
提交回复
热议问题