提问人:Giga Shubitidze 提问时间:11/4/2023 更新时间:11/4/2023 访问量:37
片段中的导航问题。人造人
Navigation issue from a Fragment. Android
问:
我遇到了 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 的帮助下更改内容,但仍然不起作用。
答:
嗨,我已经查看了 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
评论