83 votes

Hauteur de la barre d'état ?

Existe-t-il un moyen d'obtenir la hauteur de la barre d'état + la barre de titre ? En consultant le forum dev, on trouve la même question mais aucune solution (à ma connaissance).

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

Merci

116voto

Elenasys Points 23268
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); 

Obtenir la hauteur de la barre d'état de l'écran 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;
}

46voto

raukodraug Points 3280

Bien qu'il s'agisse d'une vieille question, j'ai constaté que la réponse ne fonctionnait pas en onCreate() :

J'ai trouvé ce code dans aquí qui travaille dans le onCreate() 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;
}

J'espère que cela aidera tous ceux qui rencontrent ce problème.

9voto

LKallipo Points 382

Vous pouvez également prendre la dimension de la barre d'état qui se trouve dans le fichier dimens.xml d'Android de la manière suivante cet article de blog décrit.

Cela permet d'obtenir la hauteur de la barre d'état sans avoir à attendre le dessin.

Je cite 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 placer cette méthode dans une classe ContextWrapper.

6voto

dvpublic Points 239

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, carte : thon, cpu_abi : armeabi-v7a, écran : ICL53F.M420KREL08, fabricant : samsung, modèle : Galaxy Nexus, ver.release : 4.0.2, ver.sdk : 14 ;

Résolution de l'écran : Il n'y a pas de boutons matériels sur cet appareil.

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;

Le dispositif 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) Dispositif 2 dispositif : bravo, carte : bravo, cpu_abi : armeabi-v7a, écran : FRG83G, fabricant : HTC, modèle : HTC Desire, ver.release : 2.2.2, ver.sdk : 8,

Résolution de l'écran : 800 x 400. Cet appareil est doté 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 une barre de titre en haut de l'écran et n'a pas de barre d'état du tout.

Deux solutions ont été proposées ci-dessus :

A) v.getTop() - rect.top 

( c'est incorrect pour le dispositif 1 - cela donne 0 au lieu de 72)

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

( c'est incorrect pour le dispositif 2 - cela donne 0 au lieu de 38)

Variante :

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

donne des résultats corrects dans les deux cas.

Mise à jour

3) Un autre exemple (troisième appareil) : marque : LGE, appareil : v909, cpu_abi : armeabi-v7a, écran : 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

Le dispositif 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, voilà :

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

C'est correct pour les appareils 2 et 3. Je ne suis pas sûr pour l'appareil 1. L'utilisateur m'a envoyé une capture d'écran de l'appareil 1. Il y a une barre d'état avec un bouton logiciel. Mais l'expression "display.getHeight() - v.getBottom()" donne 0.

4voto

Kachi Points 1593

Attachez un runnable à l'une de vos vues dans votre méthode onCreate, et placez-y le code ci-dessus. Ainsi, l'application calculera la hauteur de la barre d'état et de l'écran de titre lorsqu'ils seront attachés à l'écran.

Jetez un coup d'œil au 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 fonctionne toujours pas, essayez d'invoquer la méthode postDelayed de la vue au lieu de post et ajoutez une valeur en millisecondes comme deuxième argument.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X