0

私は、Fragmentをホストするアクティビティを持っています。その断片で私はDialogFragmentを開きます。ConfigurationChange後のDialogFragmentのインターフェイスコールバックへの参照を保存する

Fragmentでは、この関数を呼び出してダイアログを表示します。ダイアログを表示する前に、私はDialogFragmentで定義されたインターフェースを設定しています。

private void showRatingDialog(){ 

     if (getActivity() != null) return; 

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

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

} 

マイMyRatingDialogクラス:

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(); 

    } 

} 

問題は、画面の回転やその他のconfigurationChangeようconfigurationChange後、インターフェースonRatingDialogがnullであるということです。 私の質問は、configureChangeの後にonRatingDialogインターフェイスへの参照を保存する最良の方法/ベストプラクティスは何ですか? 私はそれがダイアログへのより複雑なアクセスだと思うので、私はホストされたアクティビティがインターフェイスを実装するようにしたくありません。 setRetainInstance(true)を実行すると、dialogはconfigurationChangeの後に閉じられます。そのため、ダイアログへの参照を維持したまま、インターフェイスへの参照を維持する方法を教えてください。

ありがとうございました。

答えて

0

チェックアウトfragments doc.

をリスナーを実装するためにページの下のコードを見つけ、あなたの活動は、ダイアログで作成したリスナーを実装する必要があります。 次に、ActivityはdialogFragmentから通知され、関連するフラグメントをActivityに通知します。

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"); 
    } 
} 
... 

また、サンプルプロジェクトhere

+0

申し訳ありませんをダウンロードすることができますが、これは私の質問に答えdoesntの。私は、ホストアクティビティによるインターフェイスの実装を避け、より簡単にしたいと思っていました。私は、ConfigurationChangesが発生したときにDialogFragmentからリスナーへの参照を保持する方法があるかどうかを知りたいだけです。ありがとう – FOMDeveloper

+1

私は答えがノーだと思います...これはフラグメントを実装する唯一の正しいバグのない方法なのでです。 –

関連する問題