![](/img/trans.png)
[英]Navigation Component - BottomNavigationView - Don't keep startDestination fragment when back
[英]button back in startDestination with navigation component
我需要一個帶有導航圖的第二個活動,並在工具欄中有一個返回按鈕到第一個也包含導航圖的活動
在我的第二個活動中,如果出現后退箭頭按鈕但在活動中沒有,我在進入片段時有 onSupportNavigateUp 和 setupActionBarWithNavController。
嘗試在活動和片段中添加 setHomeButtonEnabled 和 setDisplayHomeAsUpEnabled ,如果按鈕出現回來,但是當我在前面輸入一些片段並返回片段時, startDestination 按鈕消失了
我只需要將按鈕保持在活動中並解決我的問題
您可以通過指定 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)
}
}
然后在活動中做任何你想做的事情:
override fun onNavigateUp(): Boolean {
finish()
return true
}
你不能,活動有自己的工具欄,在你的情況下,他們有兩個不同的 NavControllers。 因此,您的第二個活動為他的片段管理 NavUp 按鈕,當開始目標片段出現時,NavUpButton(Backbutton) 消失,因為它沒有留下任何目的地。 如果您以編程方式在該(第二個活動)的開始目標上顯示 NavUp 按鈕並管理 onClick 並啟動第一個活動,該活動總是轉到第一個活動片段的開始目標,因為它有自己的導航控制器。
問題是導航 UI 不是那樣工作的。 更好的方法是僅使用一個具有多個片段的活動。 並使用任何其他方法在同一個導航控制器中解決您的問題。
添加setHomeButtonEnabled功能。 到您的返回操作。 如果您使用按鈕返回,將其添加到 onClick 或使用 backPress,覆蓋 backPress。
使用此解決方案:當您嘗試返回 startDestination 時,您將設置按鈕啟用。
我創建了一個界面來顯示/隱藏導航主機活動中的按鈕。 以下是活動如何實現顯示/隱藏按鈕的界面方法:
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)
}
這是按下向上按鈕時活動中的方法:
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() {
}
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.