DialogFragment中未调用OnCancelListener

Nat*_*tix 22 java android android-alertdialog android-dialogfragment

我有一个简单的AlertDialog显示一些项目的列表,单击其中一个项目后,单击的项目将传递回封闭项目Activity.我还想在用户取消对话框时使用后退按钮执行一些默认处理- 更具体地说,我想在这种情况下将空字符串传递给活动.

但是,如果我将对话框放在DialogFragment(来自兼容包)中,OnCancelListener 则在使用后退按钮关闭对话框时不会调用该对话框.我究竟做错了什么?

public class SelectItemDialog extends DialogFragment {

    public interface Callback {
        void onItemSelected(String string);
    }

    private static final String ARG_ITEMS = "items";

    private Callback callback;

    public static SelectItemDialog fromItems(Collection<String> items) {
        SelectItemDialog fragment = new SelectItemDialog();
        fragment.setArguments(newArguments(items));
        return fragment;
    }

    private static Bundle newArguments(Collection<String> items) {
        Bundle arguments = new Bundle();
        arguments.putStringArray(ARG_ITEMS, items.toArray(new String[items.size()]));
        return arguments;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        callback = (Callback) activity;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final String[] items = getArguments().getStringArray(ARG_ITEMS);
        return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.dialog_select_email_title)
            .setItems(items, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    callback.onItemSelected(items[which]);
                }
            })
            .setOnCancelListener(new OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    // this code is not executed
                    callback.onItemSelected("");
                    throw new RuntimeException("dialog cancelled");
                }
            })
            .create();
    }
}
Run Code Online (Sandbox Code Playgroud)

A--*_*--C 46

它可能与cancel()您的代码中没有显式调用这一事实有关.该OnCancelListener文档说:

只有在取消对话框时才会调用此方法

这可能需要一个明确的cancel()电话.

要么使用OnClickListener该调用进行正/负按钮,DialogInterface#cancel()要么使用OnDismissListener()带有额外检查的按钮来查看是否单击了列表项.

此外,要听取后退按键并取消对话框,您可以设置一个OnKeyListener,如本SO答案中所述

此外,一旦设置了对话框Dialog#setCanceledOnTouchOutside(),如果用户点击对话框外,最好使用对话框.

编辑:以下部分是在DialogFragment中处理取消事件的简便方法.

由于您使用的是DialogFragment,此类有一个非常方便的方法,DialogFragment#onCancel()DialogFragment取消时会调用它.在那里做你的逻辑.

DialogFragments更复杂,生命周期与普通对话框略有不同.因此,首先检查文档是否有Dialog您尝试移植到某个DialogFragment特定方法的方法,可能存在一些允许新实现正常运行的方法!

  • @Natix你可以尝试使用[DialogFragment的`onCancel()`](http://developer.android.com/reference/android/app/DialogFragment.html#onCancel(android.content.DialogInterface)).DialogFragments比常规对话框更复杂. (4认同)

Nik*_*gle 11

如果您正在使用DialogFragment并想要收听按钮,那么使用此 -

    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;
        }
    });
Run Code Online (Sandbox Code Playgroud)


Bao*_* Le 10

注意:DialogFragment拥有Dialog.setOnCancelListener和Dialog.setOnDismissListener回调.你不能自己设置它们.

要了解这些事件,请覆盖onCancel(DialogInterface)和onDismiss(DialogInterface).

public class SelectItemDialog extends DialogFragment {

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        //your code hear
        dialog.cancel();
    }
}
Run Code Online (Sandbox Code Playgroud)

你应该删除.setOnCancelListener()