Hauteur de la barre d’état dans Android

Quelle est la hauteur de la barre d’état dans Android? Est-ce toujours la même chose?

D’après mes mesures, il semble que ce soit 25dp, mais je ne suis pas sûr qu’il ait la même hauteur sur toutes les plates-formes.

(Je veux savoir cela pour implémenter correctement une transition de fondu d’une activité qui n’a pas de barre d’état à une activité qui ne le fait pas)

    cette question a été répondue avant … Hauteur de la barre d’état?

    Mise à jour ::

    Méthode actuelle:

    ok, la hauteur de la barre d’état dépend de la taille de l’écran. Par exemple, dans un appareil avec une taille d’écran de 240 X 320, la hauteur de la barre d’état est de 20px. appareil avec 480 x 800 la hauteur de la barre d’état doit être 38px

    donc je 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; } 

    Parmi tous les exemples de code que j’ai utilisés pour obtenir la hauteur de la barre d’état, le seul qui semble réellement fonctionner dans la méthode onCreate d’une Activity est le suivant:

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

    Apparemment, la hauteur réelle de la barre d’état est conservée en tant que ressource Android. Le code ci-dessus peut être ajouté à une classe ContextWrapper (par exemple, une Activity ).

    Trouvé à http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

    Sur les périphériques MDPI, la barre d’état est 25px. Nous pouvons l’utiliser comme base et la multiplier par la densité (arrondie) pour obtenir la hauteur de la barre d’état sur n’importe quel périphérique:

     int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMesortingcs().density); 

    Pour référence: ldpi = 0,75, mdpi = 1, hdpi = 1,5, xhdpi = 2

    Selon les directives de conception de Google ; la hauteur de la barre d’état est de 24 dp.

    Si vous voulez obtenir la hauteur de la barre d’état en pixels, vous pouvez utiliser la méthode ci-dessous:

     private static int statusBarHeight(android.content.res.Resources res) { return (int) (24 * res.getDisplayMesortingcs().density); } 

    qui peut être appelé à partir de l’activité avec:

     statusBarHeight(getResources()); 

    J’ai fusionné des solutions ensemble:

     public static int getStatusBarHeight(final Context context) { final Resources resources = context.getResources(); final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) return resources.getDimensionPixelSize(resourceId); else return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMesortingcs().density); } 

    une autre alternative:

      final View view = findViewById(android.R.id.content); runJustBeforeBeingDrawn(view, new Runnable() { @Override public void run() { int statusBarHeight = getResources().getDisplayMesortingcs().heightPixels - view.getMeasuredHeight(); } }); 

    EDIT: alternative à runJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126

    cela fonctionne également avec le lien de réfraction

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

    Le codage en dur de la taille ou l’utilisation de la reflection pour obtenir la valeur de status_bar_height est considéré comme une mauvaise pratique. Chris Banes en a parlé au Droidcon New York . La méthode recommandée pour obtenir la taille de la barre d’état est via OnApplyWindowInsetsListener :

     myView.setOnApplyWindowInsetsListener { view, insets -> { val statusBarSize = insets.systemWindowInsetTop return insets } 

    Cela a été ajouté dans l’API 20 et est également réinjecté via ViewAppCompat .

    J’ai le même problème pour obtenir la hauteur de la barre d’état dans un onCreate. Cela fonctionne pour moi.

     private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19; private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25; private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38; 

    Dans le onCreate:

     DisplayMesortingcs displayMesortingcs = new DisplayMesortingcs(); ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMesortingcs(displayMesortingcs); int statusBarHeight; switch (displayMesortingcs.densityDpi) { case DisplayMesortingcs.DENSITY_HIGH: statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT; break; case DisplayMesortingcs.DENSITY_MEDIUM: statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT; break; case DisplayMesortingcs.DENSITY_LOW: statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT; break; default: statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT; } 

    Voir:

    http://developer.android.com/reference/android/util/DisplayMesortingcs.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

    Oui, quand j’essaie avec View, le résultat est 25px. Voici le code entier:

     public class SpinActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout lySpin = new LinearLayout(this); lySpin.setOrientation(LinearLayout.VERTICAL); lySpin.post(new Runnable() { public void run() { Rect rect = new Rect(); Window window = getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight = contentViewTop - statusBarHeight; System.out.println("TitleBarHeight: " + titleBarHeight + ", StatusBarHeight: " + statusBarHeight); } } } } 

    La hauteur officielle est de 24dp , comme indiqué officiellement par Google sur la page Web Android Design .

    La hauteur par défaut était 25dp. Avec Android Marshmallow (API 23), la hauteur a été réduite à 24dp.

    240×320 – 20px

    320×480 – 25px

    480 x 800 + – 38px

    Essaye ça:

      Rect rect = new Rect(); Window win = this.getWindow(); win.getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight = contentViewTop - statusBarHeight; Log.d("ID-ANDROID-CONTENT", "titleBarHeight = " + titleBarHeight ); 

    il n’a pas fonctionné pour moi dans la méthode onCreate pour l’activité, mais a fait quand je l’ai mis dans un onClickListener et m’a donné une mesure de 25

    Pour résoudre ce problème, j’ai utilisé une approche combinée. Cela est nécessaire car sur les tablettes, la barre système soustrait déjà ses pixels lorsque display.getHeight () est appelée. Donc, je vérifie d’abord si une barre de système est présente, puis Ben Claytons approche, ce qui fonctionne bien sur les téléphones.

     public int getStatusBarHeight() { int statusBarHeight = 0; if (!hasOnScreenSystemBar()) { int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = getResources().getDimensionPixelSize(resourceId); } } return statusBarHeight; } private boolean hasOnScreenSystemBar() { Display display = getWindowManager().getDefaultDisplay(); int rawDisplayHeight = 0; try { Method getRawHeight = Display.class.getMethod("getRawHeight"); rawDisplayHeight = (Integer) getRawHeight.invoke(display); } catch (Exception ex) { } int UIRequestedHeight = display.getHeight(); return rawDisplayHeight - UIRequestedHeight > 0; } 

    la hauteur de la barre d’état est de 24dp dans Android 6.0

       24dp  48dp 

    vous pouvez trouver la réponse dans le code source: frameworks \ base \ core \ res \ res \ values ​​\ dimens.xml

    Solution plein écran activée:

    Cette solution peut ressembler à une solution de contournement, mais elle tient compte du fait que votre application est en mode plein écran (ou cache la barre d’état):

     Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int barheight = size.y - findViewById(R.id.rootView).getHeight(); 

    De cette façon, si votre application est actuellement en plein écran, barheight sera égal à 0.

    Personnellement, je devais utiliser ceci pour corriger les coordonnées absolues de TouchEvent pour tenir compte de la barre d’état comme suit:

     @Override public boolean onTouch(View view,MotionEvent event) { Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int YCoord = (int)event.getRawY() - size.y + rootView.getHeight()); } 

    Et cela permettra d’obtenir la coordonnée Y absolue, que l’application soit en plein écran ou non.

    Prendre plaisir

    Sur Android 4.1 et versions ultérieures, vous pouvez définir le contenu de votre application pour qu’elle apparaisse derrière la barre d’état, afin que le contenu ne soit pas redimensionné à mesure que la barre d’état se cache et s’affiche. Pour ce faire, utilisez SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Vous devrez peut-être également utiliser SYSTEM_UI_FLAG_LAYOUT_STABLE pour aider votre application à maintenir une disposition stable.

    Lorsque vous utilisez cette approche, il vous incombe de vous assurer que les parties critiques de l’interface utilisateur de votre application (par exemple, les commandes intégrées dans une application Maps) ne sont pas couvertes par les barres système. Cela pourrait rendre votre application inutilisable. Dans la plupart des cas, vous pouvez gérer cela en ajoutant l’atsortingbut android: fitsSystemWindows à votre fichier de disposition XML, défini sur true. Cela ajuste le remplissage du parent ViewGroup pour laisser de la place aux fenêtres du système. Ceci est suffisant pour la plupart des applications.

    Dans certains cas, cependant, vous devrez peut-être modifier le remplissage par défaut pour obtenir la mise en page souhaitée pour votre application. Pour manipuler directement le contenu de votre contenu par rapport aux barres système (qui occupent un espace appelé “encarts de contenu” de la fenêtre), remplacez fitSystemWindows (encarts Rect). La méthode fitSystemWindows () est appelée par la hiérarchie de vues lorsque les encarts de contenu pour une fenêtre ont été modifiés pour permettre à la fenêtre d’ajuster son contenu en conséquence. En remplaçant cette méthode, vous pouvez gérer les encarts (et donc la disposition de votre application) comme vous le souhaitez.

    formulaire: https://developer.android.com/training/system-ui/status.html#behind

    Si vous connaissez exactement la taille VS hauteur

    comme

    Par exemple, dans un appareil avec une taille d’écran de 320 X 480, la hauteur de la barre d’état est de 25px, pour un appareil avec 480 x 800, la hauteur de la barre d’état doit être de 38px.

    alors vous pouvez simplement obtenir la largeur de votre vue / la taille de l’écran, vous pouvez simplement utiliser une instruction if else pour obtenir la hauteur de la barre d’état

    La raison pour laquelle la première réponse ne fonctionne pas pour certaines personnes est que vous ne pouvez pas obtenir les dimensions d’une vue tant qu’elle n’est pas prête à être rendue. Utilisez un OnGlobalLayoutListener pour obtenir lesdites dimensions lorsque vous pouvez réellement:

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { // Nice one, Google decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } Rect rect = new Rect(); decorView.getWindowVisibleDisplayFrame(rect); rect.top; // This is the height of the status bar } } } 

    C’est la méthode la plus fiable.

    Code testé pour obtenir la hauteur de la barre d’état (en pixels):

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

    Code testé pour obtenir la hauteur de la barre de navigation (en pixels):

     public static int getNavBarHeight(Context c) { int resourceId = c.getResources() .getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { return c.getResources().getDimensionPixelSize(resourceId); } return 0; } 

    Conversion de pixels en dp:

     public static int pxToDp(int px) { return (int) (px / Resources.getSystem().getDisplayMesortingcs().density); }