这是一个示例应用程序,用于演示嵌套 fragment 和钱包的问题
https://github.com/zumper/WalletTest
这是应用程序的嵌套结构
MainActivity
|
+-> TopLevelFragment
|
+-> NestedFragment
|
+-> SupportWalletFragment
SupportWalletFragment
配置为请求代码 3333
via
public static final int WALLET_REQUEST_CODE = 3333;
...
WalletFragmentInitParams.Builder startParamsBuilder =
WalletFragmentInitParams.newBuilder()
.setMaskedWalletRequest(generateMaskedWalletRequest("10.99"))
.setMaskedWalletRequestCode(WALLET_REQUEST_CODE);
但是,当从钱包 Activity 中选择付款方式时,结果将通过
请求代码值为 66036
的 MainActivity.onActivityResult()
然后转到 TopLevelFragment.onActivityResult()
,请求代码值为 500
。
就是这样。 NestedFragment.onActivityResult()
永远不会使用预期的请求代码 3333
此问题似乎是一个已知问题:
http://blog.shamanland.com/2014/01/nested-fragments-for-result.html
https://code.google.com/p/android/issues/detail?id=40537
我可以通过拦截 onActivityResult()
并通过事件总线或其他方式中继参数来解决实际代码中的问题。
棘手的部分是我什至没有传入正确的 requestCode
...这使得我的所有 hack 都非常脆弱。
我们有一个 fragment 较多的应用程序,我无法比现有的减少更多的层次结构。
还有其他选项可以解决这个问题吗?
最佳答案
我已经和谷歌讨论过这个问题..答案是没有答案。如果您在嵌套 fragment 情况下使用 SupportWalletFragment
,则 Activity 结果传播将不起作用(您需要自己处理),并且您的 requestCode
将不会被遵守 MaskedWalletRequest
(FullWalletRequest
将会受到尊重)。
如果您使用 native fragment 而不是支持库 fragment ,requestCode
将受到尊重,但您仍然需要处理自己的传播。
我们需要继续使用支持库。因此,在我们的例子中,我手动处理 Activity 结果的传播,并且我已将 requestCode
设置为 500
以匹配我似乎从蒙面钱包响应结果中获得的代码。我认为这是在目前情况下能做的最好的事情。如果我得到更多澄清,我会在这里更新。
关于android - 如何正确处理嵌套 fragment 中的 MaskedWallet 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29641624/