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特定方法的方法,可能存在一些允许新实现正常运行的方法!
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()
| 归档时间: |
|
| 查看次数: |
18064 次 |
| 最近记录: |