Vielleicht ein wenig spät, aber ich hatte auch das Problem, eine DialogFragment von einem nicht FragmentActivity zu nennen. Es wäre auch nicht sinnvoll, es zu einer Fragment-Aktivität für einen einfachen Dialog zu machen. Also war die Lösung für mich, eine Schnittstelle mit einem Callback void zu machen, um die DialogFragment-Antwort in der Aktivität zu erhalten. Für mich ist es besser, die Antwort in der Nähe des Dialogaufrufs zu erhalten, anstatt sie irgendwo in einem OnActivityResult-Override zu platzieren.
Die Schnittstelle:
import android.os.Parcelable;
/**
* Created by TH on 03.11.2015.
*/
public interface OnDialogResponseListener extends Parcelable {
void onDialogResponse(int responseCode);
}
Die allgemeine Dialogklasse:
OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() {
@Override
public int describeContents() {
return 0; //Leave this as it is
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//Leave this as it is
}
@Override
public void onDialogResponse(int responseCode) {
//Do what you want with your dialog answers
if(responseCode== Activity.RESULT_OK){
Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show();
}else if(responseCode==Activity.RESULT_CANCELED){
Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show();
}
}
};
YesNoDialog dialog = new YesNoDialog();
Bundle args = new Bundle();
args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light);
args.putString(YesNoDialog.YES, getString(R.string.action_add));
args.putString(YesNoDialog.NO, getString(R.string.action_cancel));
args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item));
args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item));
args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener);
dialog.setArguments(args);
dialog.show(getSupportFragmentManager(), "tag");
Das ist alles:
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
/**
* Code basisc found here:
* http://stackoverflow.com/questions/7977392/android-dialogfragment-vs-dialog
* changed by TH on 03.11.2015.
*/
public class YesNoDialog extends DialogFragment
{
public static final String TITLE="title";
public static final String MESSAGE="message";
public static final String LISTENER="listener";
public static final String YES="yes";
public static final String NO="no";
public static final String ICON_ID="icon_id";
private OnDialogResponseListener mResponseListener;
public YesNoDialog()
{
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Bundle args = getArguments();
String title = args.getString(TITLE, "");
String message = args.getString(MESSAGE, "");
String yes = args.getString(YES, "");
String no = args.getString(NO, "");
int iconID=args.getInt(ICON_ID);
mResponseListener=args.getParcelable(LISTENER);
return new AlertDialog.Builder(getActivity())
.setTitle(title)
.setMessage(message)
.setIcon(iconID)
.setPositiveButton(yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mResponseListener != null) {
mResponseListener.onDialogResponse(Activity.RESULT_OK);
}
}
})
.setNegativeButton(no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mResponseListener != null) {
mResponseListener.onDialogResponse(Activity.RESULT_CANCELED);
}
}
})
.create();
}
}
Und die Nutzung so sein würde. Vielleicht ein bisschen mehr Code als in einem einfachen Dialog, aber es behält seine Werte und zeigt auf Orientierungsänderung. Das war mein Ziel, ein DialogFragment zu verwenden.
Bitte bearbeiten Sie Ihre Frage, weil sie nicht klar genug ist. Versuchen Sie, Ihr DialogFragment zu implementieren, indem Sie die Aktivitätsklasse erweitern? – Marek
Nein, ich habe versucht, ein DialogFragment für eine benutzerdefinierte Klasse zu verwenden, die Activity erweitert. Die Tutorials sagen, dass die benutzerdefinierte Klasse FragmentActivity anstelle von Activity erweitern sollte. Also fragte ich, ob ich es schaffen könnte, die Aktivität zu erweitern. –
Haben Sie das versucht? Sind irgendwelche Probleme aufgetreten? – Marek