- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个简单的AlertDialog
,它显示了一些项目的列表,单击其中一个项目后,单击的项目将传递回封闭的Activity
。我还想在用户取消对话框时执行一些默认处理(使用后退按钮)——更具体地说,在这种情况下,我想将一个空字符串传递给 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文档说:
This will only be called when the dialog is canceled
这可能需要明确的 cancel()
调用。
使用调用 DialogInterface#cancel()
的 OnClickListener
制作正/负按钮或使用 OnDismissListener()
额外检查以查看是否单击了列表项。
另外,要监听返回键并取消对话,您可以设置 OnKeyListener
,如 this SO answer 中所述
此外,一旦您设置了对话框,使用 Dialog#setCanceledOnTouchOutside()
也是一个好主意。以防用户在对话框外点击。
编辑:以下部分是在 DialogFragment 中处理取消事件的简单方法。
由于你使用的是DialogFragment
,这个类有一个非常方便的方法,DialogFragment#onCancel()
当 DialogFragment
被取消时被调用。在那里做你的逻辑。
DialogFragment 更复杂,其生命周期与普通对话框略有不同。因此,如果您尝试将某个基于 Dialog
的方法移植到 DialogFragment
,请首先检查文档,可能存在一些允许您的新实现运行的方法妥妥的!
关于java - DialogFragment 中未调用 OnCancelListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14790103/
我有一个简单的AlertDialog,它显示了一些项目的列表,单击其中一个项目后,单击的项目将传递回封闭的Activity。我还想在用户取消对话框时执行一些默认处理(使用后退按钮)——更具体地说,在这
我试图在 DialogFragment 上设置监听器,但一直收到空指针异常。 这是我的 DialogFragment 子类: public static class TermsFragment ext
在我的 Activity 中,我从 Web 服务加载一些数据,在此期间我向用户显示 ProgressDialog ...我希望用户能够在按下 BACK D-Pad 键时关闭 Activity 。我是这
此 DialogFragment 实现会导致 IllegalStateException( "You can not set Dialog's OnCancelListener or OnDismis
我是一名优秀的程序员,十分优秀!