当前位置: 首页 > 知识库问答 >
问题:

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

尹昂雄
2023-03-14

我创建了一个小应用程序,它有三个片段,用于通过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()

}

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

我试过听BottomNavigationView的项目选择,并使用不同的导航选项手动导航,但都没有用。当用户使用BottomNavigationView导航时,我们可以做些什么来避免在操作栏中显示向上按钮吗?

共有3个答案

南宫俊喆
2023-03-14

使用此选项,而不是使用导航控制器设置:

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

或Kotlin中的等效值。

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

岳景明
2023-03-14

我也遇到了同样的问题,我找到了一种使用导航控制器获取当前片段的方法。addOnNavigatedListener,所以我在我的活动中应用了以下逻辑,目前它对我有效

java prettyprint-override">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
}

这是我的项目。。。

我不知道如果这是最好的选择但如果有人有任何更好的建议这将是受欢迎的

蒋健
2023-03-14

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

AppBarConfiguration有一个生成器构造函数,因此您可以使用一组特定的顶级目标创建一个新的生成器,这些目标由其id引用(该id是您在导航布局上设置的)。

创建新的AppBarConfiguration

val appBarConfiguration = AppBarConfiguration
            .Builder(
                    R.id.navigationHomeFragment,
                    R.id.navigationListFragment,
                    R.id.navigationProfileFragment)
            .build()

然后,您需要调用setupActionBarWitNavController(this, navController)而不是setupActionBarWitNavController(this, navController, appBarConfiguration)

这是处理顶级导航行为的正确方法。

 类似资料:
  • 找不到任何正式样品。 新底栏怎么用?不想做任何定制。

  • 请帮帮我,我已经绕了几个小时了!我设置了一个抽屉菜单和一个工具栏(见下面的代码),我无法让返回/回家功能工作,因为单击它会导致打开抽屉。 这是我的主要活动,在OnCreate期间调用。 以下是我片段的OnCreateView方法中的内容。。。 抽屉菜单工作正常。更改工具栏的标题工作正常。汉堡包图标在片段中更改为向后箭头就好了...然而,每次我按下向后箭头,它都会打开抽屉...有点像抽屉的听众在向后

  • 我有2个屏幕,它们都有自己的和。当我使用 Jetpack Navigation Compose 库在它们之间导航时,应用栏会闪烁。为什么会发生这种情况,我该如何摆脱这种情况? 法典: 导航: Todo列表屏幕<代码>脚手架<代码>带有<代码>TopAppBar<代码>: 使用 添加/编辑屏幕:

  • 我正在开发一个android项目,我正在尝试使用来自http://developer.android.com/training/implementing-navigation/nav-drawer.html.的示例集成新的导航抽屉 它主要工作除了一件事,动作栏向上按钮不显示菜单,但如果我用手指从边缘滑动主活动屏幕,菜单就会出现,所以我知道实际菜单没有问题,它只是动作栏按钮。 下面是代码 感谢您提供

  • 使用数据查看器的“导航栏”按钮,可以快捷方便地浏览文档或页。 按钮 描述 添加文档 - 输入一个新的文档。在使用数据查看器的任何时候,点击此按钮来得到一个空白的文档。 删除文档 - 删除一个现有的文档。 应用更改 - 应用已做的更改。 放弃更改 - 移除当前记录的全部编辑。 刷新 - 刷新数据。 停止 - 当从服务器加载大量数据时,停止加载。 第一页 - 移动到第一页。 上一页 - 移动到上一页。

  • 使用数据查看器的“导航栏”按钮,可以快捷方便地浏览记录或页。 按钮 描述 添加记录 - 输入一条新的记录。在使用数据查看器的任何时候,点击此按钮来得到一条空白的记录。 删除记录 - 删除一条现有的记录。 应用更改 - 应用已做的更改。 放弃更改 - 移除当前记录的全部编辑。 刷新 - 刷新数据。 停止 - 当从服务器加载大量数据时,停止加载。 第一页 - 移动到第一页。 上一页 - 移动到上一页。