9

我已经在应用程序中实现了 Google Pay 并发出了 paymentData 请求我正在使用 AutoResolveHelper 来显示底页,然后通过 onActivityResult 获取结果。我是从 Fragment 而不是 Activity 提出这个请求的。所以我正在传递这样的父母活动。

 paymentsClient?.loadPaymentData(gpayViewModel.paymentDataRequest)?.let { task ->
            AutoResolveHelper.resolveTask(task, requireActivity(), LOAD_PAYMENT_DATA_REQUEST_CODE)
        }

问题是这个 AutoResolveHelper 没有在 Fragment 上调用 onActivityResult,而只是在 Activity 上调用。

我读过这样的东西:

如果您从片段调用 startActivityForResult(),那么您应该调用 startActivityForResult(),而不是 getActivity().startActivityForResult(),因为它会导致片段 onActivityResult()。

所以它建议当 AutoResolveHelper 在传递的活动上调用 startActivityForResult() 时,片段的 onActivityResult 将永远不会被调用。

所以现在我唯一的选择是在 Activity 中实现 onActivityResult 并以某种方式将此 Activity 的控制权传递给我的子 Fragment 但这需要一些样板代码,并且由于我的 Fragment 是可重用的,所以这个解决方案并不完美。

同时,我发现此代码 startActivityForResult 以正确的方式调用,并且片段的 onActivityResult 被正确调用:

 val intent = Intent(activity, CardIOActivity::class.java)
        intent.putExtra(CardIOActivity.EXTRA_REQUIRE_EXPIRY, true)
        intent.putExtra(CardIOActivity.EXTRA_REQUIRE_CVV, true)
        intent.putExtra(CardIOActivity.EXTRA_REQUIRE_CARDHOLDER_NAME, true)

        startActivityForResult(intent, CARD_IO_REQUEST_CODE)

那么我可以用某种方式替换这个 AutoResolveHelper.resolveTask() 以执行这个任务,这样就不需要 onActivityResult 或者我可以自己 startActivityForResult 吗?

4

2 回答 2

8

到今天为止,收到的结果将绑定到Activity. 造成这种情况的部分原因是图书馆并没有准确地startActivityForResult用来启动这个过程。并且Fragment对相同功能的支持目前是有限的。

目前基本上有两种方法可以规避这种情况(这些方法也已在其他线程中共享)。但是,我个人认为片段和活动之间的混合职责并不能提供很好的代码清晰度和清晰的逻辑,所以到目前为止,我只考虑一种方法,活动负责调用AutoResolveHelper,捕获结果并与片段共享。我不会从片段中调用活动,而是考虑通过合约/接口来执行此操作,以降低两者之间的耦合程度。

一个简单的例子可能是这样的:

interface PaymentsContract {
    fun loadPaymentData(request: PaymentDataRequest, requestCode: Int)
}

让活动实现它,并在构建时将其作为对片段的引用传递,使您的片段保持可重用且与活动无关。

一旦结果准备好,您可以选择找到有问题的片段并将onActivityResult方法传播给它,或者也可以对片段使用类似的基于合同的方法。

了解更多关于您的具体用例的信息会很有用,以便更好地理解在片段中处理此逻辑的基本原理,并最终将反馈反馈给团队以供未来开发考虑。

希望这是有用的。

编辑:接口的另一种替代方法是使用 lambda 表达式让您的片段知道在其他地方定义的可调用对象(例如:在您的活动中),并且需要在发生某些事情时调用(例如:当您的用户点击时) “使用 Google Pay 付款”按钮)。

于 2019-01-12T00:16:23.460 回答
-1

这是工作代码的链接。这可能不是完美的方法,但它可以完成工作。 https://readyandroid.wordpress.com/onactivityresult-is-not-being-called-in-fragment/

于 2019-05-26T09:35:29.257 回答