您好,我正在尝试在我的项目中使用新的架构组件。简短描述我想要实现的目标:
- 当用户在
MainFragment
上时,我想在 BottomAppBar 上显示导航图标(汉堡包)。用户可以点击导航图标并显示BottomNavigationDrawer
- 当用户选择一些菜单项,或在
MainFragment
上单击某些内容时,他将移动到另一个 fragment ,比如说DebtDetailsFragment
。然后 Hamburger 应由NavigationController
替换为“后退箭头”
下面我粘贴了我的 MainActivity
代码。当我用导航 Controller 注释行时,汉堡包图标可见并且 BottomNavigationDrawer
能够显示。
但是当我取消注释这一行时,汉堡包消失了,因为 NavigationController
对 BottomNavigationDrawer
中使用的 NavigationView
一无所知。我不使用 DrawerLayout
,所以 Controller 认为不需要 Hamburger。
方法setupWithNavController
可以控制汉堡图标和后退箭头,但我必须提供DrawerLayout
作为我不使用的参数。
此方法的文档:
The Toolbar will also display the Up button when you are on a non-root destination and the drawer icon when on the root destination, automatically animating between them. This method will call [DrawerLayout.navigateUp] when the navigation icon is clicked.
那么问题来了,当NavigationController
连接了BottomAppBar
但没有连接DrawerLayout
时,如何显示汉堡图标呢?我将在 onOptionsItemSelected
方法中自行处理汉堡包点击。
class MainActivity : BaseActivity() {
@Inject
lateinit var viewModelProvider: ViewModelProvider.Factory
private val viewModel: MainActivityViewModel by lazy {
ViewModelProviders.of(this, viewModelProvider).get(MainActivityViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(bottomAppBar)
val navController = findNavController(R.id.main_nav_host_fragment)
//bottomAppBar.setupWithNavController(navController)
onDestroyDisposables += viewModel.uiStateObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(::render, Timber::e)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.bottomappbar_menu, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
android.R.id.home -> {
val bottomNavDrawerFragment = BottomNavigationDrawerFragment()
bottomNavDrawerFragment.show(supportFragmentManager, bottomNavDrawerFragment.tag)
}
}
return super.onOptionsItemSelected(item)
}
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.main_nav_host_fragment).navigateUp()
}
}
没有设置导航 Controller :
底部抽屉导航
设置了 NavigationController - 汉堡不可见。
最佳答案
BottomAppBar
不应该根据 anatomy of the BottomAppBar 显示向上按钮- 它应该只显示抽屉图标。正如在 behavior documentation 中看到的那样,向上按钮应该显示在顶部的 Toolbar
中。
因此,您永远不应该调用 bottomAppBar.setupWithNavController(navController)
,而是使用任何顶部 Toolbar
调用 setupWithNavController(navController)
有。
要设置您的 BottomAppBar
,您应该设置自己的抽屉图标和 handle clicks on the drawer icon自己。
DrawerArrowDrawable
类可以为您提供正确的抽屉图标:
val icon = DrawerArrowDrawable(bottomAppBar.context)
bottomAppBar.navigationIcon = icon
关于android - BottomAppBar 与 BottomNavigationDrawer 连接到 NavigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653474/