【问题标题】:How to configure the Drawer Navigation button when not using the start as the top-level navigation?不使用开始作为顶级导航时如何配置抽屉导航按钮?
【发布时间】:2020-11-27 19:13:13
【问题描述】:

我正在使用导航图进行导航,并有一个开始屏幕(启动片段)作为显示的第一个片段。问题是当我转到主片段/屏幕时,顶部导航按钮会显示回来,而不是抽屉图标。 我们怎样才能控制它?有哪些选择。如何更改起始目的地? (如果可能)

当用户位于顶级目的地时,导航按钮 如果目的地使用 DrawerLayout,则变为抽屉图标。如果 目的地不使用 DrawerLayout,导航按钮是 隐。当用户在任何其他目的地时,导航 按钮显示为向上按钮。 配置导航按钮 仅使用起始目的地作为顶级目的地,创建 一个 AppBarConfiguration 对象,并传入对应的 导航图,如下图:

示例代码

我的问题是导航到 next_fragment 时后退按钮仍然存在。它应该显示菜单/汉堡包图标。

class MainActivity : AppCompatActivity() {

private lateinit var drawerLayout: DrawerLayout
private lateinit var appBarConfiguration : AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)

    val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    drawerLayout = binding.drawerLayout

    val navController = this.findNavController(R.id.mainNavigationHostFragment)
    NavigationUI.setupActionBarWithNavController(this, navController)

    appBarConfiguration = AppBarConfiguration(setOf(R.id.nextFragment), drawerLayout) 
    NavigationUI.setupWithNavController(binding.mainNavigationDrawerView, navController)

    val navigationHeader = binding.mainNavigationDrawerView.getHeaderView(0)
    val iconButton = navigationHeader.findViewById<ImageButton>(R.id.main_nav_icon_button)
    

}

override fun onSupportNavigateUp(): Boolean {

    val navController = this.findNavController(R.id.mainNavigationHostFragment)
    return NavigationUI.navigateUp(navController, appBarConfiguration)
}

}

【问题讨论】:

  • 根据Principles of Navigation,您不应该使用启动画面作为您的起始目的地。 NavigationUI 假设您实际上遵循了这些原则。

标签: android navigation-drawer android-navigation


【解决方案1】:

不要将Navigation Graph 传递给AppbarConfiguration,而是传递应该显示HamBurger icon 的片段的id,这样在显示特定片段 时,它会显示 home/hamburger 图标而不是 back 图标。

那是

val appBarConfiguration = AppBarConfiguration(setOf(R.id.FAGMENT_THAT_SHOULD_SHOW_HOME_ICON), DRAWER_LAYOUT)

更新

代替

val navController = this.findNavController(R.id.mainNavigationHostFragment)

NavigationUI.setupActionBarWithNavController(this, navController) 

 appBarConfiguration = AppBarConfiguration(setOf(R.id.nextFragment), drawerLayout) 
    NavigationUI.setupWithNavController(binding.mainNavigationDrawerView, navController)

val navigationHeader = binding.mainNavigationDrawerView.getHeaderView(0)
  val iconButton = navigationHeader.findViewById<ImageButton>(R.id.main_nav_icon_button)
    

只是

val navController = this.findNavController(R.id.mainNavigationHostFragment)

appBarConfiguration = AppBarConfiguration(setOf(R.id.nextFragment), drawerLayout) 
    

NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);

【讨论】:

  • 嗨,我实际上尝试过这个,结果是该功能有效,但按钮图标仍然是一个后退箭头@Debarshi Bhattacharjee
  • 您是在使用 Drawer 还是只是想显示汉堡图标??
  • 我正在使用抽屉,您的解决方案正如我所尝试的那样有效,但图标不会从后退图标变为汉堡包图标。
  • 然后您需要将 DrawerLayout 作为第二个参数传递给 AppbarConfiguration
  • 是的,我确实在这样做。我在我的问题中添加了作为 MainActivity 一部分的示例代码。这是行吧? AppBarConfiguration(setOf(R.id.nextFragment),drawerLayout)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多