Comment coder un tiroir de navigation pour une application Android

Ce que vous allez créer

L’équipe de conception de matériel de Google définit les fonctionnalités d’un tiroir de navigation sous Android comme suit:

Le tiroir de navigation se glisse depuis la gauche et contient les destinations de navigation pour votre application..

L'application Inbox de Google est un exemple d'application Android populaire qui implémente le tiroir de navigation. Elle utilise un tiroir de navigation pour naviguer dans différentes sections de l'application. Vous pouvez le vérifier vous-même en téléchargeant l'application Boîte de réception à partir du Google Play Store, si vous ne l'avez pas déjà sur votre appareil. La capture d'écran ci-dessous montre Boîte de réception avec le tiroir de navigation tiré ouvert.

L'utilisateur peut visualiser le tiroir de navigation lorsqu'il fait glisser son doigt du bord gauche de l'activité. Ils peuvent également le trouver dans l'activité de la maison (niveau supérieur de l'application), en appuyant sur l'icône de l'application (également appelé menu "hamburger") dans la barre d'action.. 

Notez que si vous avez plusieurs destinations différentes (plus de six, par exemple) dans votre application, il est recommandé d'utiliser un tiroir de navigation.. 

Dans cet article, vous allez apprendre à afficher les éléments de navigation dans un tiroir de navigation sous Android. Nous verrons comment utiliser le DrawerLayout et NavigationView API pour effectuer cette tâche. En prime, vous apprendrez également à utiliser la fonctionnalité de modèles d'Android Studio pour amorcer rapidement votre projet avec un tiroir de navigation.. 

Vous trouverez un exemple de projet (en Kotlin) pour ce tutoriel sur notre dépôt GitHub afin que vous puissiez suivre facilement.

Conditions préalables

Pour pouvoir suivre ce tutoriel, vous aurez besoin de:

  • Android Studio 3.0 ou supérieur
  • Kotlin plugin 1.1.51 ou supérieur

1. Créer un projet Android Studio

Lancez Android Studio et créez un nouveau projet (vous pouvez le nommer NavigationDrawerDemo) avec une activité vide appelée Activité principale. Assurez-vous également de vérifier le Inclure le support Kotlin case à cocher. 

2. Ajouter DrawerLayout et NavigationView

Pour commencer à utiliser DrawerLayout et NavigationView dans votre projet, vous devez importer le support de conception ainsi que l'artefact de support Android. Alors ajoutez-les à votre module build.gradle fichier pour les importer. 

dépendances implémentation 'com.android.support:design:27.0.2' implémentation 'com.android.support:support-v4:27.0.2'

En outre, inclure les deux DrawerLayout widget et aussi le NavigationView widget dans votre res / layout / activlty_main.xml fichier.

    

Ici nous avons créé un DrawerLayout widget avec l'identifiant draw_layout. le outils: openDrawer Cette propriété est utilisée pour afficher le tiroir de navigation lorsque la présentation XML est ouverte dans la vue Conception d'Android Studio.. 

La documentation officielle dit ce qui suit à propos de DrawerLayout:

DrawerLayout agit comme un conteneur de niveau supérieur pour le contenu de la fenêtre, ce qui permet d'extraire des vues interactives du «tiroir» à partir de l'un ou des deux bords verticaux de la fenêtre.

Après avoir ajouté le DrawerLayout widget, nous avons inclus une mise en page enfant qui pointe vers @ layout / app_bar_main

Voici mon app_bar_main.xml fichier de ressources. Ce fichier a simplement un Coordonnateur, un AppBarLayout, et un Barre d'outils widget. 

     

Enfin, nous avons créé un NavigationView widget. La documentation officielle dit ce qui suit à propos de NavigationView:

NavigationView représente un menu de navigation standard pour l'application. Le contenu du menu peut être renseigné par un fichier de ressources de menu..

dans le NavigationView Widget XML, vous pouvez voir que nous avons ajouté un Android: layout_gravity attribut avec valeur début. Ceci est utilisé pour positionner le tiroir. Vous souhaitez que le tiroir sorte de gauche ou de droite (le début ou la fin sur les versions de plate-forme prenant en charge le sens de la présentation). Dans notre cas, le tiroir va sortir par la gauche. 

Nous avons également inclus un app: headerLayout attribut qui pointe vers @ layout / nav_header_main. Cela va ajouter un Vue comme en-tête du menu de navigation.

Voici mon nav_header_main.xml fichier de ressources de mise en page:

    

Ce fichier de mise en page a simplement un LinearLayout, un ImageView, et un Affichage

Pour inclure les éléments de menu du tiroir de navigation, nous pouvons utiliser l'attribut app: menu avec une valeur qui pointe vers un fichier de ressources de menu. 

 

Voici la res / menu / activity_main_drawer.xml fichier de ressources de menu:

                 

Ici nous avons défini un Menu en utilisant le

qui sert de conteneur pour les éléments de menu. Un crée un Élément du menu, qui représente un seul élément dans un menu.

Nous avons ensuite défini notre premier groupe de menus en utilisant le . UNE sert de conteneur invisible pour éléments éléments de menu dans notre cas. Chacun de  elements a un identifiant, une icône et un titre. Notez qu’une ligne horizontale sera tracée à la fin de chaque pour nous quand montré dans le tiroir de navigation. 

UNE peut également contenir un imbriqué 

 élément afin de créer un sous-menu, nous venons de le faire dans notre dernier . Notez que ce dernier a une propriété de titre. 

Notez que lors de l'affichage des éléments de la liste de navigation à partir d'une ressource de menu, nous pourrions utiliser un ListView au lieu. Mais, en configurant le tiroir de navigation avec une ressource de menu, nous obtenons gratuitement le style de conception des matériaux sur le tiroir de navigation! Si vous avez utilisé un ListView, vous devez tenir à jour la liste et l'assortir aux spécifications de conception recommandées pour le tiroir de navigation. 

3. Initialisation des composants

Ensuite, nous allons initialiser des instances de notre DrawerLayout et ActionBarDrawerToggle. L'initialisation va se passer à l'intérieur onCreate () dans MainActivity.kt.

import android.content.res.Configuration import android.os.Bundle import android.support.v4.widget.DrawerLayout import android.support.v7.app.ActionBarDrawerToggle import android.support.v7.app.App.App.AppCompatActivity import android.support.v7 .widget.Toolbar import android.view.MenuItem classe MainActivity: AppCompatActivity () private tardive var tiroir: DrawerLayout privée lateinit var basculée: ActionBarDrawerToggle remplacer fun onCreate (savedInstanceState: Bundle?) (superInonial). .activity_main) val toolbar: Barre d'outils = findViewById (R.id.toolbar_main) setSupportActionBar (barre d'outils) tiroir = findViewById (R.id.drawer_layout) toggle = ActionBarDrawerToggle (this, tiroir, barre d'outils, R.string.navigation_drawen_open,. navigation_drawer_close) tiroir.addDrawerListener (bascule) supportActionBar? .setDisplayHomeAsUpEnabled (true) supportActionBar? .setHomeButtonEnabled (true) //…

le ActionBarDrawerToggle configure l’icône de l’application située à gauche de la barre d’action ou de la barre d’outils pour ouvrir et fermer le tiroir de navigation. Pour pouvoir créer une instance de ActionBarDrawerToggle, nous devons fournir les paramètres suivants: 

  • un contexte parent, par exemple, dans un Activité tu utilises ce, alors que dans un Fragment tu appelles getActivity ()
  • un exemple de DrawerLayout widget pour lier à l'activité de Barre d'action
  • l'icône à placer sur l'icône de l'application pour indiquer qu'il y a une bascule
  • les ressources de chaîne pour les opérations d'ouverture et de fermeture, respectivement (pour l'accessibilité)

Nous avons invoqué la méthode addDrawerListener () sur un DrawerLayout afin de connecter un ActionBarDrawerToggle avec un DrawerLayout

Notez que nous activons également l'icône de l'application via setHomeButtonEnabled () et l'activer pour une navigation "up" via setDisplayHomeAsUpEnabled ()

Nous transmettons ensuite le onPostCreate (), onConfigurationChanged (), et onOptionsItemSelected () méthodes de rappel d'activité sur la bascule:

class MainActivity: AppCompatActivity () // ... remplacez fun onPostCreate (savedInstanceState: Bundle?) super.onPostCreate (saveInstanceState) toggle.syncState () onConfigurationChanged (newConfig) redéfinit fun onOptionsItemSelected (item: MenuItem?): Boolean if (toggle.onOptionsItemSelected (item)) return true retour super.onOptionsItemSelected (item)

Voici ce que le syncState () selon la documentation officielle: 

Synchronise l’état de l’indicateur / de l’abondance du tiroir avec l’attribut DrawerLayout lié… Ceci doit être appelé depuis votre Activitéde onPostCreate méthode de synchronisation après la restauration de l'état d'instance de DrawerLayout et à tout autre moment où l'état aurait pu diverger de telle sorte que ActionBarDrawerToggle n'a pas été notifié. (Par exemple, si vous arrêtez de transférer les événements de tiroir appropriés pendant un certain temps.)

4. Test de l'application

À ce stade, nous pouvons exécuter l'application!

Comme vous pouvez le constater, le lancement de l'application affiche l'icône du tiroir de navigation «hamburger» dans la barre d'action. Essayez de toucher cette icône d'application pour ouvrir le tiroir. De plus, cliquer sur les éléments du tiroir de navigation ne fera rien. Nous allons traiter cette partie dans la section suivante.. 

5. Gestion des événements liés aux clics

Voyons maintenant comment gérer les événements de clic pour chacun des éléments du tiroir de navigation. Notez que cliquer sur n'importe quel élément est censé vous amener à une nouvelle activité ou fragment, c'est pourquoi cela s'appelle un tiroir de navigation.!

Tout d’abord, votre activité doit implémenter la NavigationView.OnNavigationItemSelectedListener

Classe MainActivity: AppCompatActivity (), NavigationView.OnNavigationItemSelectedListener //…

En implémentant ce contrat ou cette interface, nous devons maintenant remplacer la seule méthode: onNavigationItemSelected ()

Classe MainActivity: AppCompatActivity (), NavigationView.OnNavigationItemSelectedListener //… remplace fun surNavigationItemSelected (item: MenuItem): Boolean when (item.itemId) R.id.nav_item_one -> Toast.makeText (this, " , Toast.LENGTH_SHORT) .show () R.id.nav_item_two -> Toast.makeText (this, "Article cliqué deux", Toast.LENGTH_SHORT) .show () R.id.nav_item_three -> Toast.makeText (this, " L'élément cliqué trois ", Toast.LENGTH_SHORT) .show () R.id.nav_item_four -> Toast.makeText (this," L'élément cliqué quatre ", Toast.LENGTH_SHORT) .show () return true

Cette méthode est appelée lorsqu'un élément du menu de navigation est sélectionné. Nous avons utilisé le quand expression pour effectuer différentes actions en fonction de l'élément de menu sur lequel l'utilisateur a cliqué; les identificateurs d'élément de menu servent de constantes pour l'élément quand expression. 

Ensuite, nous devons initialiser notre NavigationView et mettre cet auditeur à l'intérieur onCreate () de notre activité. 

class MainActivity: AppCompatActivity (), NavigationView.OnNavigationItemSelectedListener //… remplace l'amusement onCreate (savedInstanceState: Bundle?) //… val navigationView: NavigationView = findViewById (R.id.nav_view) navigationView.setNavigationItemSel Mentions légales) //… 

Exécutez le projet à nouveau!

Lorsque vous cliquez sur certains éléments, un message de pain grillé s'affiche - exactement ce à quoi nous nous attendions. Mais rappelez-vous que cliquer sur un élément devrait amener l'utilisateur à une nouvelle activité ou fragment (nous l'ignorons ici par souci de brièveté). 

Vous remarquerez que lorsque vous cliquez sur un élément, le tiroir reste toujours. Il serait préférable qu’il ferme automatiquement à chaque fois qu’un élément est cliqué. Voyons comment faire ça. 

Remplacez l'amusement onNavigationItemSelected (item: MenuItem): Boolean when (item.itemId) R.id.nav_item_one -> Toast.makeText (this, "Le premier élément choisi", Toast.LENGTH_SHORT).> -> Toast.makeText (this, "élément cliqué deux", Toast.LENGTH_SHORT) .show () R.id.nav_item_three -> Toast.makeText (cet élément "Clicked élément trois", Toast.LENGTH_SHORT).. .id.nav_item_four -> Toast.makeText (this, "Le quatrième élément sélectionné", Toast.LENGTH_SHORT) .show () tray.closeDrawer (GravityCompat.START) return true

Pour fermer le tiroir après avoir cliqué sur un lien, appelez simplement closeDrawer () sur une instance de DrawerLayout et passe GravityCompat.START à la méthode. 

Exécuter le projet une fois de plus et voir le résultat! 

6. Manipulation du bouton Retour sur lequel vous appuyez

Lorsque le tiroir est ouvert, il serait plus agréable pour l'utilisateur de ne pas fermer l'activité à domicile si le Retour bouton est enfoncé. C’est ainsi que fonctionnent les applications populaires telles que les applications de la boîte de réception de Google.. 

Ainsi, lorsque le tiroir est ouvert et que le Retour Lorsque vous appuyez sur le bouton, fermez uniquement le tiroir au lieu de l’activité à la maison actuelle. Ensuite, si l'utilisateur appuie sur la touche Retour bouton à nouveau, l'activité à la maison doit être fermée. 

Voici comment nous pouvons y parvenir: 

remplacez fun onBackPressed () if (tiroir.isDrawerOpen (GravityCompat.START)) tiroir.closeDrawer (GravityCompat.START) autre super.onBackPressed ()

Exécutez à nouveau le projet et testez-le.! 

7. Bonus: utilisation des modèles Android Studio

Maintenant que vous connaissez les API nécessaires à la création d'un tiroir de navigation, je vais vous montrer un raccourci qui accélérera la prochaine fois. Vous pouvez simplement utiliser un modèle au lieu de coder un tiroir de navigation. 

Android Studio fournit des modèles de code conformes aux meilleures pratiques de conception et de développement d'Android. Ces modèles de code existants (disponibles en Java et Kotlin) peuvent vous aider à démarrer rapidement votre projet. Un tel modèle peut être utilisé pour créer une activité de tiroir de navigation.. 

Je vais vous montrer comment utiliser cette fonctionnalité pratique dans Android Studio.. 

Pour un nouveau projet, lancez Android Studio. 

Entrez le nom de l'application et cliquez sur le bouton Suivant bouton. 

Vous pouvez laisser les valeurs par défaut telles qu’elles sont dans Périphériques Android cibles dialogue. Clique le Suivant bouton à nouveau. 

dans le Ajouter une activité sur mobile dialogue, faites défiler et sélectionnez Activité du tiroir de navigation. Clique le Suivant bouton après ça. 

Dans la dernière boîte de dialogue, vous pouvez renommer le nom de l'activité, le nom de la mise en page ou le titre si vous le souhaitez. Enfin, cliquez sur le terminer bouton pour accepter toutes les configurations. 

Android Studio nous a maintenant aidés à créer un projet avec une activité de tiroir de navigation. Vraiment cool!

Il est fortement conseillé d'explorer le code généré. 

Vous pouvez également utiliser des modèles pour un projet Android Studio déjà existant. Il suffit d'aller à Fichier> Nouveau> Activité> Activité du tiroir de navigation.  

Les modèles fournis avec Android Studio conviennent à la mise en page simple et à la création d'applications de base, mais si vous souhaitez donner un coup de pouce supplémentaire à votre application, vous pouvez envisager certains modèles disponibles sur Envato Market.. 

Ils permettent aux développeurs expérimentés de gagner beaucoup de temps en les aidant à réduire le coût de la création d'application à partir de zéro et en concentrant leurs talents sur les éléments uniques et personnalisés de la création d'une nouvelle application..

Conclusion

Dans ce didacticiel, vous avez appris à créer un tiroir de navigation sous Android à l'aide du logiciel DrawerLayout et NavigationView API à partir de zéro. Nous avons également exploré comment utiliser facilement et rapidement les modèles Android Studio pour créer un tiroir de navigation.. 

Je recommande vivement de consulter les directives officielles de conception des supports de navigation pour savoir comment concevoir et utiliser correctement les tiroirs de navigation sous Android..   

Pour en savoir plus sur le codage pour Android, consultez certains de nos autres cours et tutoriels ici sur Envato Tuts.+!