嗨,我正在尝试在项目中使用新的Arch组件。简短说明我要达到的目标:
MainFragment
时,我想在BottomAppBar上显示导航图标(汉堡)。用户可以单击导航图标并显示BottomNavigationDrawer
MainFragment
上单击某项时,他已移至另一个片段,请说DebtDetailsFragment
。然后,用NavigationController
下面我粘贴了
MainActivity
代码。当我用导航 Controller 注释行时,“汉堡包”图标可见,并且能够显示BottomNavigationDrawer
。但是,当我取消注释此行时,汉堡包消失了,因为
NavigationController
对NavigationView
中使用的BottomNavigationDrawer
一无所知。我不使用DrawerLayout
,因此 Controller 认为不需要汉堡包。方法
setupWithNavController
可以控制汉堡包图标和后退箭头,但我必须提供DrawerLayout
作为不使用的参数。该方法的文档:
所以问题是,当
NavigationController
与BottomAppBar
连接但没有DrawerLayout
时,如何显示Hamburger图标?我将使用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)
,而应使用拥有的顶级setupWithNavController(navController)
调用Toolbar
。
要设置BottomAppBar
,您应该自己设置自己的抽屉图标和handle clicks on the drawer icon。DrawerArrowDrawable
类可用于为您提供正确的抽屉图标:
val icon = DrawerArrowDrawable(bottomAppBar.context)
bottomAppBar.navigationIcon = icon