Hauteur de la barre d’état

Est-il possible d’obtenir la hauteur de la barre d’état + barre de titre? Vérifier le forum de développement montre la même question mais pas de solution (que j’ai pu trouver).

Je sais que nous pouvons l’obtenir après le passage initial de la mise en page, mais je cherche à l’inclure dans onCreate () de mon activité.

Merci

Rect rectgle= new Rect(); Window window= getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rectgle); int StatusBarHeight= rectgle.top; int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int TitleBarHeight= contentViewTop - StatusBarHeight; Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); 

Obtenez la hauteur de la barre d’état sur la méthode onCreate() de votre activité, utilisez cette méthode:

 public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 

Bien que ce soit une vieille question, j’ai trouvé que la réponse ne fonctionnait pas dans onCreate() :

J’ai trouvé ce code à partir d’ ici qui fonctionne dans la méthode onCreate()

 public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 

J’espère que cela aide à quiconque se heurte à ce problème.

Pour ceux qui, comme moi, souhaitent l’utiliser dans vos mises en page XML:

 <... android:layout_marginTop="@*android:dimen/status_bar_height" ... /> 

Ne soyez pas troublé par le fait qu’Android Studio (2.2 Preview 3 – au moment de l’écriture) ne supporte pas cette notion. Le runtime le fait. Je l’ai pris à partir du code source de Google.

Je suggère le code suivant:

 Rect rect = new Rect(); Window window = activity.getWindow(); if (window != null) { window.getDecorView().getWindowVisibleDisplayFrame(rect); android.view.View v = window.findViewById(Window.ID_ANDROID_CONTENT); android.view.Display display = ((android.view.WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); //return result title bar height return display.getHeight() - v.getBottom() + rect.top; } 

Deux exemples:

1) appareil 1 marque: samsung, dispositif: maguro, conseil: thon, cpu_abi: armeabi-v7a, affichage: ICL53F.M420KREL08, fabricant: samsung, modèle: Galaxy Nexus, version préliminaire: 4.0.2, ver.sdk: 14 ;

Résolution d’écran: 1280 x 720. Cet appareil ne comporte aucun bouton matériel.

Résultats:

 rect: left=0 right=720 top=72 bottom=1208; v: left=0 right=720 top=72 bottom=1208; display: height=1208 width=720; correct result=72; 

L’appareil 1 a une barre de titre en haut de l’écran et une barre d’état avec des boutons logiciels en bas de l’écran.

2) appareil 2 appareil: bravo, conseil: bravo, cpu_abi: armeabi-v7a, affichage: FRG83G, fabricant: HTC, modèle: HTC Desire, ver.release: 2.2.2, ver.sdk: 8,

Résolution d’écran: 800 x 400. Cet appareil dispose de boutons matériels.

Résultats:

 rect: left=0 right=480 top=38 bottom=800; v: left=0 right=480 top=0 bottom=800; display: height=800 width=480; correct result: phone_bar_height=38; 

L’appareil 2 a la barre de titre en haut de l’écran et n’a pas de barre d’état du tout.

Deux solutions ont été suggérées ci-dessus:

 A) v.getTop() - rect.top 

( il est incorrect pour le périphérique 1 – il donne 0 au lieu de 72)

 B) display.getHeight() - v.getHeight() 

( il est incorrect pour le périphérique 2 – il donne 0 au lieu de 38)

Une variante:

  display.getHeight() - v.getBottom() + rect.top 

donne des résultats corrects dans les deux cas.

Mettre à jour

3) Un autre exemple (troisième appareil): marque: LGE, appareil: v909, cpu_abi: armeabi-v7a, affichage: HMJ37, modèle: LG-V909, ver.release: 3.1, ver.sdk: 12

 rect: left=0 right=1280 top=0 bottom=720 v: left=0 right=1280 top=0 bottom=720 Display: height=768 width=1280 phone_bar_height=48 

L’appareil 3 a une orientation horizontale, n’a pas de barre de titre en haut de l’écran et a une barre d’état en bas de l’écran.

Alors, ici:

 int size_of_title_bar = rect.top; int size_of_status_bar = display.getHeight() - v.getBottom(); 

C’est correct pour les périphériques 2 et 3. Je ne suis pas sûr de l’appareil 1. L’utilisateur m’a envoyé une capture d’écran du périphérique 1. Il y a une barre d’état avec le bouton du logiciel. Mais l’expression “display.getHeight () – v.getBottom ()” donne 0.

Joignez un fichier exécutable à l’une de vos vues dans votre méthode onCreate, puis placez le code ci-dessus. Cela entraînera l’application pour calculer la barre d’état + hauteur de l’écran titres lorsqu’ils sont attachés à l’écran.

Regardez le code ci-dessous:

 myView.post(new Runnable() { @Override public void run() { Rect rectgle= new Rect(); Window window= getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rectgle); int StatusBarHeight= rectgle.top; int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int TitleBarHeight= contentViewTop - StatusBarHeight; } }); 

Si cela ne résout toujours pas le problème, essayez d’appeler la méthode postDelayed de la vue au lieu de poster et d’append une valeur de millisecondes comme second argument.

La méthode prise en charge pour obtenir la hauteur de la barre d’état consiste à utiliser la classe WindowInsets partir de l’API 21+:

 customView.setOnApplyWindowInsetsListener((view, insets) -> { // Handle insets return insets.consumeSystemWindowInsets(); }); 

ou WindowInsetsCompat pour les bibliothèques de support:

 ViewCompat.setOnApplyWindowInsetsListener(customView, (view, insets) -> { // Handle insets return insets.consumeSystemWindowInsets(); }); 

Vous pouvez également remplacer la méthode onApplyWindowInsets dans la vue:

 public class CustomView extends View { @Override public WindowInsets onApplyWindowInsets(final WindowInsets insets) { final int statusBarHeight = insets.getStableInsetTop(); return insets.consumeStableInsets(); } } 

Pour plus de détails, je vous recommande de vérifier Chris Banes talk – Devenir un installateur de fenêtre principale (diapositives disponibles ici ).

Vous pouvez également prendre la dimension de la barre d’état trouvée dans le fichier dimens.xml d’android en utilisant la description de cet article .

Cela peut avoir la hauteur de la barre d’état sans avoir à attendre le dessin.

Citant le code de l’article du blog:

 public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 

Vous devez mettre cette méthode dans une classe ContextWrapper.

Je pense que la meilleure façon de calculer cela est d’obtenir la hauteur de plein écran moins notre mise en page principale

 phoneBarsHeight = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight() - mainView.getHeight(); 

Et vous pouvez le mettre dans onGlobalLayout() . Cela fonctionne aussi sur les tablettes, je l’ai essayé sur Theme.NoTitleBar, mais cela doit toujours fonctionner.

Vous pouvez peut-être même l’améliorer et l’utiliser onCreate() en mainView.getHeight() par mainView.getMeasuredHeight() .

La solution publiée par Jorgesys est très bonne, mais elle ne fonctionne pas dans la méthode onCreate (). Je suppose que c’est parce que la barre d’état et la barre de titre sont créées après onCreate ().

La solution est simple: vous devez mettre le code dans runnable et l’exécuter après onCreate () en utilisant root.post((Runnable action) );

Donc, toute la solution:

 root = (ViewGroup)findViewById(R.id.root); root.post(new Runnable() { public void run(){ Rect rectgle= new Rect(); Window window= getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rectgle); int StatusBarHeight= rectgle.top; int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int TitleBarHeight= contentViewTop - StatusBarHeight; Log.i("*** jakkubu :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); } }); 

Je le trouve ici

A partir de l’API 23, il existe une meilleure solution pour obtenir la hauteur de la barre d’état. L’API 23 ajoute une fonctionnalité WindowInsets , vous pouvez donc utiliser ce code pour obtenir la taille des encarts système, en l’occurrence en haut.

 public int getStatusBarHeight() { if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { return binding.mainContent.getRootWindowInsets().getStableInsetTop(); } int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if(resourceId != 0) { return getResources().getDimensionPixelSize(resourceId); } return 0; } 

Notez que getRootWindowInsets() renverra la valeur null jusqu’à ce que View ait été attaché à une fenêtre, de sorte qu’il ne puisse pas être utilisé directement dans onCreate() mais vous pouvez append un écouteur pour la onCreate() barre d’état à la taille de ma barre d’outils, que je cache et affiche, avec la barre d’état. Quand il est affiché, je veux que la barre d’état soit placée au-dessus, donc j’ajoute la hauteur de la barre d’état au remplissage supérieur de la barre d’outils.

  binding.mainContent.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { @Override public void onViewAttachedToWindow(View view) { binding.toolbar.setPadding(binding.toolbar.getPaddingLeft(), binding.toolbar.getPaddingTop() + getStatusBarHeight(), binding.toolbar.getPaddingRight(), binding.toolbar.getPaddingBottom()); binding.mainContent.removeOnAttachStateChangeListener(this); } @Override public void onViewDetachedFromWindow(View view) { } });