【问题标题】:NavigationComponent: NavHostFragment inside a fragment导航组件:片段内的 NavHostFragment
【发布时间】:2021-04-09 08:10:14
【问题描述】:

我有这个带有导航组件的选项卡式 UI 和处理选项卡的 BottomNavigationView。 我的用例涉及这些选项卡片段之一,以拥有自己的BottomNavigationView。

我不认为nested navigation graphs 对我有用,因为我需要有一个内部NavHostFragment 和第二个BottomNavigationView。

所以我在我希望托管我的内部导航图的片段中。它包含一个像这样的片段。

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/inner_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"

我需要一种方法来获取上述片段的导航控制器。

通常,当您进行活动时,您会使用您为片段提供的 id 从 supportFragmentManager 调用 findFragmentById。

val navHostFragment = supportFragmentManager.findFragmentById(R.id.outer_nav_host) as NavHostFragment

所以我尝试从我的内部片段中调用活动对象

requireActivity().supportFragmentManager.findFragmentById(R.id.inner_host_fragment)

但是 findFragmentById 返回 null。

【问题讨论】:

  • 请注意,您应该始终使用FragmentContainerView,特别是不要使用&lt;fragment&gt; 标签,该标签在Fragment 1.2.0 中已被弃用。
  • @ianhanniballake 感谢您的提醒。我确实更改为FragmentContainerView。虽然手头的案子没有多大帮助。
  • 正确,这就是为什么它是评论,而不是答案:)
  • 能否在github上分享示例代码

标签: android kotlin android-fragments android-architecture-navigation


【解决方案1】:

尝试从supportFragmentManager获取NavHostFragment,然后再获取navController。

val navHostFragment =
        requireActivity().supportFragmentManager.primaryNavigationFragment as NavHostFragment
val navController = navHostFragment.navController

感谢@ianhanniballake,您需要使用childFragmentManager,因为您当前的片段是片段的子片段。

所以尝试改用:

val navHostFragment =
    childFragmentManager.primaryNavigationFragment as NavHostFragment
val navController = navHostFragment.navController

更新:

抛出这个 java.lang.NullPointerException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment

所以,来自 cmets 的解决方案:

val navHostFragment = childFragmentManager.findFragmentById(R.id.nav_host_fragment) 
                       as NavHostFragment 

并将nav_host_fragment替换为内部NavHostFragment的id。

【讨论】:

  • 通过&lt;fragment&gt; 标签膨胀片段意味着它是childFragmentManager 的一部分,而不是Activity 的FragmentManager 的一部分,因此到达supportFragmentManager 永远不是正确的方法。跨度>
  • 第一行抛出这个 java.lang.NullPointerException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment
  • @Vahid 很抱歉知道..你能不能试试这个val navHostFragment = childFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment ..替换nav_host_fragment ..用内部navHostFragment的id替换id
  • @Zain 谢谢老兄!我做到了,它确实奏效了!
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 2020-11-01
  • 2018-10-30
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多