如何收听 DialogFragment 关闭事件

How to listen to a DialogFragment dismiss event

我已经实现了一个自定义 DialogFragment,我在我的 postReviewFragment 中的 RatingBar 评分侦听器事件中显示它,我想在用户关闭对话框时将我的 RatingBar 评分设置回 0。

搜索 SO 我遇到了这些线程,但解决方案似乎对我不起作用:

DialogFragment Close Event

Can't use onDismiss() when using custom dialogs

DialogFragment and onDismiss

到目前为止,我使用上述线程尝试过的内容:

在 postReviewFragment 上实现 DialogInterface.OnDismissListener 并覆盖 onDismiss() 方法

   @Override
    public void onDismiss(final DialogInterface dialog) {

        userRating.setRating(0);

    }

我还在 DialogFragment 中覆盖了 onDismiss() 方法

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    final Fragment parentFragment = getParentFragment();
    if (parentFragment instanceof DialogInterface.OnDismissListener) {
        ((DialogInterface.OnDismissListener) parentFragment).onDismiss(dialog);
    }
}

但是当关闭 dialogFragment 时 onDismiss() 方法仍然没有启动,我做错了什么?

使用可用的 OnDismissListener.

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    public void onDismiss(DialogInterface dialog) {
                        MainActivity.this.finish();
                    }
                });

好的,我设法解决了:

  1. 首先确保您已在 DialogFragment 和显示对话框的 Fragment 上实施 DialogInterface.OnDismissListener 并覆盖 onDismiss() 方法。

  2. 然后当您显示 DialogFragment 设置目标片段时,这里我通过 Bundle 将评分传递给 DialogFragment

    android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
                PostReviewDialogFragment dialog = new PostReviewDialogFragment();
    
                // optionally pass arguments to the dialog fragment
                Bundle args = new Bundle();
                args.putInt("usersRating", rating);
                dialog.setArguments(args);
    
                dialog.setTargetFragment(RestaurantReviewFragment.this,REVIEW_FRAGMENT);
    
    
                dialog.show(fm, TAG);
    
  3. 在 DialogFraments 的 onDismiss() 方法中,我将评级设置为 0 并将其添加到 intent extra 并将 dialogFragment 中的评级栏设置为用户选择的值。

    Intent i = new Intent()
            .putExtra("rating1", rating);
    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, i);
    
  4. 然后我重写 onActivityResult() 方法来读取值并在关闭时将片段上的评分栏值设置为 0。

这可能不是最好的方法,但它确实有效,如果我发现比此方法更好的方法,我会更新答案。如果我的解释不是很清楚,请见谅,请查看下面的线程以获得更详细的解释。

参考资料:How to send data from DialogFragment to a Fragment?