带有导航组件的 startDestination 中的按钮返回
button back in startDestination with navigation component
我需要第二个 activity 和导航图,并且在工具栏中有一个 return 按钮到第一个 activity 也包含导航图
在我的第二个 activity 中,如果箭头后退按钮出现但在 activity 中没有。
尝试在 activity 和片段中添加 setHomeButtonEnabled 和 setDisplayHomeAsUpEnabled,如果按钮出现在后面,但是当我在前面输入一些片段并且 return 到片段 startDestination 消失时按钮返回
我只需要将按钮保持在 activity 中并解决我的问题
添加 setHomeButtonEnabled 功能。到您的 returning 操作。如果您 return 使用按钮将其添加到 onClick 或使用 backPress,请覆盖 backPress。
有了这个解决方案:当您尝试 return 您的 startDestination 时,您将设置您的按钮启用。
你不能,activity 有自己的工具栏,在你的情况下,他们有两个不同的导航控制器。因此,您的第二个 activity 为他的片段管理 NavUp Button,当开始 Destination 片段时,NavUpButton(Backbutton) 消失,因为它没有留下任何目的地。如果您以编程方式在第一个 activity 的开始目的地显示 NavUp Button 并管理 onClick 并首先开始 activity ,它总是转到第一个 activity 片段的开始目的地,因为它有它有自己的导航控制器。
问题是导航 UI 不是那样工作的。更好的方法是只使用一个 activity 和多个片段。并使用任何其他方法在同一导航控制器内解决您的问题。
您可以通过指定 setFallbackOnNavigateUpListener 来实现:
private fun setupToolbar() {
val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration =
AppBarConfiguration.Builder()
.setFallbackOnNavigateUpListener { onNavigateUp() }
.build()
dataBinding.toolbar.apply {
setupWithNavController(navController, appBarConfiguration)
}
}
然后在 Activity 中为所欲为:
override fun onNavigateUp(): Boolean {
finish()
return true
}
我从导航主机 activity 创建了一个到 show/hide 向上按钮的界面。下面是 activity 如何实现 show/hide 向上按钮的接口方法:
override fun showUpButton() {
val navController = this.findNavController(R.id.nav_host)
val listener = AppBarConfiguration.OnNavigateUpListener { navController.navigateUp() }
val abc = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
NavigationUI.setupActionBarWithNavController(this, navController, abc)
}
override fun hideUpButton() {
val navController = this.findNavController(R.id.nav_host)
NavigationUI.setupActionBarWithNavController(this, navController)
}
这里是activity按下向上按钮时的方法:
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.nav_host)
if(!navController.navigateUp()){ // When in start destination
onBackPressed()
}
return navController.navigateUp()
}
在一个片段中,只要按下后退按钮(不是向上按钮)就可以收听:
private fun setupBackPress() {
requireActivity()
.onBackPressedDispatcher
.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
}
})
}
我需要第二个 activity 和导航图,并且在工具栏中有一个 return 按钮到第一个 activity 也包含导航图
在我的第二个 activity 中,如果箭头后退按钮出现但在 activity 中没有。
尝试在 activity 和片段中添加 setHomeButtonEnabled 和 setDisplayHomeAsUpEnabled,如果按钮出现在后面,但是当我在前面输入一些片段并且 return 到片段 startDestination 消失时按钮返回
我只需要将按钮保持在 activity 中并解决我的问题
添加 setHomeButtonEnabled 功能。到您的 returning 操作。如果您 return 使用按钮将其添加到 onClick 或使用 backPress,请覆盖 backPress。
有了这个解决方案:当您尝试 return 您的 startDestination 时,您将设置您的按钮启用。
你不能,activity 有自己的工具栏,在你的情况下,他们有两个不同的导航控制器。因此,您的第二个 activity 为他的片段管理 NavUp Button,当开始 Destination 片段时,NavUpButton(Backbutton) 消失,因为它没有留下任何目的地。如果您以编程方式在第一个 activity 的开始目的地显示 NavUp Button 并管理 onClick 并首先开始 activity ,它总是转到第一个 activity 片段的开始目的地,因为它有它有自己的导航控制器。
问题是导航 UI 不是那样工作的。更好的方法是只使用一个 activity 和多个片段。并使用任何其他方法在同一导航控制器内解决您的问题。
您可以通过指定 setFallbackOnNavigateUpListener 来实现:
private fun setupToolbar() {
val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration =
AppBarConfiguration.Builder()
.setFallbackOnNavigateUpListener { onNavigateUp() }
.build()
dataBinding.toolbar.apply {
setupWithNavController(navController, appBarConfiguration)
}
}
然后在 Activity 中为所欲为:
override fun onNavigateUp(): Boolean {
finish()
return true
}
我从导航主机 activity 创建了一个到 show/hide 向上按钮的界面。下面是 activity 如何实现 show/hide 向上按钮的接口方法:
override fun showUpButton() {
val navController = this.findNavController(R.id.nav_host)
val listener = AppBarConfiguration.OnNavigateUpListener { navController.navigateUp() }
val abc = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
NavigationUI.setupActionBarWithNavController(this, navController, abc)
}
override fun hideUpButton() {
val navController = this.findNavController(R.id.nav_host)
NavigationUI.setupActionBarWithNavController(this, navController)
}
这里是activity按下向上按钮时的方法:
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.nav_host)
if(!navController.navigateUp()){ // When in start destination
onBackPressed()
}
return navController.navigateUp()
}
在一个片段中,只要按下后退按钮(不是向上按钮)就可以收听:
private fun setupBackPress() {
requireActivity()
.onBackPressedDispatcher
.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
}
})
}