我有一個簡單的AlertDialog
,它顯示了一些項目的列表,並且在單擊其中一個項目後,被單擊的項目被傳回到封閉的Activity
。我也想在用戶取消對話時執行一些默認處理(使用後退按鈕) - 更具體地說,我想在這種情況下將空字符串傳遞給活動。OnCancelListener未在DialogFragment中調用
但是,如果我把在對話框中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();
}
}
我編輯我的問題。我希望在用「後退」按鈕*關閉對話框時調用「OnCancelListener」中的代碼。 – Natix 2013-02-09 16:40:18
@Natix看到[這個答案](http://stackoverflow.com/a/7815342/1815485),它是做同樣的事情。你必須添加一個'OnKeyListener'來監視後退按鍵。 – 2013-02-09 16:42:19
嗯,這個解決方案應該可能工作,但如果我直接在沒有'DialogFragment'的活動內部創建對話框,那麼'OnCancelListener'被調用 - 無論是當後退按鈕被按下時,還是用戶在對話框外單擊。我不明白爲什麼'DialogFragment'改變了行爲。 – Natix 2013-02-09 16:59:50