web-dev-qa-db-fra.com

Composant de navigation, contrôle quand afficher l'icône hamburger ou arrière

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 

8
Mustafa ALMulla

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

2
Mustafa ALMulla

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
    }
}

Sortie

Fragment de maison:

Home Fragment

Fragment deux:

Fragment Two

Fragment Tree:

Fragment Tree

4
Nilesh Rathod

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.

0
Pedro Massango