从 NavController 获取片段

Posted

技术标签:

【中文标题】从 NavController 获取片段【英文标题】:Get fragment from NavController 【发布时间】:2019-03-12 23:22:29 【问题描述】:

我有一个 NavController (navOrdersController),里面有 2 个片段。我当前的片段是 OrderDetailFragment,我想访问第一个片段 (OrdersFragment) 以更新 MainActivity 中的数据。我该怎么做?

我试过 findFragmentByTag 和 findFragmentByID 但总是返回 null。

我通过以下方式访问 OrderDetailFragment:

this.supportFragmentManager.fragments[position].findNavController().currentDestination

但我需要以前的片段。非常感谢

【问题讨论】:

【参考方案1】:

不能说代码 sn-p(我在下面添加)是最好的解决方案,但它对我来说可以在 android 导航组件的实现中使用 NavHostFragment 添加最近/当前的片段

你甚至可以用你的片段覆盖你活动的onActivityResult,你只需要获取添加的Fragment并将其称为onActivityResult,使用以下代码sn-p:

    NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
    Fragment fragment = navHostFragment.getChildFragmentManager().getFragments().get(0);
    fragment.onActivityResult(requestCode, resultCode, data);

【讨论】:

【参考方案2】:

如果两个 Fragment 具有相同的父 Activity,即使用getActivity() 获取 Activity 引用并使用 Activity.getSupportFragmentManager 找到该 Fragment。

.....

活动 X -> 片段 A -> 片段 B

如果片段 B 是片段 A 的子片段,则使用 getParentFragment。您正在寻找的片段就是这个片段。

如果有什么不清楚的地方请告诉我。

PS:Jetpack 导航库的作用与我们一直在做的一样。所以,之前Activity-Fragment的逻辑还是有效的。

编辑:

试试(parentFragment as NavHostFragment).childFragmentManager.findFragmentById()

我忘记了上次活动在其布局中声明了 NavHostFragment,因此总会有类型为“NavHostFrament”的根父片段

编辑: 我找到了解决方法

parentFragment.childFragmentManager.getFragment(Bundle().also  it.putInt("foobar",0) , "foobar")

【讨论】:

谢谢拉胡尔。它不起作用,因为 parent 是 NavGraph,而 child 是 OrderDetailFragment。 OrdersFragment 在中间 NavGraph 不应该是父级。因为父级可以是ActivityFragment。不过我不确定。给我几分钟检查一下。 它不起作用。 “null 不能转换为非 null 类型 android.navigation.fragment.NavHostFragment”,因为 parent 为 null。我更新了我的问题。我必须使用 navController 这里零是 backstack 索引(如果你自己实现图表应该是这样) 感谢 Rahul,但仍然无法正常工作,父母为空。片段在 N​​avController 中

以上是关于从 NavController 获取片段的主要内容,如果未能解决你的问题,请参考以下文章

使用 NavController 从片段导航到另一个片段

从通知导航到带有 NavController 的片段

如何在片段中而不是在活动中使用 NavController(在片段中带有 NavHost)?

IllegalArgumentException:此 NavController 未知导航目的地 xxx

Android:使用 BottomNavigationView、NavController 和 SafeArgs 恢复片段

如何知道何时调用了`navController.popBackStack()`?