nicht aufgerufen. Ich habe eine einfache AlertDialog
, die eine Liste einiger Elemente anzeigt, und nach dem Klicken auf eines der Elemente wird das angeklickte Element an die umschließende Activity
zurückgegeben. Ich möchte auch einige Standardbehandlung durchführen, wenn der Benutzer den Dialog bricht (mit der Zurück-Taste) - genauer gesagt, ich möchte eine leere Zeichenfolge an die Aktivität in einem solchen Fall übergeben.OnCancelListener wird in DialogFragment
Wenn ich jedoch den Dialog in einem DialogFragment
setzen (aus dem Kompatibilität Paket), die OnCancelListener
nicht aufgerufen wird, wenn ich den Dialog mit der Zurück-Taste schließen. Was mache ich falsch?
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();
}
}
I edited meine Frage. Ich möchte, dass der Code im 'OnCancelListener' aufgerufen wird, wenn der Dialog mit der * Zurück-Taste * geschlossen wird. – Natix
@Natix sehen [diese Antwort] (http://stackoverflow.com/a/7815342/1815485), es macht das gleiche. Sie müssen einen 'OnKeyListener' hinzufügen, um nach dem Zurück-Tastendruck zu suchen. –
Nun, diese Lösung sollte wahrscheinlich funktionieren, aber wenn ich den Dialog direkt innerhalb einer Aktivität ohne 'DialogFragment' anlege, wird der' OnCancelListener' aufgerufen - sowohl wenn die Zurück-Taste gedrückt wird, oder wenn der Benutzer außerhalb des Dialogs klickt. Ich verstehe nicht, warum das DialogFragment das Verhalten ändert. – Natix