Cette leçon décrit comment masquer la barre d’état sur différentes versions d’Android. Le fait de masquer la barre d’état (et éventuellement, la barre de navigation) permet au contenu d’utiliser une plus grande partie de l’espace d’affichage, offrant ainsi une expérience utilisateur plus immersive.
La figure 1 montre une application avec une barre d’état visible :
Figure 1. Barre d’état visible.
La figure 2 montre une application avec une barre d’état cachée. Notez que la barre d’action est également cachée. Vous ne devriez jamais montrer la barre d’action sans la barre d’état.
Figure 2. Barre d’état cachée.
Cacher la barre d’état sur Android 4.0 et inférieur
Vous pouvez cacher la barre d’état sur Android 4.0 (niveau 14 de l’API) et inférieur en définissantWindowManager
des drapeaux. Vous pouvez le faire de manière programmatique ou en définissant un thème d’activité dans le fichier manifeste de votre application. La définition d’un thème d’activité dans le fichier manifest de votre application est l’approche préférée si la barre d’état doit toujours rester cachée dans votre application (bien que, strictement parlant, vous puissiez remplacer le thème par programme 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 :
- Il est plus facile à maintenir et moins sujet aux erreurs que la définition d’un drapeau par programme.
- Il en résulte des transitions d’interface utilisateur plus fluides, car le système dispose des informations dont il a besoin pour rendre votre interface utilisateur avant d’instancier l’activité principale de votre application.
Alternativement, vous pouvez définir par programmation des drapeaux WindowManager
.Cette approche facilite le masquage et l’affichage de la barre d’état au fur et à mesure que l’utilisateur interagit avec votre app:
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 drapeaux WindowManager
(que ce soit par le biais d’un thème d’activité ouprogrammatiquement), les drapeaux restent en vigueur à moins que votre app ne les efface.
Vous pouvez utiliserFLAG_LAYOUT_IN_SCREEN
pour définir la disposition de votre activité afin d’utiliser la même zone d’écran qui est disponible lorsque vous avez activéFLAG_FULLSCREEN
. Cela empêche votrecontenu de se redimensionner lorsque la barre d’état se cache et s’affiche.
Cacher la barre d’état sur Android 4.1 et supérieur
Vous pouvez cacher la barre d’état sur Android 4.1 (niveau 16 de l’API) et supérieur en utilisant setSystemUiVisibility()
.setSystemUiVisibility()
définit les drapeaux de l’interface utilisateur au niveau de la vue individuelle ; ces paramètres sont agrégés au niveau de la fenêtre. L’utilisation de setSystemUiVisibility()
pour définir les drapeaux de l’interface utilisateur vous donne un contrôle plus granulaire sur les barres du système que l’utilisation des drapeauxWindowManager
. Cet extrait cache 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();
Notez ce qui suit :
- Une fois que les drapeaux d’interface utilisateur ont été effacés (par exemple, en naviguant loin de l’activité), votre application doit les réinitialiser si vous voulez cacher à nouveau les barres.Voir Répondre aux changements de visibilité de l’interface utilisateur pour une discussion sur la façon d’écouter les changements de visibilité de l’interface utilisateur afin que votre application puisse répondre en conséquence.
- L’endroit où vous définissez les drapeaux d’interface utilisateur fait une différence. Si vous masquez les barres du système dans la méthode
onCreate()
de votre activité et que l’utilisateur appuie sur Home, les barres du système réapparaîtront. Lorsque l’utilisateur rouvre l’activité, la méthodeonCreate()
ne sera pas appelée, de sorte que les barres du système resteront visibles. Si vous voulez que les changements d’interface utilisateur du système persistent lorsque l’utilisateur navigue dans et hors de votre activité, définissez les drapeaux d’interface utilisateur dansonResume()
ouonWindowFocusChanged()
. - La méthode
setSystemUiVisibility()
n’a un effet que si la vue à partir de laquelle vous l’appelez est visible. - La navigation à l’écart de la vue entraîne l’effacement des drapeaux définis avec
setSystemUiVisibility()
.
Faire apparaître le contenu derrière la barre d’état
Sur Android 4.1 et plus, vous pouvez définir le contenu de votre application pour qu’il apparaisse derrière la barre d’état, de sorte que le contenu ne se redimensionne pas lorsque la barre d’état se cache et s’affiche.Pour ce faire, utilisezSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
.Vous pouvez également avoir besoin d’utiliserSYSTEM_UI_FLAG_LAYOUT_STABLE
pour aider votre application à maintenir une disposition astable.
Lorsque vous utilisez cette approche, il devient de votre responsabilité de vous assurer que les parties critiques de l’interface utilisateur de votre application (par exemple, les contrôles intégrés dans une application Maps) ne finissent pas par être recouvertes par les barres du système. Cela pourrait rendre votre application inutilisable. Dans la plupart des cas, vous pouvez gérer ce problème en ajoutant l’attribut android:fitsSystemWindows
à votre fichier de mise en page XML, défini surtrue
. Cela ajuste le padding du parent ViewGroup
pour laisser de l’espace pour les fenêtres système. Cela est suffisant pour la plupart des applications.
Dans certains cas, cependant, vous devrez modifier le rembourrage par défaut pour obtenir la mise en page souhaitée pour votre application. Pour manipuler directement la façon dont votrecontenu s’étale par rapport aux barres du système (qui occupent un espace connu sous le nom d' »insets de contenu » de la fenêtre), surchargez fitSystemWindows(Rect insets)
.La méthode fitSystemWindows()
est appelée par la hiérarchie de la vue lorsque les insets de contenu d’une fenêtre ont changé, pour permettre à la fenêtre d’ajuster son contenu en conséquence. En surchargeant cette méthode, vous pouvez gérer les insets (et donc la mise en page de votre application) comme vous le souhaitez.