Ich habe eine einfache Klasse:Hörer über Bundle in AlertDialogFragment übergeben - ist das möglich?
public class AlertDialogFragment extends DialogFragment {
private static final DialogInterface.OnClickListener DUMMY_ON_BUTTON_CLICKED_LISTENER = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
};
public static final class Builder implements Parcelable {
public static final Creator<Builder> CREATOR = new Creator<Builder>() {
@Override
public Builder createFromParcel(Parcel source) {
return new Builder(source);
}
@Override
public Builder[] newArray(int size) {
return new Builder[size];
}
};
private Optional<Integer> title;
private Optional<Integer> message;
private Optional<Integer> positiveButtonText;
private Optional<Integer> negativeButtonText;
public Builder() {
title = Optional.absent();
message = Optional.absent();
positiveButtonText = Optional.absent();
negativeButtonText = Optional.absent();
}
public Builder(Parcel in) {
title = (Optional<Integer>) in.readSerializable();
message = (Optional<Integer>) in.readSerializable();
positiveButtonText = (Optional<Integer>) in.readSerializable();
negativeButtonText = (Optional<Integer>) in.readSerializable();
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeSerializable(title);
out.writeSerializable(message);
out.writeSerializable(positiveButtonText);
out.writeSerializable(negativeButtonText);
}
@Override
public int describeContents() {
return 0;
}
public Builder withTitle(Integer title) {
this.title = Optional.fromNullable(title);
return this;
}
public Builder withMessage(Integer message) {
this.message = Optional.fromNullable(message);
return this;
}
public Builder withPositiveButton(int buttonText) {
this.positiveButtonText = Optional.fromNullable(buttonText);
return this;
}
public Builder withNegativeButton(int buttonText) {
this.negativeButtonText = Optional.fromNullable(buttonText);
return this;
}
private void set(AlertDialog.Builder dialogBuilder, final AlertDialogFragment alertDialogFragment) {
if (title.isPresent()) {
dialogBuilder.setTitle(title.get());
}
if (message.isPresent()) {
dialogBuilder.setMessage(message.get());
}
if (positiveButtonText.isPresent()) {
dialogBuilder.setPositiveButton(positiveButtonText.get(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialogFragment.onPositiveButtonClickedListener.onClick(dialog, which);
}
});
}
if (negativeButtonText.isPresent()) {
dialogBuilder.setNegativeButton(negativeButtonText.get(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialogFragment.onNegativeButtonClickedListener.onClick(dialog, which);
}
});
}
}
public AlertDialogFragment build() {
return AlertDialogFragment.newInstance(this);
}
}
private static final String KEY_BUILDER = "builder";
private DialogInterface.OnClickListener onPositiveButtonClickedListener = DUMMY_ON_BUTTON_CLICKED_LISTENER;
private DialogInterface.OnClickListener onNegativeButtonClickedListener = DUMMY_ON_BUTTON_CLICKED_LISTENER;
private static AlertDialogFragment newInstance(Builder builder) {
Bundle args = new Bundle();
args.putParcelable(KEY_BUILDER, builder);
AlertDialogFragment fragment = new AlertDialogFragment();
fragment.setArguments(args);
return fragment;
}
public void setOnPositiveButtonClickedListener(DialogInterface.OnClickListener listener) {
this.onPositiveButtonClickedListener = listener != null ? listener : DUMMY_ON_BUTTON_CLICKED_LISTENER;
}
public void setOnNegativeButtonClickedListener(DialogInterface.OnClickListener listener) {
this.onNegativeButtonClickedListener = listener != null ? listener : DUMMY_ON_BUTTON_CLICKED_LISTENER;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
Builder builder = getArguments().getParcelable(KEY_BUILDER);
builder.set(alertDialogBuilder, this);
return alertDialogBuilder.create();
}
}
Jetzt habe ich auf den Knopf klicken Zuhörer in SimpleDialogFragment
direkt zu setzen, weil ich nicht die Zuhörer über Bundle
(args) passieren kann. Aber ich will - so es wie Instanziieren ein AlertDialog
aussehen:
AlertDialogFragment dialogFragment = new AlertDialogFragment.Builder()
.withTitle(R.string.no_internet_connection)
.withMessage(messageId)
.withPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).build();
dialogFragment.show(getSupportFragmentManager(), FRAGMENT_TAG_NO_INTERNET_CONNECTION);
Aber jetzt sollte ich Zuhörer auf diese Weise festgelegt:
AlertDialogFragment dialogFragment = new AlertDialogFragment.Builder()
.withTitle(R.string.no_internet_connection)
.withMessage(messageId)
.withPositiveButton(android.R.string.ok)
.build();
dialogFragment.setOnPositiveButtonClickListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialogFragment.show(getSupportFragmentManager(), FRAGMENT_TAG_NO_INTERNET_CONNECTION);
Vielleicht auf den Knopf klicken Zuhörer Einstellung direkt auf DialogFragment
Instanz, anstatt sie über Bundle
Argumente zu übergeben, ist nicht sicher, da die empfohlene Möglichkeit, Argumente an Fragment
zu übergeben sie über Bundle
Argumente übergeben.
Und ich weiß, dass die empfohlene Art und Weise mit Fragment
s in Android zu kommunizieren ist Host-Aktivität zu verpflichtenCallback-Schnittstelle zu implementieren. Aber auf diese Weise ist es nicht klar, dass Aktivität diese Schnittstelle implementieren sollte, bis ClassCastException
in Runtime geworfen wird. Und es macht auch starke Abhängigkeit - um es irgendwo außerhalb Aktivität zu verwenden Ich sollte die Callback
Schnittstelle in Aktivität implementieren. So kann ich es nicht in Fragment
verwenden s „unabhängig“ von HostAktivitäten: prepareAlertDialogFragment().show(getActivity().getSupportFragmentManager(), "tag");
benötigen Sie einen Parcelable.Creator? –
Nein, Sie sollten keinen Parcelable.Creator brauchen. Der obige Code sollte für Copy-Pasta bereit sein. – CodyEngel
Bitte beachten Sie, dass diese Methode Probleme verursachen kann. Aktivieren Sie in den Entwickleroptionen auf Ihren Geräten die Einstellung "Aktivitäten nicht beibehalten" und stellen Sie sicher, dass Sie beim Zurückkehren zu Ihrem Fragment, das diese Methode verwendet, nicht abstürzen. Normalerweise wird eine Ausnahme ausgelöst, weil der Listener nicht mehr im Speicher ist und es keinen Creator gibt, der ihn erneut instanziieren kann. – Kuffs