Google Pay AutoResolveHelper.resolveTask()未在Fragment中调用onActivityResult

时间:2019-01-03 10:36:18

标签: android android-fragments google-pay

我已经在应用中实现了Google Pay,并发出了payData请求,我正在使用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还是我自己可以启动ActivityForResult了吗?

2 个答案:

答案 0 :(得分:2)

从今天开始,结果的接收已绑定到Activity。造成这种情况的部分原因是该库未完全使用startActivityForResult来启动此过程;和Fragment对相同功能的支持目前受到限制。

目前基本上有两种方法可以绕过此问题(这些方法也已在其他线程中共享)。但是,我个人认为,片段和活动之间的混合责任并不能提供清晰的代码和清晰的逻辑,因此,到目前为止,我只考虑一种方法,其中活动负责对{{1 }},捕获结果并与片段共享。为了减少两者之间的耦合程度,我考虑通过合约/接口来实现,而不是从片段中调用活动。

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

AutoResolveHelper

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

结果准备好后,您可以选择查找有问题的片段,并将interface PaymentsContract { fun loadPaymentData(request: PaymentDataRequest, requestCode: Int) } 方法传播给它,或者也可以对片段使用类似的基于合约的方法。

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

希望这很有用。

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

答案 1 :(得分:0)

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