OnCancelListener不在DialogFragment中调用

我有一个简单的AlertDialog ,显示一些项目的列表,并点击其中的一个,被点击的项目被传回到封闭的Activity 。 我也想在用户取消对话框(使用后退button )时执行一些默认处理 – 更具体地说,我想在这种情况下将一个空string传递给活动。

但是,如果我把对话框放在一个DialogFragment (来自兼容包 )中, 当我用后退buttonclosures对话框时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(); } } 

Solutions Collecting From Web of "OnCancelListener不在DialogFragment中调用"

这可能与你的代码没有明确的调用cancel()的事实有关。 OnCancelListener文档说:

这只会在对话框被取消时被调用

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

使用调用DialogInterface#cancel()OnClickListener创build一个正/负button,或者使用带额外检查的OnDismissListener()来查看列表项是否被单击。

另外,要听取回按键并取消对话框,您可以设置一个OnKeyListener ,就像这个SO回答中所述

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

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

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

DialogFragments比较复杂,与普通对话框的生命周期略有不同。 因此,首先检查文档,如果您有一个基于Dialog的特定方法,而您尝试移植到DialogFragment ,则可能存在一些方法可以让您的新实现正常工作!

如果您正在使用DialogFragment并想要收听button然后使用此 –

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

注意:DialogFragment拥有Dialog.setOnCancelListener和Dialog.setOnDismissListenercallback。 你不能自己设置它们。

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

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

你应该删除.setOnCancelListener()

实际上如果你想使用DialogFragment ,你永远不能添加OnCancelListenerOnDismissListener ,因为Dialog Fragment拥有这些方法的callbackOnDismissListener

你有3个选项:

1-定期对话。
2-将您的对话框片段设置为可取消(false),并向对话框中添加取消button。
3-检查@Nikhil平乐的答案。

这是来自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> 

在DialogFragment中取消Listener或Dismiss监听器可以通过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 } });