【问题标题】:If I start activity for result from a fragment, should I call on activity result in the fragment or activity?如果我为片段的结果启动活动,我应该调用片段或活动中的活动结果吗?
【发布时间】:2019-05-16 13:08:35
【问题描述】:

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

【问题讨论】:

  • 它必须在你的片段中实现 onActivityResult。您的 onActivityResult 必须调用片段
  • 请检查这个例子。 stackoverflow.com/questions/17085729/…
  • 但是你附加的那个问题的答案是说我应该把它放在活动中不?我很困惑

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


【解决方案1】:

当你为一个片段的结果启动活动时,记住不要使用getActivity().startActivityForResult(),只使用startActivityForResult并覆盖片段中的onActivityResult,然后你就会得到回调。

【讨论】:

    【解决方案2】:

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

    这也是有原因的。

    当你开始一个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 被触发时,您可以在主机活动上捕获结果。但是,在宿主活动中,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);
    }
    

    如您所见,您可以在 Host 活动上捕获活动结果。但是,请求代码不再是您设置的那个(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。然而,事实并非如此。 每个片段或活动都应该处理他们请求的活动结果。他们不应该处理其他实体的结果。你可以这样做,但这只会给你的代码增加不必要的复杂性。

    【讨论】:

      【解决方案3】:

      这里有三种情况

      • 从片段开始一个活动不使用活动上下文

        • 从一个活动开始一个活动

      • 从嵌套片段开始一个活动

        什么是嵌套片段?

        A fragment embed into another fragment

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

        检查这个link

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

        检查这个link

      【讨论】:

        猜你喜欢
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多