如果我从片段结果开始活动,我应该在片段或活动中调用活动结果吗?

时间:2019-05-16 13:08:35

标签: android android-fragments android-intent android-activity startactivityforresult

我不确定什么是正确的方法。我呼吁采取行动,导致产生不同的碎片。每个片段都应该有自己的onActivityResult吗?还是全部由活动的onActivityResult处理?

3 个答案:

答案 0 :(得分:1)

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

还有一个原因。

开始活动时,必须设置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时,您可以在主机活动中捕获结果。但是,在主机活动中,requestCode不再是您发送的那个,而是由Android内部在内部更改了requestCode:

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

如您所见,您可以在“主机”活动上捕获活动结果。但是,请求代码不再是您设置的代码(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。特别是,如果您有不同的片段来启动不同的活动等。如果您始终启动相同的活动,则可能会错误地认为可以在任意位置实现onActityResult。但是,事实并非如此。 每个片段或活动都应处理他们请求的活动结果。他们不应该处理其他实体的结果。您可以这样做,但只会增加不必要的代码复杂性。

答案 1 :(得分:1)

当您为片段的结果启动活动时,请切记不要使用getActivity()。startActivityForResult(),仅使用startActivityForResult并覆盖片段和bam中的onActivityResult即可得到回调。

答案 2 :(得分:1)

这是三种情况

  • 从片段开始活动,而无需使用活动上下文

    enter image description here

    • 从活动开始活动

enter image description here

  • 从嵌套片段开始活动

    什么是嵌套片段?

    A fragment embed into another fragment

    为什么嵌套片段无法接收onActivityResult()回调?

    选中此link

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

    选中此link

enter image description here