片段中的导航问题。人造人

Navigation issue from a Fragment. Android

提问人:Giga Shubitidze 提问时间:11/4/2023 更新时间:11/4/2023 访问量:37

问:

我遇到了 Android 导航组件的问题。我已经在我的应用程序中设置了一个 NavHostFragment,并且我正在尝试使用 Navigation.findNavController(view).navigate() 从一个片段导航到另一个片段。但是,我一直遇到错误“视图没有设置导航控制器”。

如果您想仔细查看,请看下面这个项目: https://github.com/giorgishubitidze3/fitnessApp

我在主要活动中设置的底部菜单栏图标工作得很好。但是如果我尝试 从锻炼片段导航到锻炼详细信息片段应用程序崩溃并显示错误“View 没有设置导航控制器”。

我在回收器视图适配器(显示锻炼片段中的项目)中设置了一个点击侦听器,如下所示:

holder.itemView.setOnClickListener{
            switchToDetailCallback()
        }

我尝试导航到这样的不同片段:

val adapter = ExerciseAdapter(data){ ->
           Navigation.findNavController(view).navigate(R.id.action_workoutsFragment_to_workoutDetails)
        }

此外,这是我设置了片段容器视图的主要活动xml的一部分:

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"/>

尝试在 chatgpt 的帮助下更改内容,但仍然不起作用。

android kotlin android-fragments navgraph android-navhostfragment

评论


答:

0赞 Joseph Lutukai 11/4/2023 #1

嗨,我已经查看了 git 上的代码 错误发生在主活动上,使用导航图时,不应为了导航而替换片段。 要在底部栏上导航您的顶级目标,您可以调用 这将在用户点击底部导航项(即会话)时处理导航 注意:底部导航菜单项 ID 应与导航图上的片段 ID 匹配,才能正常工作。您的主要活动应如下所示bottomNavigationBar.setupWithNavController(navController)

 class MainActivity : AppCompatActivity() {
/*
initializes the navigation controller lazily
 */
private val navController: NavController by lazy {
    val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.fragment_container) as NavHostFragment
    navHostFragment.navController
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val bottomNavigationBar = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
    val actionBar: ActionBar? = supportActionBar
    actionBar?.hide()
    /*
        handles top level navigation between fragments
        Note: menu items in bottom_navigation_menu.xml must have the same id as the fragments
    * https://developer.android.com/guide/navigation/navigation-ui#bottom_navigation
     */
    bottomNavigationBar.setupWithNavController(navController)

    // hide bottom navigation bar when not on top level destinations
    navController.addOnDestinationChangedListener { _, destination, _ ->
        if (destination.id in listOf(
                R.id.homeFragment,
                R.id.sessionFragment,
                R.id.workoutsFragment,
                R.id.profileFragment
            )
        ) {
            bottomNavigationBar.visibility = View.VISIBLE
        } else {
            bottomNavigationBar.visibility = View.GONE
        }
    }
}

}

然后,从适配器回调上的锻炼片段中,您现在只需调用 To navigate to workout details。findNavController().navigate(R.id.action_workoutsFragment_to_workoutDetails)

请参阅 https://developer.android.com/guide/navigation/integrations/ui?authuser=1#bottom_navigation