Android 导航组件,控制何时显示汉堡或后退图标

Android 导航组件,控制何时显示汉堡或后退图标,android,kotlin,navigation-drawer,android-jetpack,android-architecture-navigation,Android,Kotlin,Navigation Drawer,Android Jetpack,Android Architecture Navigation,我有以下活动 class MainActivity : AppCompatActivity() { private lateinit var drawerLayout: androidx.drawerlayout.widget.DrawerLayout override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.m

我有以下活动

class MainActivity : AppCompatActivity() {

private lateinit var drawerLayout: androidx.drawerlayout.widget.DrawerLayout

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

    drawerLayout = drawer_layout

    val navController = Navigation.findNavController(this, R.id.fragment_main_navHost)

    setSupportActionBar(toolbar)

    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
    navView_main.setupWithNavController(navController)
}

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(drawerLayout,
        Navigation.findNavController(this, R.id.fragment_main_navHost))
}

override fun onBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START)
    } else {
        super.onBackPressed()
    }
}
正如你们所看到的,它与导航图相关联,我使用的是一个导航抽屉。当我浏览抽屉中的物品时,我希望保留汉堡包图标,并且仅当我点击片段或弹出窗口中的物品时,才将其更改为向上/后退按钮,例如,并确保系统的行为根据显示的图标反映用户的期望。是否可能

按照以下步骤操作

1.绑定您的

2.Bind

3.Bind

4.覆盖活动中的
onSupportNavigateUp()

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(drawer_layout, hostFragment.navController) 
              || super.onSupportNavigateUp()
}
示例:

class NavActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    lateinit var hostFragment: NavHostFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_nav)
        setSupportActionBar(toolbar)

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }

        val toggle = ActionBarDrawerToggle(
                this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()

        nav_view.setNavigationItemSelectedListener(this)

        hostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment    
        NavigationUI.setupWithNavController(nav_view, hostFragment.navController)    
        NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController)    
        NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController, drawer_layout)    
    }

    override fun onBackPressed() {
        if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
            drawer_layout.closeDrawer(GravityCompat.START)
        } else {
            super.onBackPressed()
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(drawer_layout, hostFragment.navController) || super.onSupportNavigateUp()
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.nav, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        when (item.itemId) {
            R.id.action_settings -> return true
            else -> return super.onOptionsItemSelected(item)
        }
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        // Handle navigation view item clicks here.
        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }
}

输出 主片段:

片段二:

片段树:

因此,我认为您可以使用NavController.OnNavigatedListener来监听将显示的片段,然后更新de工具栏图标

val navController = Navigation.findNavController(this, R.id.fragment_main_navHost)
navController.addOnNavigatedListener(contoller, destination -> {
   if(destination.id == R.id.fragmentTwo){
          // change the toolbar icon here
}
    })
对不起,我这里没有电脑,所以我写的代码没有任何IDE,这可能有错误。但是,接受这个想法


希望这对您有所帮助。

要控制AppBar向上/向后导航时显示以下需要执行的操作

1-创建AppBarConfiguration并向其传递顶级目标和抽屉布局

    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.dest_one,
            R.id.dest_two
        ),
        drawerLayout
    )
2-告诉AppBar有关配置和导航的信息。这将有助于显示标题和向上箭头或抽屉菜单图标

setupActionBarWithNavController(navController, appBarConfig)
3-最后覆盖OnOptions ItemSelected和onSupportNavigateUp以及导航组件扩展,以通知AppBar如何操作

    override fun onOptionsItemSelected(item: MenuItem)= item.onNavDestinationSelected(findNavController(R.id.my_nav_host_fragment))
        || super.onOptionsItemSelected(item)


override fun onSupportNavigateUp() = findNavController(R.id.my_nav_host_fragment).navigateUp(appBarConfiguration)

参考谷歌代码实验室导航

谢谢您的尝试,但您提供的步骤不是必需的,并且产生了相同的结果。使用导航抽屉导航时,我应该能够控制要显示的图标。原则上,导航抽屉应该具有横向导航,这意味着项目处于同一级别。因此,当我使用抽屉从一个项目移动到另一个项目时,片段应该被替换,而不是添加到堆栈顶部。请看。最后一件事,您只需要执行第三步和第四步,如果您想让arch组件控制备份和备份行为,当我单击后退箭头时,它将显示导航抽屉,而不是返回到上一个片段。@AVEbrahimi haveu
覆盖
支持导航
方法类似于我上面的代码当我单击后退箭头时,它会显示导航抽屉,而不是返回到上一个片段有什么解决办法吗?我不是在寻找解决办法。虽然你的答案可能是一个解决办法,但我希望能找到一个自动化这个过程的解决办法。这将需要跟踪片段以了解要执行的操作。这样,我将失去导航拱门组件的好处。我尝试了这段代码并定义了所有顶级目的地,但当我从顶级目的地移动到另一个目的地时,会显示“返回”按钮,单击工具栏的“返回”按钮时,抽屉将再次打开。我怎样才能解决这个问题请你分享代码片段或其他东西看看你在做什么你能在github上分享它并提供一个指向它的链接吗?实际上我可以提出另一个问题并分享链接。可以吗?
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.dest_one,
            R.id.dest_two
        ),
        drawerLayout
    )
setupActionBarWithNavController(navController, appBarConfig)
    override fun onOptionsItemSelected(item: MenuItem)= item.onNavDestinationSelected(findNavController(R.id.my_nav_host_fragment))
        || super.onOptionsItemSelected(item)


override fun onSupportNavigateUp() = findNavController(R.id.my_nav_host_fragment).navigateUp(appBarConfiguration)