web-dev-qa-db-fra.com

Obtenez de manière fiable la hauteur de la barre d'état pour résoudre le problème de navigation translucide KitKat

J'expérimente avec les nouvelles barres de navigation translucides Android 4.4 et souhaite définir la barre de navigation comme translucide à l'aide de l'indicateur FLAG_TRANSLUCENT_NAVIGATION. Je souhaite seulement que la barre de navigation (dos, bouton d'accueil, etc.) soit translucide - je veux que la barre d'état en haut de l'écran apparaisse normalement. PAS translucide.

Le code que j'utilise pour y parvenir est:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

Le problème que j'ai est Android pense maintenant que l'activité est en plein écran et place la mise en page derrière la barre de navigation (ce qui est correct), malheureusement, il place également la mise en page derrière la barre d'état (un problème).

Un correctif hacky pour cela consisterait à appliquer un remplissage au sommet de la vue parent de présentation, mais je dois déterminer la hauteur de la barre d'état pour le faire.

Quelqu'un pourrait-il me dire comment obtenir la hauteur de la barre d'état, ce n'est pas aussi trivial que je le pensais ou suggérer une solution appropriée?.

Merci

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

Utilisez le code ci-dessus dans la méthode onCreate. Mettez-le dans une classe contextWrapper . http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-Android/

55
user2511882

Depuis api 21, il existe une méthode officielle permettant de récupérer des encarts pour la barre de statut et la hauteur de la barre de navigation quand est translucide

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() {
        @Override
        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
            final int statusBar = insets.getSystemWindowInsetTop();
            final int navigationBar = insets.getSystemWindowInsetBottom();
            return insets;
        }
    });
22
Jacek Marchwicki

La hauteur de la barre de navigation inférieure est de 48dp (en modes portrait et paysage) et de 42dp lorsque la barre est placée verticalement.

J'espère que cela t'aides.

3
Aritra Roy

La réponse acceptée retourne toujours la hauteur de la barre d'état (et d'une manière quelque peu hacky). Mais certaines activités peuvent être en plein écran, et cette méthode ne les différencie pas.

Cette méthode me convient parfaitement pour trouver la hauteur de la barre d'état par rapport à l'activité en cours (placez-la dans votre classe d'activité et utilisez-la une fois la mise en page terminée):

public int getStatusBarHeight() {
    Rect displayRect = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect);
    return displayRect.top;
}

Notez que vous pouvez aussi simplement utiliser displayRect directement au cas où vous auriez d’autres "décorations de fenêtre" en bas, voire même sur les côtés de l’écran. 

3
Mete

recommande d'utiliser ce script pour obtenir la hauteur de la barre d'état

Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = 
    window.findViewById(Window.ID_Android_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

   Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(ancienne méthode) pour obtenir 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;
}
0
Yogesh Rathi