0

Ich habe eine Aktivität, die ein Fragment hosten. In diesem Fragment öffne ich ein DialogFragment.Speichern Verweis auf Schnittstelle Rückruf in DialogFragment nach Konfiguration ändern

Im Fragment rufe ich diese Funktion auf, um den Dialog anzuzeigen. Beachten Sie, dass vor dem Anzeigen des Dialogfelds eine Schnittstelle in der DialogFragment definiert wurde.

private void showRatingDialog(){ 

     if (getActivity() != null) return; 

     MyRatingDialog ratingDialog = new MyRatingDialog(); 
     ratingDialog.setOnRatingDialog(new MyRatingDialog.OnRatingDialog() { 
      // some code 
     }); 

     ratingDialog.show(getActivity().getSupportFragmentManager(), MyRatingDialog.TAG);   

} 

Meine MyRatingDialog Klasse:

public class MyRatingDialog extends DialogFragment{ 

    private OnRatingDialog onRatingDialog; 

    public interface OnRatingDialog{ 
     void onSubmitRating(int rateSelected); 
     void onCancelRating(); 
    } 

    public void setOnRatingDialog(OnRatingDialog onRatingDialog) { 
     this.onRatingDialog = onRatingDialog; 
    } 


    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     View layout = getActivity().getLayoutInflater().inflate(R.layout.dialog_rating, null, false); 

     alertDialog = new AlertDialog.Builder(getActivity()).setView(layout).create(); 
     alertDialog.setCancelable(false); 

     ratingStarComponent = (RatingStarComponent)layout.findViewById(R.id.rating_star_component); 
     ratingStarComponent.setOnRateListener(new RatingStarComponent.OnRateListener() { 
      @Override 
      public void onRateClickListener(int starRate) { 
       rate = starRate; 
      } 
     }); 

     Button rateButton = (Button)layout.findViewById(R.id.rate); 
     rateButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (onRatingDialog!=null) { // this is null after a configuration change 
        onRatingDialog.onSubmitRating(rate, optionsSelected, commentsEditText.getText().toString()); 
        alertDialog.dismiss(); 
       } 
      } 
     }); 

     ImageView closeButton = (ImageView)layout.findViewById(R.id.close); 
     closeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       alertDialog.dismiss(); 
      } 
     }); 

     return alertDialog; 


    } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 
     super.onDismiss(dialog); 

     onRatingDialog.onCancelRating(); 

    } 

} 

Das Problem ist, dass nach einem configurationChange wie Bildschirm-Rotation oder andere configurationChange, die Schnittstelle onRatingDialog null ist. Meine Frage ist, was ist der beste Weg/Best Practice, um den Verweis auf onRatingDialog-Schnittstelle nach einem configurationChange zu speichern? Ich möchte nicht, dass die gehostete Activity die Schnittstelle implementiert, da ich denke, es ist komplexer Zugriff auf den Dialog. Indem setRetainInstance (true) ausgeführt wird, wird das Dialogfeld nach dem Konfigurationswechsel geschlossen. Wie kann ich das Dialogfeld sichtbar halten, das den Verweis auf die Schnittstelle enthält?

Danke.

Antwort

0

Check-out fragments doc.

den Code unten auf der Seite finden Sie einen Zuhörer zu implementieren, müssen Sie Ihre Aktivität implementieren, um den Listener Sie im Dialog erstellt. Dann wird die Aktivität von dialogFragment benachrichtigt und das betroffene Fragment von Aktivität benachrichtigt.

public static class FragmentA extends ListFragment { 
OnArticleSelectedListener mListener; 
... 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnArticleSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); 
    } 
} 
... 

Sie können auch das Beispielprojekt herunterladen here

+0

Sorry, aber dieses nicht meine Frage beantworten. Ich wollte vermeiden, die Schnittstelle durch die Host-Aktivität zu implementieren, um es einfacher zu machen. Ich möchte nur wissen, ob es eine Möglichkeit gibt, den Verweis auf den Listener von der DialogFragment beizubehalten, wenn ein configurationChanges auftritt. Danke – FOMDeveloper

+1

ich denke, die Antwort ist nein ... weil dies die einzige korrekte und fehlerfreie Möglichkeit ist, Fragmente zu implementieren. –