2016-05-03 7 views
0

Grundsätzlich habe ich einen Login-Bildschirm, in dem Benutzer ihre E-Mail-Adresse und ihr Passwort eingeben. Nachdem sie ihre Daten eingereicht haben, überprüfe ich, ob sie ihre E-Mail-Adresse bestätigt haben . Wenn nicht, zeige ich einen Dialog mit einer entsprechenden Nachricht an. In diesem Dialog gebe ich ihnen eine neutrale Schaltfläche, um eine neue Bestätigungs-E-Mail anzufordern, falls sie noch keine erhalten haben. Wenn sie auf diese Schaltfläche geklickt haben, möchte ich einen weiteren Dialog mit einer Nachricht anzeigen, dass die E-Mail erfolgreich gesendet wurde. Das Problem ist, dass, wenn ich den zweiten Dialog aus dem OnClickListener des ersten Dialogs erstelle und zeige, der zweite Dialog instanziiert, aber dann sofort zerstört wird. Also meine Frage ist, warum passiert das und wie implementiere ich diese Art von Funktionalität, so dass jedes Fragment, das gezeigt wird, während der Rotation beibehalten wird?Der zweite Dialog wird automatisch gelöscht, wenn er im OnClickListener des ersten Dialogs erstellt wird.

NotVerifiedEmailDialog.java (erster Dialog):

public class NotVerifiedEmailDialog extends DialogFragment 
{ 
    private static final String TAG = "NotVerifiedEmailDialog"; 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     return new AlertDialog.Builder(getActivity()) 
      .setTitle(R.string.email_not_verified) 
      .setMessage(R.string.email_not_verified_message) 
      .setPositiveButton(android.R.string.ok, null) 
      .setNeutralButton(R.string.request_new_email, new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int which) 
       { 
        EmailSentDialog dialog = new EmailSentDialog(); 
        dialog.show(getChildFragmentManager(), dialog.getMyTag()); 
       } 
      }) 
      .create(); 
    } 

    public String getMyTag() 
    { 
     return TAG; 
    } 
} 

EmailSentDialog.java (zweiter Dialog):

public class EmailSentDialog extends DialogFragment 
{ 
    private static final String TAG = "EmailSentDialog"; 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     return new AlertDialog.Builder(getActivity()) 
       .setTitle(R.string.success) 
       .setMessage(R.string.email_sent_message) 
       .setPositiveButton(android.R.string.ok, null) 
       .create(); 
    } 

    public String getMyTag() 
    { 
     return TAG; 
    } 
} 

Antwort

0

Falls jemand auf dieses Problem ist die Lösung getChildFragmentManager() mit getParentFragment().getChildFragmentManager() zu ersetzen. Der erste erhält einen Kindfragment-Manager des ersten Dialogs, der wegen des Button-Klicks zerstört wird (deshalb wird der zweite Dialog sofort zerstört, da er an den Child-Fragment-Manager des ersten Dialoges gebunden ist), während letzterer bekommt ein Kind Fragment Manager des Elternfragments (in meinem Fall LoginFragment) und wird daher nicht sofort zerstört.

0

Versuchen die folgenden Variablen als Instanzvariablen zu machen. Ihr Dialogobjekt kann durch den vorherigen Dialog zerstört werden.

EmailSentDialog dialog; 
+0

Versucht es, aber das gleiche passiert. – techie