android - BottomAppBar 与 BottomNavigationDrawer 连接到 NavigationController

标签 android kotlin android-architecture-components android-architecture-navigation

您好,我正在尝试在我的项目中使用新的架构组件。简短描述我想要实现的目标:

  • 当用户在 MainFragment 上时,我想在 BottomAppBar 上显示导航图标(汉堡包)。用户可以点击导航图标并显示 BottomNavigationDrawer
  • 当用户选择一些菜单项,或在 MainFragment 上单击某些内容时,他将移动到另一个 fragment ,比如说 DebtDetailsFragment。然后 Hamburger 应由 NavigationController
  • 替换为“后退箭头”

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

但是当我取消注释这一行时,汉堡包消失了,因为 NavigationControllerBottomNavigationDrawer 中使用的 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 :

Without setted Navigation controller

底部抽屉导航

BottomNavigationDrawer

设置了 NavigationController - 汉堡不可见。

With 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/

相关文章:

java - Java 应用程序可以在 Android 2.2 设备上使用 USB Host 吗?

android - 在 Kotlin 中成功后的 Glide 回调

java - 在应用程序发明者或可thunkable或kodular中模拟键盘按键,例如应用程序构建网站

java - 通过 LiveData 观察器将项目添加到特定索引时出现 IndexOutOfBoundsException

android - 关于谷歌最新架构指南的 MVVM 模式,如何将数据(通知)从存储库类传递到模型 View 类

android - Android 应用程序中的 HTML5 视频播放器无法在某些手机上运行,​​为什么?

java - 如何限制 NestedScrollView 内 RecyclerView 的高度

android - 在 Fragment 之间共享数据的更好方法是什么?

android - 如何在android中使用getSharedPreferences

android - 我如何使用 Android 存储库中的流程?