在DialogFragment中未调用OnCancelListener

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

}

}

回答:

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

仅在取消对话框时调用

这可能需要显式cancel()调用。

用a

OnClickListener调用一个正/负按钮,DialogInterface#cancel()或使用a

OnDismissListener()进行额外检查以查看是否单击了列表项。

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

同样,一旦设置了对话框,最好还是使用一个好方法Dialog#setCanceledOnTouchOutside(),以防用户在对话框外点击。

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

DialogFragments更复杂,其生命周期与普通对话框略有不同。因此,如果您有Dialog尝试移植到的基于特定方法的方法,请首先查看文档DialogFragment,其中可能存在一些使新实现正常运行的方法!

以上是 在DialogFragment中未调用OnCancelListener 的全部内容, 来源链接: utcz.com/qa/410623.html

回到顶部