如何正确处理嵌套片段中的 MaskedWallet 响应

How to properly handle MaskedWallet response in nested fragments

这是一个示例应用程序,用于演示嵌套片段和钱包的问题

https://github.com/zumper/WalletTest

这里是app的嵌套结构

MainActivity
    |
    +-> TopLevelFragment
                |
                +-> NestedFragment
                        |
                        +-> SupportWalletFragment

SupportWalletFragment 通过

配置请求代码 3333
  public static final int WALLET_REQUEST_CODE = 3333;

  ...

  WalletFragmentInitParams.Builder startParamsBuilder =
          WalletFragmentInitParams.newBuilder()
                  .setMaskedWalletRequest(generateMaskedWalletRequest("10.99"))
                  .setMaskedWalletRequestCode(WALLET_REQUEST_CODE);

但是当从钱包中选择支付方式时 activity 结果通过 MainActivity.onActivityResult() 请求代码值为 66036 然后使用 500.

的请求代码值 TopLevelFragment.onActivityResult()

就是这样。 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 都非常脆弱。

我们有一个碎片繁多的应用程序,我无法再减少现有的层次结构。

还有其他解决方法吗?

我跟google谈过这个..答案是没有答案。如果您在嵌套片段情况下使用 SupportWalletFragment,activity 结果传播将不起作用(您需要自己处理)并且您的 requestCode 不会因 MaskedWalletRequest(它将被授予FullWalletRequest)。

如果您使用本机 Fragment 而不是支持库 Fragment,requestCode 将得到尊重,但您仍然需要处理自己的传播。

我们需要继续使用支持库。所以在我们的例子中,我手动处理 activity 结果的传播,并且我已将我的 requestCode 设置为 500 以匹配我似乎从蒙面钱包响应结果中获得的代码。我认为这是在这种情况下可以做的最好的事情。如果我更清楚的话,我会在这里更新。