【问题标题】:How to use navigation component in fragment Android如何在 Fragment Android 中使用导航组件
【发布时间】:2020-11-10 10:01:11
【问题描述】:

我想在我的片段中使用导航组件。

我的 XML 代码是这样的

 <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    ...

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_nav_host_home"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:navGraph="@navigation/home_navigation"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/app_bar" />
</androidx.constraintlayout.widget.ConstraintLayout>

并像这样初始化导航代码。

class HomeFragment : Fragment() {

   //...initialie view


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val navController = Navigation.findNavController(binding.fragmentNavHostHome)
        navController.setGraph(R.navigation.home_navigation)

        val appBarConfiguration = AppBarConfiguration(navController.graph)

        NavigationUI.setupActionBarWithNavController(requireActivity() as AppCompatActivity, navController, appBarConfiguration)

    
    }

}

在我启动我的应用程序后,我收到了这样的错误消息。

View androidx.fragment.app.FragmentContainerView{... app:id/fragment_nav_host_home} does not have a NavController set

另外,findNavController() 不起作用。

如何在我的片段中使用导航组件

【问题讨论】:

  • 你应该将activity的navHostFragment作为参数提供给他.findNavCotroller
  • @ErenTüfekçi 在我的活动 XML 中,活动的 navHostFragment 是否意味着 FragmentContainerView?
  • 我通过使用 childFragment manager 解决了这个问题。

标签: android android-jetpack android-navigation android-jetpack-navigation android-navigation-graph


【解决方案1】:

Kotlin 答案

关键是尝试在onViewCreated()函数中使用childFragmentManager

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

  // Define container.
  val loginDialogContainer = childFragmentManager.findFragmentById(R.id.container) as NavHostFragment

  // Set nav controller.
  val loginNavController: NavController = loginDialogContainer.navController
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多