J'ai l'activité suivante
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()
}
}
qui, comme vous pouvez le voir, est associé au graphique de navigation, et j’utilise un tiroir de navigation. Lorsque je navigue dans les éléments du tiroir, je souhaite conserver l'icône représentant un hamburger et ne le changer en bouton haut/arrière que lorsque je clique sur un élément du fragment ou du menu contextuel, par exemple, et veille à ce que le comportement du système reflète ce l'utilisateur attend en fonction de l'icône affichée. Est-ce possible
Pour contrôler le moment où la navigation dans la barre d’application AppBar indique les opérations suivantes
1- créez AppBarConfiguration et transmettez-lui la destination de niveau supérieur et tiroirLayout
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.dest_one,
R.id.dest_two
),
drawerLayout
)
2- Parlez à la barre d’application de la migration et de la navigation. cela aidera à afficher un titre et à afficher une flèche ou une icône de menu du tiroir
setupActionBarWithNavController(navController, appBarConfig)
3- Enfin, remplacez onOptionsItemSelected et onSupportNavigateUp et l'extension Navigation Component pour indiquer à l'AppBar comment se comporter.
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)
Référence Google Code Lab Navigation Navigation Codelab
Suivez ces étapes
1. Liez votre NavigationView
à NavigationUI
NavigationUI.setupWithNavController(nav_view, hostFragment.navController)
2. Lier ActionBar
Avec NavController
NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController)
3. Bind ActionBar
et DrawerLayout
Avec NavController
NavigationUI.setupActionBarWithNavController(this@NavActivity, hostFragment.navController, drawer_layout)
4. remplace onSupportNavigateUp()
dans votre activité
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(drawer_layout, hostFragment.navController)
|| super.onSupportNavigateUp()
}
Échantillon:
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
}
}
Donc, je pense que vous pouvez utiliser NavController.OnNavigatedListener pour écouter quel fragment sera affiché, puis mettre à jour l'icône de la barre d'outils.
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
}
})
Désolé, je n'ai pas d'ordinateur ici, alors j'écris ce code sans IDE, cela peut avoir une erreur. Mais prenez l'idée.
J'espère que cela vous aidera.