I. Séparer l'ActionBar en deux

Si vous possédez plusieurs actions importantes dans votre application, vous pouvez séparer votre barre d'action en deux :

  • la première ActionBar contiendra l'icône de votre application, le titre et la navigation de votre application (Dropdown menu) ;
  • la deuxième ActionBar contiendra les différentes actions disponibles via votre application.

Cette fonctionnalité n'est disponible  qu'à partir de l'API 14  d'Android donc à partir de la version 4.0 d'Android.

Pour séparer votre ActionBar en deux, il suffit de rajouter l'attribut  android:uiOptions= »splitActionBarWhenNarrow » sur la balise  application  (si vous souhaitez séparer votre  ActionBar  sur toute l'application) ou sur la balise  activity (si vous souhaitez séparer votre ActionBar uniquement sur quelques activités cibles) du fichier manifeste de l'application.

 
Sélectionnez
<activity
   android:name=".NextActivity"
   android:uiOptions="splitActionBarWhenNarrow" >
</activity>

Ce qui donnera sur un appareil Android (4.0 ou supérieures)

Image non disponible

II. Navigation via l'icône de votre application

Afin de pouvoir activer la navigation via l'icône de votre application (icône disponible sur l'ActionBar), il suffit de rajouter le code suivant dans la méthode  onCreateOptionsMenu  (après le chargement du fichier XML représentant votre menu/ActionBar).

 
Sélectionnez
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

La première ligne permet de récupérer l'instance de l'ActionBar.

  • La deuxième ligne permet d'activer la navigation à l'aide de l'icône de votre application.

La méthode  setDisplayHomeAsUpEnabled  n'est disponible qu'à partir d'Android 3.0 (Honeycomb). Afin de conserver la compatibilité avec les anciennes versions d'Android, il faut vérifier la version actuelle de l'appareil avant d'exécuter cette partie du code. Cette vérification s'effectue rapidement à l'aide de la classe  Build.VERSION.SDK_INT .

Ce qui donnera :

 
Sélectionnez
@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                ActionBar actionBar = getActionBar();
                actionBar.setDisplayHomeAsUpEnabled(true);
        }
        return true;
}

Si vous exécutez l'exemple, vous allez remarquer que l'icône devient cliquable (aucune action n'est liée à ce clic pour le moment).

Pour pouvoir exécuter l'action de votre choix lors du clic sur l'icône, il faut gérer l'élément  android.R.id.home  dans la méthode  onOptionsItemSelected . Vous pouvez par exemple revenir à l'activité lancée précédemment ( onBackPressed  : permet de simuler le clic sur le bouton précédant) ou lancer l'activité de votre choix.

 
Sélectionnez
@Override
public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                case android.R.id.home:
                        onBackPressed();
                case R.id.menu_about:
                        // Comportement du bouton  Propos"
                        return true;
                case R.id.menu_help:
                        // Comportement du bouton "Aide"
                        return true;
                case R.id.menu_refresh:
                        // Comportement du bouton "Rafraichir"
                        return true;
                case R.id.menu_search:
                        // Comportement du bouton "Recherche"
                        return true;
                case R.id.menu_settings:
                        // Comportement du bouton "Paramétres"
                        return true;
                default:
                        return super.onOptionsItemSelected(item);
        }
}

III. Résultat

Ce qui donnera :

III-A. Android 3.0

Image non disponible

III-B. Android 4.0

Image non disponible

Vous pouvez trouver le code de cet exemple ici.

IV. Remerciements

Je tiens à remercier tout particulièrement Feanorin qui a mis ce tutoriel au format Developpez.com.
Merci également à ClaudeLELOUP d'avoir pris le temps de le relire et de le corriger.

V. Liens