使用带有Android导航UI库的BottomNavigationView导航时,从操作栏中删除按钮

jef*_*cnd 12 android-support-library android-navigation android-jetpack

我创建了一个小应用程序,它有三个片段,可以通过BottomNavigationView进行顶级导航.如果您启动应用程序并单击底部导航栏上的导航按钮,则会在操作栏中显示一个向上按钮.以下是活动的代码:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        setSupportActionBar(toolbar)

        val navController = navHostFragment.findNavController()
        setupActionBarWithNavController(this, navController)
        setupWithNavController(bottomNav, navController)
    }

    override fun onSupportNavigateUp(): Boolean
            = findNavController(navHostFragment).navigateUp()

}
Run Code Online (Sandbox Code Playgroud)

这是结果的屏幕截图.该应用程序在主屏幕上启动,我所做的只是单击BottomNavigationView中的配置文件按钮.

在此输入图像描述

我试过听BottomNavigationView的项目选择并使用不同的NavOptions手动导航无济于事.当用户使用BottomNavigationView导航时,我们可以做些什么来避免在操作栏中显示向上按钮?

Jav*_*cio 22

从1.0.0-alpha07开始,您可以使用它AppBarConfiguration来配置该行为.

AppBarConfiguration有一个Builder构造函数,所以你可以创建一个新Builder的顶级目标,由他们引用id(这id是你在导航布局上设置的目标).

创建新的AppBarConfiguration:

val appBarConfiguration = AppBarConfiguration
            .Builder(
                    R.id.navigationHomeFragment,
                    R.id.navigationListFragment,
                    R.id.navigationProfileFragment)
            .build()
Run Code Online (Sandbox Code Playgroud)

然后,而不是setupActionBarWithNavController(this, navController)你需要打电话setupActionBarWithNavController(this, navController, appBarConfiguration)

这是处理顶部导航行为的正确方法.

  • 呃,好吧,这个组件现在就像魔术一样,我不知道 wtf 是怎么回事:) (2认同)
  • 谢谢。但从 1.0.0 开始,我必须调用 setupWithNavController( navController, appBarConfiguration) 才能使其工作 (2认同)

Jul*_*mus 6

我遇到了同样的问题,我找到了一种方法,通过NavController.addOnNavigatedListener获取当前片段,因此我在Activity中应用了以下逻辑,现在它对我有效

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)
    val navHost = supportFragmentManager
            .findFragmentById(R.id.navHostFragment) as NavHostFragment

    navHost.navController.addOnNavigatedListener { _, destination ->
        val showButton = showUpButton(destination.id)
        //Here occurs the magic
        supportActionBar?.setDisplayShowHomeEnabled(showButton)
        supportActionBar?.setDisplayHomeAsUpEnabled(showButton)
    }
}

//Check according to your convenience which fragment id
//should show or hide the "Up Button"
private fun showUpButton(id: Int): Boolean {
    return id != R.id.your_home_fragment && id != R.id.your_list_fragment 
            && id != R.id.your_profile_fragment
}
Run Code Online (Sandbox Code Playgroud)

这是我的项目

在此处输入图片说明

我不知道这是不是最好的选择,但是如果有人有更好的建议,我们会欢迎


Bob*_*ton 5

使用它而不是setupWithNavController

navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
     @Override
     public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
         toolbar.setTitle(destination.getLabel());
     }
});
Run Code Online (Sandbox Code Playgroud)

或者 Kotlin 中的等价物。

唯一要做的setupWithNavController就是添加一个监听器来更改工具栏标题,并创建向上按钮。如果您不想要向上按钮,只需添加一个仅更改工具栏标题的侦听器。