如何使用导航组件从Activity传递结果到Fragment?

3

我有MainActivityProductListFragmentProductDetailActivity

ProductListFragment是一个起始片段。

当我在ProductListFragment中点击列表项时,它会按照我在nav_graph中设置的动作转到DetailActivity。

  val action = ProductListFragmentDirections.actionProductListFragmentToProductDetailActivity(productId)
  findNavController().navigate(action)

当我点击上按钮或按下返回按钮时,DetailActivity会被finish()并回到ProductListFragment页面。 在这种情况下,我想要像在ProductListFragment中使用onActivityResult()回调函数那样,在DetailActivity被finish()时获取一个结果。 因此,我应该使用什么方法来获取结果? 是否可以通过使用Navigation组件或findNavController来获取结果?

你认为 Detail 页面必须是一个 Activity 而不是一个 Fragment 的原因是什么? - Sam Chen
@SamChen 我使用Activity并没有特别的原因,只是将它制作成了一个Activity。 - CodingBruceLee
2个回答

2
如果您想启动一个Activity并从该Activity接收结果,您应该使用 Activity Result APIs。这是唯一正确的API,适用于此特定情况-没有Navigation特定的包装器围绕Activity Result APIs。

谢谢。我最终使用了registerForActivityResult(),效果很好。但我想知道是否可以在Navigation组件中使用Activity?我这么说的原因是有些人只使用单个Activity的Fragment,而另一些人同时使用Fragment和Activity。这取决于我的情况吗? - CodingBruceLee
1
你的导航图只存在于一个活动中,所以虽然你可以创建一个活动目标,但要考虑将其作为退出点,转移到一个与第一个活动独立的完全不同的活动。很少有理由故意选择使用多个活动,这几种情况在单一活动视频中有解释。 - ianhanniballake
非常感谢!我会去看那个视频的 :) - CodingBruceLee

0

您可以在主活动中观察详细活动的响应。

顺便说一下,导航组件是为具有多个片段目标的一个主要活动的应用程序设计的。因此,在您的情况下,您应该将您的DetailActivity转换为DetailFragment。然后,您可以使用OnBackPressedDispatcherProductListFragmentDetailFragment之间进行通信。


但它似乎也支持活动导航组件。 - CodingBruceLee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接