Mic*_*bro 8 android android-fragments google-pay
我已经在应用程序中实现了 Google Pay 并提出了 paymentData 请求我使用 AutoResolveHelper 来显示底部表格,然后通过 onActivityResult 获取结果。我是从 Fragment 而不是 Activity 发出这个请求。所以我正在传递这样的父活动。
paymentsClient?.loadPaymentData(gpayViewModel.paymentDataRequest)?.let { task ->
AutoResolveHelper.resolveTask(task, requireActivity(), LOAD_PAYMENT_DATA_REQUEST_CODE)
}
Run Code Online (Sandbox Code Playgroud)
问题是这个 AutoResolveHelper 不是在 Fragment 上调用 onActivityResult,而是只在 Activity 上调用。
我读过这样的东西:
如果您从片段中调用 startActivityForResult(),那么您应该调用 startActivityForResult(),而不是 getActivity().startActivityForResult(),因为它会导致片段 onActivityResult()。
所以它建议当 AutoResolveHelper 在传递的活动上调用 startActivityForResult() 时,片段的 onActivityResult 将永远不会被调用。
所以现在我唯一的选择是在 Activity 中实现 onActivityResult 并以某种方式将控制权从这个 Activity 传递给我的孩子 Fragment 但这需要一些样板代码,因为我的 Fragment 是可重用的,所以这个解决方案并不完美。
同时,我发现这段代码以正确的方式 startActivityForResult 并且比 Fragment 的 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)
Run Code Online (Sandbox Code Playgroud)
那么我可以以某种方式替换这个 AutoResolveHelper.resolveTask() 来执行这个任务,这样就不需要 onActivityResult 或者我可以自己 startActivityForResult 吗?
截至今天,结果的接收绑定到Activity
. 部分原因是图书馆没有准确地startActivityForResult
用来启动这个过程。并且目前Fragment
对相同功能的支持是有限的。
目前基本上有两种方法可以避免这种情况(这些也已在其他线程中共享)。但是,我个人觉得在片段和活动之间混合职责并不能提供很好的代码清晰度和清晰的逻辑,因此到目前为止,我只考虑一种方法,其中活动负责调用AutoResolveHelper
,捕获结果并与片段共享。我不会从片段中调用活动,而是考虑通过合同/接口来执行此操作,以降低两者之间的耦合级别。
一个简单的例子可能是这样的:
interface PaymentsContract {
fun loadPaymentData(request: PaymentDataRequest, requestCode: Int)
}
Run Code Online (Sandbox Code Playgroud)
让活动实现它,并在构建时将其作为对片段的引用传递,这样您的片段就可以保持可重用且与活动无关。
一旦结果准备好,您可以选择找到有问题的片段并将onActivityResult
方法传播给它,或者也可以对片段使用类似的基于契约的方法。
了解更多关于您的具体用例的信息会很有用,以便更好地理解在片段内处理此逻辑的基本原理,并最终将这些反馈反馈给团队以供未来开发考虑。
希望这是有用的。
编辑:接口的另一种替代方法是使用 lambda 表达式让您的片段知道在其他地方定义的可调用对象(例如:在您的活动中),并且需要在发生某些事情时调用(例如:当您的用户点击“使用 Google Pay 付款”按钮)。
归档时间: |
|
查看次数: |
1568 次 |
最近记录: |