从 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 不应该是父级。因为父级可以是Activity
或Fragment
。不过我不确定。给我几分钟检查一下。
它不起作用。 “null 不能转换为非 null 类型 android.navigation.fragment.NavHostFragment”,因为 parent 为 null。我更新了我的问题。我必须使用 navController
这里零是 backstack 索引(如果你自己实现图表应该是这样)
感谢 Rahul,但仍然无法正常工作,父母为空。片段在 NavController 中以上是关于从 NavController 获取片段的主要内容,如果未能解决你的问题,请参考以下文章
如何在片段中而不是在活动中使用 NavController(在片段中带有 NavHost)?
IllegalArgumentException:此 NavController 未知导航目的地 xxx
Android:使用 BottomNavigationView、NavController 和 SafeArgs 恢复片段