【问题标题】:Return result to Activity from DialogFragment从 DialogFragment 将结果返回给 Activity
【发布时间】:2018-05-29 13:29:55
【问题描述】:

我正在尝试执行以下操作:

  1. 显示来自 Activity 的对话框片段(不是片段);
  2. 在 Activity 中检索结果。

问题是Activity中的onActivityResult没有被调用。

这是我展示 DialogFragment 的方式

DriverRatingDialogFragment dp = new DriverRatingDialogFragment();
// this solution works well in case of showing dialog from a fragment
// but I have to show it from the Activity
// dp.setTargetFragment(getSupportFragmentManager().findFragmentById(R.id.flContent), DriverRatingDialogFragment.REQUEST_CODE);
dp.show(getSupportFragmentManager(), DriverRatingDialogFragment.ARG_RATING);

这是我尝试从 DialogFragment 返回结果的方式:

    Intent intent = new Intent();

    // This solution works well in case of previously setting target Fragment,
    // but I have to return result to Activity

    // getTargetFragment().onActivityResult(
    // getTargetRequestCode(), REQUEST_CODE, intent);


    // and with this attempt App crashes
    // this.onActivityResult(REQUEST_CODE, Activity.RESULT_OK, intent);

这是我想在 Activity 中检索结果的地方,但它没有被调用:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == DriverRatingDialogFragment.REQUEST_CODE) {
            // todo

        }
        super.onActivityResult(requestCode, resultCode, data);
    }

怎么了?

【问题讨论】:

标签: android


【解决方案1】:

我以与您相同的方式启动 DialogFragment。

CreatePostDialog createPostDialog = new CreatePostDialog();
createPostDialog.show(getSupportFragmentManager(), "create_post_dialog");

我在活动中使用公共方法而不是意图发回数据。

((MainActivity)mContext).logout(Utils.getLocation(v));

上面的 sn-ps 是我的工作代码的复制粘贴示例。在这种情况下,注销是 MainActivity 中的一个公共方法,它接收一个点并用它做需要的事情。

【讨论】:

  • 酷,我还没想过。也许这不是最佳做法,但在我的情况下非常方便。谢谢!
  • 我还是个编码新手,但我的朋友有更多经验使用类似的方法。最后,您总是可以在执行之前检查上下文是否是一个instanceOf MainActivity。
  • 不要这样做。您正在将 Fragment 耦合到一个 Activity。现在只有 MainActivity 可以托管 CreatePostDialog(Fragment)。如果您在应用的其他地方需要该对话框会怎样?
  • @tir38,如果对话框总是调用注销方法,您可以为其创建一个接口,如果实例正确,则将上下文转换为接口,然后以相同的方式调用它。我的另一个选择是 EventBus。
  • @AllanW 同意了。这些是更好的选择。
【解决方案2】:

你可以使用回调 1.在你的对话框片段中定义一个回调

public Call mCall;
public interface Call {
        void returnData(Data data);
    }

2.关于对话片段生命周期

@Override
public void onDetach() {
    super.onDetach();
    mCall = (Call) getActivity();
    mCall.returnData(data);
}

3.activity只是实现了Call

activity implements DiaFragment.Call

【讨论】:

    【解决方案3】:

    onActivityResult 是在调用 startActivityForResult 后接收信息的,这不是你的情况。

    您需要从对话框中获取什么样的数据?

    DialogFragment 通常用于片段,而不是活动。查看警报对话框。

    【讨论】:

    • 谢谢。我必须从中返回两个双打
    • 您可以在常规对话框中设置活动变量的值
    猜你喜欢
    • 2016-01-27
    • 2016-05-04
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多