OnCancelListener不DialogFragment叫(OnCancelListener

2019-08-16 20:27发布

我有一个简单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();
    }
}

Answer 1:

这可能与事实有没有明确的呼吁做cancel()从你的代码。 该OnCancelListener文档说:

当对话框被取消,这将只能被称为

这可能需要一个明确的cancel()调用。

要么使用正/负键OnClickListener调用DialogInterface#cancel()或使用OnDismissListener()与额外的检查,看是否被点击列表项。

另外,监听背部按键和取消对话框,你可以建立一个OnKeyListener ,像中概述本SO答案

此外,一旦你的对话框中设置了,这也将是使用一个好主意Dialog#setCanceledOnTouchOutside()的情况下,用户点击对话外。

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

由于您使用的是DialogFragment ,这个类有一个非常方便的方法, DialogFragment#onCancel()时,它被调用DialogFragment被取消。 不要在那里,你的逻辑。

DialogFragments更复杂,稍有不同的生命周期比正常的对话。 因此,首先要检查的文件,如果你有一定的Dialog ,您正试图移植到一个基于方法DialogFragment ,有些方法可能存在,让您的新的实现正常运行!



Answer 2:

如果您正在使用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;
        }
    });


Answer 3:

注: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();
    }
}

你应该删除.setOnCancelListener()



Answer 4:

其实,如果你想使用DialogFragment ,你永远无法添加OnCancelListenerOnDismissListener它,因为对话片段拥有回调这些方法!

你有3个选择在这里:

1-去定期对话。
2 - 设置你的对话片段撤销的(假的),并添加一个取消按钮,对话框。
3-检查@Nikhil平乐的答案。

这是从对话框片段的文档

 * <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>


Answer 5:

取消监听或辞退听者DialogFragment可以通过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

                }

            });


文章来源: OnCancelListener is not called in DialogFragment