嗨,我正在尝试在项目中使用新的Arch组件。简短说明我要达到的目标:

  • 当用户使用MainFragment时,我想在BottomAppBar上显示导航图标(汉堡)。用户可以单击导航图标并显示BottomNavigationDrawer
  • 当用户选择某个菜单项,或在MainFragment上单击某项时,他已移至另一个片段,请说DebtDetailsFragment。然后,用NavigationController
  • 将“汉堡”替换为“后退箭头”

    下面我粘贴了MainActivity代码。当我用导航 Controller 注释行时,“汉堡包”图标可见,并且能够显示BottomNavigationDrawer

    但是,当我取消注释此行时,汉堡包消失了,因为NavigationControllerNavigationView中使用的BottomNavigationDrawer一无所知。我不使用DrawerLayout,因此 Controller 认为不需要汉堡包。

    方法setupWithNavController可以控制汉堡包图标和后退箭头,但我必须提供DrawerLayout作为不使用的参数。

    该方法的文档:



    所以问题是,当NavigationControllerBottomAppBar连接但没有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 :

    android - 将BottomNavigationDrawer连接到NavigationController的BottomAppBar-LMLPHP

    底部导航抽屉

    android - 将BottomNavigationDrawer连接到NavigationController的BottomAppBar-LMLPHP

    设置了NavigationController-汉堡不可见。

    android - 将BottomNavigationDrawer连接到NavigationController的BottomAppBar-LMLPHP

    最佳答案

    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
    

    10-08 06:14