私は、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の後に閉じられます。そのため、ダイアログへの参照を維持したまま、インターフェイスへの参照を維持する方法を教えてください。
ありがとうございました。
申し訳ありませんをダウンロードすることができますが、これは私の質問に答えdoesntの。私は、ホストアクティビティによるインターフェイスの実装を避け、より簡単にしたいと思っていました。私は、ConfigurationChangesが発生したときにDialogFragmentからリスナーへの参照を保持する方法があるかどうかを知りたいだけです。ありがとう – FOMDeveloper
私は答えがノーだと思います...これはフラグメントを実装する唯一の正しいバグのない方法なのでです。 –