Advertisement
  1. Code
  2. Mobile Development
  3. Android Development

Comment coder un "Navigation Drawer" pour une application Android

Scroll to top
Read Time: 13 min

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

L'équipe de design matérielle de Google définit les fonctionnalités du "navigation drawer" sous Android comme suit :

Le "navigation drawer" se positionne à gauche et contient les destinations de navigation pour votre application.

Un exemple d'une application Android populaire qui implémente le "navigation draswer" est l'application Inbox de Google, qui utilise un "navigation draswer" pour naviguer vers différentes sections de l'application. Vous pouvez le vérifier vous-même en téléchargeant l'application Inbox depuis le Google Play Store si vous ne l'avez pas déjà sur votre appareil. La capture d'écran ci-dessous montre Inbox avec le "navigation drawer" affiché.

Google Inbox Android app Google Inbox Android app Google Inbox Android app

L'utilisateur peut voir le "navigation drawer" lorsqu'il fait glisser un doigt du bord gauche de l'activité. Ils peuvent également le trouver à partir de l'activité principale (le niveau supérieur de l'application), en appuyant sur l'icône de l'application (également connu sous le nom du menu "hamburger") dans la barre d'action.

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

Dans cet article, vous apprendrez à afficher les éléments de navigation dans le "drawer" sous Android. Nous verrons comment utiliser l'API DrawerLayout et NavigationView pour effectuer cette tâche. Pour un bonus, vous apprendrez également à utiliser les templates d'Android Studio pour amorcer rapidement votre projet avec un "navigation drawer".

Un exemple de projet (en Kotlin) pour ce tutoriel peut être trouvé sur notre repo GitHub afin que vous puissiez facilement suivre.

Prérequis

Pour pouvoir suivre ce tutoriel, vous aurez besoin de :

1. Créez un projet Android Studio

Lancez Android Studio et créez un nouveau projet (vous pouvez le nommer NavigationDrawerDemo) avec une activité vide appelée MainActivity. Assurez-vous de cocher la case Include Kotlin support.

Android Studio new project dialogAndroid Studio new project dialogAndroid Studio new project dialog

2. Ajout de DrawerLayout et NavigationView

Pour commencer à utiliser DrawerLayout et NavigationView dans votre projet, vous devez importer le support de design et également l'artefact de support Android. Ajoutez-les à votre fichier de module build.gradle pour les importer.

1
dependencies {
2
    implementation 'com.android.support:design:27.0.2'
3
    implementation 'com.android.support:support-v4:27.0.2'
4
}

En outre, incluez à la fois le widget DrawerLayout et le widget NavigationView dans votre fichier res/layout/activlty_main.xml.

1
<?xml version="1.0" encoding="utf-8"?>
2
<android.support.v4.widget.DrawerLayout
3
        xmlns:android="https://schemas.android.com/apk/res/android"
4
        xmlns:app="http://schemas.android.com/apk/res-auto"
5
        xmlns:tools="http://schemas.android.com/tools"
6
        android:id="@+id/drawer_layout"
7
        android:layout_width="match_parent"
8
        android:layout_height="match_parent"
9
        tools:openDrawer="start">
10
11
    <include
12
            layout="@layout/app_bar_main"
13
            android:layout_width="match_parent"
14
            android:layout_height="match_parent" />
15
16
    <android.support.design.widget.NavigationView
17
            android:id="@+id/nav_view"
18
            android:layout_width="wrap_content"
19
            android:layout_height="match_parent"
20
            android:layout_gravity="start"
21
            app:headerLayout="@layout/nav_header_main"
22
            app:menu="@menu/activity_main_drawer" />
23
24
</android.support.v4.widget.DrawerLayout>

Ici, nous avons créé un widget DrawerLayout avec l'ID drawer_layout. La propriété tools:openDrawer est utilisée pour afficher le "navigation drawer" lorsque la disposition XML est ouverte dans la vue de 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 fenêtre, ce qui permet d'extraire des vues de «drawer» interactives d'un ou des deux bords verticaux de la fenêtre.

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

Voici mon fichier de ressources app_bar_main.xml. Ce fichier contient simplement un CoordinatorLayout, un AppBarLayout et un widget Toolbar.

1
<?xml version="1.0" encoding="utf-8"?>
2
<android.support.design.widget.CoordinatorLayout
3
        xmlns:android="http://schemas.android.com/apk/res/android"
4
        xmlns:app="http://schemas.android.com/apk/res-auto"
5
        xmlns:tools="http://schemas.android.com/tools"
6
        android:layout_width="match_parent"
7
        android:layout_height="match_parent"
8
        tools:context=".MainActivity">
9
10
    <android.support.design.widget.AppBarLayout
11
            android:layout_width="match_parent"
12
            android:layout_height="wrap_content"
13
            android:fitsSystemWindows="true"
14
            android:theme="@style/AppTheme.AppBarOverlay">
15
16
        <android.support.v7.widget.Toolbar
17
                android:id="@+id/toolbar_main"
18
                android:layout_width="match_parent"
19
                android:layout_height="?attr/actionBarSize"
20
                android:background="?attr/colorPrimary"
21
                app:layout_scrollFlags="scroll|enterAlways"
22
                app:popupTheme="@style/AppTheme.PopupOverlay" />
23
24
    </android.support.design.widget.AppBarLayout>
25
</android.support.design.widget.CoordinatorLayout>

Finalement, nous avons créé un widget NavigationView. 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 rempli par un fichier de ressources de menu.

Dans le widget XML NavigationView, vous pouvez voir que nous avons ajouté un attribut android:layout_gravity avec la valeur start. Ceci est utilisé pour positionner le drawer -vous voulez que le drawer sorte de gauche ou de droite- (le début ou la fin sur les versions de plateforme qui prennent en charge le sens de disposition). Dans notre cas, le drawer sortira de la gauche.

Nous avons également inclus un attribut app:headerLayout qui pointe vers @layout/nav_header_main. Cela ajoutera un View en tant qu'en-tête du menu de navigation.

Voici mon fichier de ressources de layout nav_header_main.xml:

1
<?xml version="1.0" encoding="utf-8"?>
2
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
              android:id="@+id/nav_header"
4
              android:layout_width="match_parent"
5
              android:layout_height="160dp"
6
              android:background="@color/colorAccent"
7
              android:clickable="true"
8
              android:focusable="true"
9
              android:foreground="?attr/selectableItemBackgroundBorderless"
10
              android:gravity="bottom"
11
              android:orientation="vertical"
12
              android:padding="16dp"
13
              android:theme="@style/ThemeOverlay.AppCompat.Dark">
14
15
    <ImageView
16
            android:id="@+id/nav_header_imageView"
17
            android:layout_width="64dp"
18
            android:layout_height="64dp"
19
            android:src="@mipmap/ic_launcher" />
20
21
    <TextView
22
            android:id="@+id/nav_header_textView"
23
            android:layout_width="match_parent"
24
            android:layout_height="wrap_content"
25
            android:paddingTop="16dp"
26
            android:text="Chike Mgbemena"
27
            android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
28
</LinearLayout>

Le fichier de layout a simplement un LinearLayout, un ImageView et un TextView.

Android Studio layout previewAndroid Studio layout previewAndroid Studio layout preview

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

1
<android.support.design.widget.NavigationView
2
        app:menu="@menu/activity_main_drawer" />

Voici le fichier de ressource du menu  res/menu/activity_main_drawer.xml:

1
<?xml version="1.0" encoding="utf-8"?>
2
<menu xmlns:android="http://schemas.android.com/apk/res/android">
3
    <group>
4
        <item android:id="@+id/nav_item_one"
5
              android:icon="@drawable/ic_drafts_black_24dp"
6
              android:title="Item 1" />
7
        <item android:id="@+id/nav_item_two"
8
              android:icon="@drawable/ic_drafts_black_24dp"
9
              android:title="Item 2" />
10
        <item android:id="@+id/nav_item_three"
11
              android:icon="@drawable/ic_drafts_black_24dp"
12
              android:title="Item 3" />
13
    </group>
14
15
    <group android:id="@+id/group_menu">
16
        <item android:id="@+id/nav_item_four"
17
              android:title="Item 4" />
18
        <item android:id="@+id/nav_item_five"
19
              android:title="Item 5" />
20
    </group>
21
22
    <item android:title="Title 1">
23
        <menu>
24
            <item android:id="@+id/nav_item_six"
25
                  android:icon="@drawable/ic_drafts_black_24dp"
26
                  android:title="Item 6" />
27
            <item android:id="@+id/nav_item_seven"
28
                  android:icon="@drawable/ic_drafts_black_24dp"
29
                  android:title="Item 7" />
30
        </menu>
31
    </item>
32
</menu>

Ici, nous avons défini un Menu en utilisant le <menu> qui sert de conteneur pour les éléments de menu. Un <item> crée un MenuItem, qui représente un seul élément dans un menu.

Nous avons ensuite défini notre premier groupe de menus en utilisant le <group> qui sert de conteneur invisible pour les éléments d'<item>—menu items dans notre cas. Chacun des éléments <item> a un identifiant, une icône et un titre. Notez qu'une ligne horizontale sera dessinée pour nous à la fin de chaque <group> quand elle est affichée dans le navigation drawer.

Un <item> peut aussi contenir un élément <menu> imbriqué dans le but de créer un sous-menu; nous avons fait ça dans notre dernier <item>. Notez que ce dernier <item> a une propriété "titre".

Notez que lorsque vous affichez les éléments de la liste de navigation à partir d'une ressource de menu, nous pouvons utiliser un ListView à la place. Mais en configurant le "navigation drawer" avec une ressource de menu, nous obtenons le style de conception de matériel sur le "navigation drawer" gratuitement ! Si vous avez utilisé ListView, vous devez gérer la liste et la styliser pour respecter les spécifications de conception recommandées pour le "navigation drawer".

3. Initialisation des composants

Ensuite, nous allons initialiser les instances de nos DrawerLayout et ActionBarDrawerToggle. L'initialisation se fera dans onCreate() dans MainActivity.kt.

1
import android.content.res.Configuration
2
import android.os.Bundle
3
import android.support.v4.widget.DrawerLayout
4
import android.support.v7.app.ActionBarDrawerToggle
5
import android.support.v7.app.AppCompatActivity
6
import android.support.v7.widget.Toolbar
7
import android.view.MenuItem
8
9
class MainActivity : AppCompatActivity() {
10
11
    private lateinit var drawer: DrawerLayout
12
    private lateinit var toggle: ActionBarDrawerToggle
13
14
    override fun onCreate(savedInstanceState: Bundle?) {
15
        super.onCreate(savedInstanceState)
16
        setContentView(R.layout.activity_main)
17
18
        val toolbar: Toolbar = findViewById(R.id.toolbar_main)
19
        setSupportActionBar(toolbar)
20
21
        drawer = findViewById(R.id.drawer_layout)
22
23
        toggle = ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
24
        drawer.addDrawerListener(toggle)
25
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
26
        supportActionBar?.setHomeButtonEnabled(true)
27
    }
28
29
    // ... 

30
}

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

  • un contexte parent. Par exemple, dans une Activity vous utilisez this, alors que dans un Fragment vous appelez getActivity()
  • une instance du widget DrawerLayout à lier à ActionBar de l'activité
  • l'icône à placer au-dessus de 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 appelé la méthode addDrawerListener() sur un DrawerLayout afin de connecter un ActionBarDrawerToggle à un DrawerLayout.

Notez que nous activons également l'icône de l'application via setHomeButtonEnabled() et l'activons pour la navigation «up» via setDisplayHomeAsUpEnabled().

Nous transmettons ensuite les méthodes de rappel d'activité onPostCreate(), onConfigurationChanged() et onOptionsItemSelected() au toggle :

1
class MainActivity : AppCompatActivity() {
2
3
    // ... 

4
5
    override fun onPostCreate(savedInstanceState: Bundle?) {
6
        super.onPostCreate(savedInstanceState)
7
        toggle.syncState()
8
    }
9
10
    override fun onConfigurationChanged(newConfig: Configuration?) {
11
        super.onConfigurationChanged(newConfig)
12
        toggle.onConfigurationChanged(newConfig)
13
    }
14
15
    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
16
        if (toggle.onOptionsItemSelected(item)) {
17
            return true
18
        }
19
        return super.onOptionsItemSelected(item)
20
    }
21
}

Voici ce que fait syncState(), selon la documentation officielle:

Synchronise l'état de l'indicateur / affordance du drawer avec le DrawerLayout lié... Il doit être appelé depuis la méthode onPostCreate de votre Activity pour se synchroniser après la restauration de l'état d'instance DrawerLayout et à tout autre moment où l'état peut avoir divergé sans que l'ActionBarDrawerToggle ne soit notifié. (Par exemple, si vous arrêtez de transférer les événements  appropriés du drawer pendant un certain temps.)

4. Test de l'application

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

First app demo First app demo First app demo

Comme vous pouvez le voir, le lancement de l'application affichera l'icône du ''navigation drawer'' «hamburger» dans la barre d'action. Essayez d'appuyer sur cette icône de l'application pour ouvrir le drawer. En outre, cliquer sur les éléments du "navigation drawer" ne fera rien; nous allons gérer cette partie dans la section suivante.

5. Gestion des Click Events

Voyons maintenant comment gérer les événements de clic pour chacun des éléments du "navigation drawer". Notez que cliquer sur un élément est censé vous mener à une nouvelle activité ou un nouveau fragment, c'est pourquoi on appelle ça un "navigation drawer" !

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

1
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
2
    // ... 

3
}

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

1
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
2
    
3
    // ... 

4
5
    override fun onNavigationItemSelected(item: MenuItem): Boolean {
6
7
        when (item.itemId) {
8
            R.id.nav_item_one -> Toast.makeText(this, "Clicked item one", Toast.LENGTH_SHORT).show()
9
            R.id.nav_item_two -> Toast.makeText(this, "Clicked item two", Toast.LENGTH_SHORT).show()
10
            R.id.nav_item_three -> Toast.makeText(this, "Clicked item three", Toast.LENGTH_SHORT).show()
11
            R.id.nav_item_four -> Toast.makeText(this, "Clicked item four", Toast.LENGTH_SHORT).show()
12
        }
13
        return true
14
    }
15
}

Cette méthode est invoquée lorsqu'un élément du menu de navigation est sélectionné. Nous avons utilisé l'expression when pour effectuer différentes actions en fonction de l'élément de menu sur lequel on a cliqué : les ID de l'élément de menu servent de constantes pour l'expression when.

Après, nous devons initialiser notre NavigationView et mettre ce listener dans onCreate() de notre activité.

1
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
2
    // ...

3
    override fun onCreate(savedInstanceState: Bundle?) {
4
        // ... 

5
        val navigationView: NavigationView = findViewById(R.id.nav_view)
6
        navigationView.setNavigationItemSelectedListener(this)
7
        // ... 

8
    }
9
// ... 

Exécutez le projet à nouveau !

App demo with navigation item clicks configurationApp demo with navigation item clicks configurationApp demo with navigation item clicks configuration

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

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

1
override fun onNavigationItemSelected(item: MenuItem): Boolean {
2
3
    when (item.itemId) {
4
        R.id.nav_item_one -> Toast.makeText(this, "Clicked item one", Toast.LENGTH_SHORT).show()
5
        R.id.nav_item_two -> Toast.makeText(this, "Clicked item two", Toast.LENGTH_SHORT).show()
6
        R.id.nav_item_three -> Toast.makeText(this, "Clicked item three", Toast.LENGTH_SHORT).show()
7
        R.id.nav_item_four -> Toast.makeText(this, "Clicked item four", Toast.LENGTH_SHORT).show()
8
    }
9
    drawer.closeDrawer(GravityCompat.START)
10
    return true
11
}

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

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

6. Manipulation du bouton "arrière" enfoncé

Lorsque le drawer est ouvert, il serait préférable pour une meilleure expérience utilisateur de ne pas fermer l'activité principale si le bouton Back est cliqué. C'est ainsi que fonctionnent les applications populaires comme l'application Inbox de Google.

Ainsi, lorsque le drawer est ouvert et que vous appuyez sur le bouton Back, fermez uniquement le drawer au lieu de l'activité d'origine. Ensuite, si l'utilisateur appuie à nouveau sur le bouton Back, l'activité principale doit être fermée.

Voici comment nous pouvons y parvenir :

1
override fun onBackPressed() {
2
    if (drawer.isDrawerOpen(GravityCompat.START)) {
3
        drawer.closeDrawer(GravityCompat.START)
4
    } else {
5
        super.onBackPressed()
6
    }
7
}

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

7. Bonus: Utiliser les templates d'Android Studio

Maintenant que vous avez appris les API impliquées pour créer un "navigation drawer", je vais vous montrer un raccourci qui le rendra plus rapide la prochaine fois. Vous pouvez simplement utiliser un template au lieu de coder une activité de "navigation drawer" à partir de zéro.

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

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

Pour un nouveau projet, lancez Android Studio.

Create Android Project dialogCreate Android Project dialogCreate Android Project dialog

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

Vous pouvez laisser les valeurs par défaut telles qu'elles sont dans la boîte de dialogue Target Android Devices. Cliquez à nouveau sur le bouton Next.

Add an Activity to Mobile dialogAdd an Activity to Mobile dialogAdd an Activity to Mobile dialog

Dans la boîte de dialogue Add an Activity to Mobile, faites défiler vers le bas et sélectionnez Navigation Drawer Activity. Cliquez ensuite sur le bouton Next.

Configure Activity dialogConfigure Activity dialogConfigure Activity dialog

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

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

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

Vous pouvez également utiliser des templates pour un projet Android Studio déjà existant. Allez simplement dans File > New > Activity >Navigation Drawer Activity.

Navigation from file menu too Navigation Drawer ActivityNavigation from file menu too Navigation Drawer ActivityNavigation from file menu too Navigation Drawer Activity

Les templates fournis avec Android Studio sont adaptés aux layouts simples et aux applications de base, mais si vous souhaitez lancer votre application encore plus loin, vous pouvez envisager certains des templates d'application disponibles sur Envato Market.

Ils représentent un énorme gain de temps pour les développeurs expérimentés, en les aidant à franchir le pas de la création d'une application à partir de zéro et à concentrer leurs talents sur les parties uniques et personnalisées de la création d'une nouvelle application.

Conclusion

Dans ce tutoriel, vous avez appris comment créer un "navigation drawer" sous Android à l'aide des API DrawerLayout et NavigationView. Nous avons également exploré comment utiliser facilement et rapidement les templates Android Studio pour en créer un.

Je recommande fortement de consulter l' official material design guidelines for navigation drawers pour en savoir plus sur la façon de concevoir et d'utiliser correctement les "navigation drawers" dans Android.

Pour en savoir plus sur le développement Android, consultez nos autres cours et tutoriels ici sur Envato Tuts+ !

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.