Hauteur de la barre d'état?

y a-t-il un moyen d'obtenir la hauteur du statusbar + titlebar? Vérifier le forum dev montre la même question mais pas de solution (que j'ai pu trouver).

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

Merci

61
demandé sur user291701 2010-07-28 20:59:27

10 réponses

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 sur le onCreate() méthode 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;
} 
91
répondu Jorgesys 2014-02-11 03:18:36

bien que ce soit une vieille question, j'ai trouvé que la réponse n'a pas fonctionné dans onCreate() :

j'ai trouvé ce code de ici qui fonctionne dans la 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 quiconque se heurte à cette question.

37
répondu raukodraug 2013-04-19 19:58:29

pour ceux, comme moi, qui veulent l'utiliser dans vos mises en page XML:

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

ne soyez pas confus par le fait que Android Studio (2.2 Preview 3 -- au moment de l'écriture) ne supporte pas cette notion. Le moteur d'exécution ne. Je l'ai pris dans le code source de Google.

31
répondu Aleksey Gureiev 2016-06-09 09:20:06

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) Dispositif 1 marque: samsung, appareil: maguro, conseil: thon, cpu_abi: armeabi-v7a, affichage: ICL53F.M420KREL08, fabricant: samsung, modèle: Nexus Galaxy, ver.version: 4.0.2, ver.sdk: 14;

résolution D'écran: 1280 x 720.Il n'y a aucun bouton matériel 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;

dispositif 1 a la barre de titre en haut de l'écran et la barre d'état avec le logiciel de boutons au bas de l'écran.

2) Dispositif 2 dispositif: bravo, planche: bravo, cpu_abi: armeabi-v7a, affichage: FRG83G, constructeur: HTC, modèle: HTC Desire, ver.version: 2.2.2, ver.sdk: 8,

résolution d'écran: 800 x 400. Cet appareil a des 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;

périphérique 2 A barre de titre en haut de la l'écran et n'a pas de barre d'état.

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

A) v.getTop() - rect.top 

( il est incorrect pour le dispositif 1 - il donne 0 au lieu de 72)

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

( il est incorrect pour le dispositif 2 - il 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 dispositif): marque: LGE, appareil: v909, cpu_abi: armeabi-v7a, affichage: HMJ37, modèle: LG-V909, ver.version: 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

Appareil 3 a l'horizontale, n'a pas de barre de titre en haut de l'écran et dispose de barre d'état au bas de l'écran.

Donc, ici:

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

c'est correct pour dispositifs 2 et 3. Je ne suis pas sûr pour l'appareil 1. L'utilisateur m'a envoyé la capture d'écran du périphérique 1. Il y a une barre d'état avec le bouton du logiciel. Mais l'expression "d'affichage.getHeight () - v. getBottom ()" donne 0.

6
répondu dvpublic 2012-03-22 06:22:51

attachez un runnable à l'une de vos vues dans votre méthode onCreate, et placez le code ci-dessus là. Cela va amener l'application à calculer la barre d'état + hauteur de titre 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 fonctionne toujours pas, essayez d'invoquer la méthode postDelayed de la vue au lieu de post et d'ajouter une valeur milliseconde comme second argument.

5
répondu Kachi 2011-06-25 18:19:50

la façon prise en charge pour obtenir la hauteur de la barre d'état est d'utiliser WindowInsets classe à partir de API 21+:

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

ou WindowInsetsCompat pour les bibliothèques de soutien:

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

vous pouvez également outrepasser la méthode onApplyWindowInsets à l'intérieur de 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 une fenêtre principale fitter (diapositives disponibles ici ).

5
répondu yarq 2017-10-30 15:42:39

vous pouvez aussi prendre la dimension de la barre d'état trouvée dans les dimensions.fichier xml d'android en utilisant la façon que ce billet de blog décrit.

cela peut obtenir la hauteur de la barre de statusbar sans avoir à attendre le dessin.

citant le code du billet de 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.

4
répondu LKallipo 2018-05-04 11:14:55

je pense que la meilleure façon de calculer qui est d'obtenir la hauteur de fullscreen moins notre disposition principale

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

Et vous pouvez le mettre dans onGlobalLayout() . Cela fonctionne sur les tablettes aussi, je l'ai essayé sur le thème.NoTitleBar, mais ça doit toujours marcher.

peut-être Pouvez-vous même l'améliorer et l'utiliser onCreate() en remplaçant mainView.getHeight() par mainView.getMeasuredHeight() .

2
répondu Mikooos 2012-10-02 16:03:29

la solution Postée par Jorgesys est très bonne, mais elle ne fonctionne pas à l'intérieur de la méthode onCreate (). Je suppose que c'est parce que statusbar et titlebar sont créés après onCreate().

la solution est simple - vous devez placer le code dans runnable et l'exécuter après onCreate () en utilisant root.post((Runnable action) );

ainsi la solution entière:

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 trouve ici

1
répondu jakkubu 2013-09-12 19:59:37

dès API 23 Il y a une meilleure solution pour obtenir la hauteur de la barre d'état. API 23 ajoute une fonctionnalité WindowInsets , de sorte que vous pouvez utiliser ce code pour obtenir la taille du système insets, dans ce cas au sommet.

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() retournera null jusqu'à ce que la vue ait été attachée à une fenêtre de sorte qu'elle ne peut pas être utilisée directement dans onCreate() mais vous pouvez ajouter un auditeur pour la fenêtre attacher et le faire - ici j'ajoute la barre d'état inset à la taille de ma barre d'outils, que je cache et montre, avec la barre de statut. Quand il est affiché, Je veux la barre d'état sur le dessus de celui-ci donc j'ajoute la hauteur de la barre d'état au rembourrage 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) {

        }
    });
0
répondu Clyde 2017-01-17 07:15:27