Masquer la barre d'état

Cette leçon explique comment masquer la barre d'état sur différentes versions d'Android. Si vous masquez la barre d'état (et éventuellement la barre de navigation), le contenu peut utiliser davantage l'espace d'affichage, ce qui offre une expérience utilisateur plus immersive.

La figure 1 montre une application avec une barre d'état visible:

barres système

Figure 1 : Barre d'état visible

La figure 2 montre une application dont la barre d'état est masquée. Notez que la barre d'action est également masquée. Vous ne devez jamais afficher la barre d'action sans la barre d'état.

barres système

Figure 2. Barre d'état masquée.

Masquer la barre d'état sur Android 4.0 ou version antérieure

Vous pouvez masquer la barre d'état sur Android 4.0 (niveau d'API 14) ou version antérieure en définissant des indicateurs WindowManager. Vous pouvez le faire par programmation ou en définissant un thème d'activité dans le fichier manifeste de votre application. Définir un thème d'activité dans le fichier manifeste de votre application est l'approche recommandée si la barre d'état doit toujours rester masquée dans votre application (bien que, strictement parlant, vous puissiez remplacer le thème par programmation si vous le souhaitez). Par exemple :

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

Les avantages de l'utilisation d'un thème d'activité sont les suivants:

  • Cette méthode est plus facile à gérer et moins sujette aux erreurs que la définition d'un indicateur programmatique.
  • Les transitions d'interface utilisateur sont plus fluides, car le système dispose des informations nécessaires pour afficher votre UI avant d'instancier l'activité principale de votre application.

Vous pouvez également définir des indicateurs WindowManager de manière programmatique. Cette approche permet de masquer et d'afficher plus facilement la barre d'état lorsque l'utilisateur interagit avec votre application:

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN)
        }
        setContentView(R.layout.activity_main)
    }
    ...
}

Java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}

Lorsque vous définissez des indicateurs WindowManager (via un thème d'activité ou programmatique), ils restent actifs, sauf si votre application les supprime.

Vous pouvez utiliser FLAG_LAYOUT_IN_SCREEN pour définir la mise en page de votre activité afin qu'elle utilise la même zone d'écran que celle qui est disponible lorsque vous avez activé FLAG_FULLSCREEN. Cela évite que votre contenu soit redimensionné lorsque la barre d'état est masquée ou affichée.

Masquer la barre d'état sur Android 4.1 ou version ultérieure

Vous pouvez masquer la barre d'état sur Android 4.1 (niveau d'API 16) ou version ultérieure en utilisant setSystemUiVisibility(). setSystemUiVisibility() définit des indicateurs d'interface utilisateur au niveau de chaque vue. Ces paramètres sont agrégés au niveau de la fenêtre. L'utilisation de setSystemUiVisibility() pour définir des indicateurs d'interface utilisateur vous offre un contrôle plus précis sur les barres système que l'utilisation d'indicateurs WindowManager. Cet extrait de code masque la barre d'état:

Kotlin

// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
actionBar?.hide()

Java

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

Remarques :

  • Une fois que les indicateurs d'interface utilisateur ont été supprimés (par exemple, en quittant l'activité), votre application doit les réinitialiser si vous souhaitez masquer à nouveau les barres. Pour découvrir comment écouter les changements de visibilité de l'UI afin que votre application puisse réagir en conséquence, consultez la section Répondre aux changements de visibilité de l'UI.
  • L'emplacement où vous définissez les indicateurs de l'interface utilisateur fait une différence. Si vous masquez les barres système dans la méthode onCreate() de votre activité et que l'utilisateur appuie sur Accueil, elles réapparaîtront. Lorsque l'utilisateur rouvre l'activité, onCreate() n'est pas appelé. Par conséquent, les barres système restent visibles. Si vous souhaitez que les modifications de l'UI du système persistent lorsque l'utilisateur accède à votre activité ou la quitte, définissez des indicateurs d'interface utilisateur dans onResume() ou onWindowFocusChanged().
  • La méthode setSystemUiVisibility() n'a d'effet que si la vue à partir de laquelle vous l'appelez est visible.
  • Si vous quittez la vue, les indicateurs définis avec setSystemUiVisibility() seront effacés.

Faire apparaître le contenu derrière la barre d'état

Sur Android 4.1 et versions ultérieures, vous pouvez définir le contenu de votre application pour qu'il s'affiche derrière la barre d'état, afin qu'il ne soit pas redimensionné lorsque la barre d'état est masquée et affichée. Pour ce faire, utilisez SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Vous devrez peut-être également utiliser SYSTEM_UI_FLAG_LAYOUT_STABLE pour aider votre application à conserver une mise en page stable.

Lorsque vous utilisez cette approche, il vous incombe de vous assurer que les parties critiques de l'interface utilisateur de votre application (par exemple, les commandes intégrées dans une application Maps) ne sont pas couvertes par des barres système. Cela pourrait rendre votre application inutilisable. Dans la plupart des cas, vous pouvez résoudre ce problème en ajoutant l'attribut android:fitsSystemWindows à votre fichier de mise en page XML, en le définissant sur true. Cela ajuste la marge intérieure du ViewGroup parent afin de laisser de l'espace pour les fenêtres système. C'est suffisant pour la plupart des applications.

Toutefois, dans certains cas, vous devrez peut-être modifier la marge intérieure par défaut afin d'obtenir la mise en page souhaitée pour votre application. Pour manipuler directement la mise en page de votre contenu par rapport aux barres système (qui occupent un espace appelé "encarts de contenu" de la fenêtre), remplacez fitSystemWindows(Rect insets). La méthode fitSystemWindows() est appelée par la hiérarchie des vues lorsque les encarts de contenu d'une fenêtre ont été modifiés, pour permettre à la fenêtre d'ajuster son contenu en conséquence. En remplaçant cette méthode, vous pouvez gérer les encarts (et donc la mise en page de votre application) comme vous le souhaitez.