如果我开始 activity 以获得片段的结果,我应该调用 activity 片段的结果还是 activity?

If I start activity for result from a fragment, should I call on activity result in the fragment or activity?

我不确定什么是正确的方法。我有一些呼吁采取行动以在不同的片段中产生结果。每个片段都应该有自己的 onActivityResult 吗?还是应该全部是 activity 的 onActivityResult 中的句柄?

您必须为通过 startActivityForResult 启动 activity 的每个 Fragment 实施 onActityResult。 因此,每个片段都可以正确跟踪结果:activity 结果仅对请求它的片段有意义。

也是有原因的。

当你启动一个activity时,你必须设置一个requestCode:

// Note the request code: 0
startActivityForResult(0, new Intent(...))

但是,如果您从 Fragment 内部调用该方法,Android 将在内部更改请求代码(因此它可以自动跟踪触发请求的片段)。 发生这种情况是因为 Fragment 的主机是 FragmentActivity 而不是简单的 Activity

// From FragmentActivity
// Note how the request Code is overriden ((requestIndex + 1) << 16) + (requestCode & 0xffff)
startActivityFromFragment(...) {
    startActivityForResult(this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
}

因此,当 onActivityResult 被触发时,您可以在主机 activity 上捕获结果。但是,在主机 activity 中,requestCode 不再是您发送的请求代码,而是 requestCode 在内部被 Android 更改:

In host activity:
@Override
protected void onActivityResult(final int requestCode, final int resultCode,
                                @Nullable final Intent data) {
    // This print 65536
    Log.v("TEST", "onActivityResult: " + requestCode);
    super.onActivityResult(requestCode, resultCode, data);
}

如您所见,您可以在主机 activity 上捕获 activity 结果。但是,请求代码不再是您设置的代码 (0)。因此,在这里,您无法跟踪请求代码。因此,您无法追踪此结果的来源。

Android 将在您的片段中调用 onActivityResult。但是,在调用片段之前,请求代码会转换回您发送的值 (0):

// From FragmentActivity
// Note how the request Code is converted back to 0
onActivityResult(....) {
    // Android will call your fragment with the correct requestCode
    targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
}

//In your fragment:
@Override
protected void onActivityResult(final int requestCode, final int resultCode,
                                @Nullable final Intent data) {
    // This print 0. So, now, you know this is the result of the request 0
    Log.v("TEST", "onActivityResult: " + requestCode);
}

因此,在您的片段中实现 onActivityResult 也是有原因的。特别是如果你有不同的片段开始不同的活动等。如果你总是开始相同的 activity,你可能会错误地认为你可以在任何你想要的地方实现 onActityResult。然而,事实并非如此。 每个片段或 activity 都应该处理他们请求的 activity 结果。他们不应该处理其他实体的结果。您可以这样做,但这只会给您的代码增加不必要的复杂性。

当您开始 activity 获取片段的结果时,请记住不要使用 getActivity().startActivityForResult(),仅使用 startActivityForResult 并覆盖片段中的 onActivityResult 和 bam 你会得到回调.

这里有三种情况

  • 从片段 开始一个 activity 而不使用 activity 上下文

    • 从 activity
    • 开始 activity

  • 从嵌套片段

    开始 activity

    多么嵌套的片段?

    A fragment embed into another fragment

    为什么嵌套片段收不到onActivityResult()回调?

    检查这个 link

    如何手动调用 onActivityResult() 到嵌套片段

    勾选这个link