368 votes

Hauteur de la barre d'état dans Android

Quelle est la hauteur de la barre d'état dans Android ? Est-elle toujours la même ?

D'après mes mesures, il semble que ce soit 25dp, mais je ne suis pas sûr si elle a 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 qui en a)

0 votes

Si vous effectuez un fondu enchaîné, vous n'aurez pas besoin de connaître la hauteur de la barre d'état.

2 votes

J'en ai besoin car certains éléments sont centrés dans la mise en page, et je voudrais qu'ils se fondent les uns dans les autres.

392voto

Elenasys Points 23268

Cette question a été répondue avant... Hauteur de la barre d'état?

Mise à jour::

Méthode actuelle:

d'accord, 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, pour 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 une taille d'écran de 480 x 800 la hauteur de la barre d'état doit être de 38px

je recommande donc 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 :: ", "Hauteur de la barre d'état = " + statusBarHeight + " , Hauteur de la barre de titre = " + 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 votes

Pas exactement. Je demande aussi si je peux supposer que la barre d'état a la même hauteur sur tous les appareils.

18 votes

Ou utilisez dip? Si cela a toujours 25dip, alors le code n'est pas nécessaire.

10 votes

Vous ne pouvez pas supposer que c'est toujours 25dp (consultez la hauteur par exemple sur le kindle fire).

227voto

Ben Clayton Points 16793

De tous les exemples de code que j'ai utilisés pour obtenir la hauteur de la barre d'état, le seul qui semble fonctionner réellement dans la méthode onCreate d'une Activité 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 véritable hauteur 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 Activité).

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

0 votes

Au lieu de le coder en dur, il est préférable de le calculer dynamiquement. La méthode ci-dessus a fonctionné pour moi!

0 votes

Ne devriez-vous pas utiliser getDimension(...) à la place ?

8 votes

Un mot de prudence - cela ne fonctionne pas sur tous les appareils. Par exemple, sur Transformer TF201 (ainsi que TF101, TF300 et certains autres appareils), la hauteur est signalée comme étant de 25 là où il n'y a pas de barre d'état.

50voto

Grantland Chew Points 1377

Sur les appareils MDPI, la barre d'état est de 25px. Nous pouvons utiliser cela comme base et le multiplier par la densité (arrondie) pour obtenir la hauteur de la barre d'état sur n'importe quel appareil :

int hauteurBarreEtat = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

Pour référence : ldpi=.75, mdpi=1, hdpi=1.5, xhdpi=2

6 votes

Ceci est correct pour les appareils qui ont une barre d'état. Notez que depuis la rédaction ci-dessus, il est devenu vrai que tous les appareils n'en auront pas une. En particulier, les appareils sous ICS peuvent avoir une barre de statut/navigation combinée en bas et rien du tout en haut. Donc, dans ce cas, pour la plupart des besoins de programmation, vous voudriez assigner une hauteur de zéro à la barre d'état, mais la formulation ci-dessus vous donnerait une taille non nulle.

1 votes

Aussi, la valeur de 25px n'est pas correcte pour tous les appareils mdpi. Cela peut varier en fonction du niveau de l'API. Par exemple, la tablette émulateur 10.1 WXGA rapporte 25px aux niveaux d'API 16 et 19, mais 24px au niveau d'API 24.

0 votes

L'utilisation constante (comme 25) ne fonctionne pas correctement tout le temps, vous pouvez essayer d'utiliser la solution stackoverflow.com/a/16523854/3341089.

14voto

benedict Points 156

Je rencontre le même problème de devoir 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;

À l'intérieur de onCreate :

DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);

int statusBarHeight;

switch (displayMetrics.densityDpi) {
    case DisplayMetrics.DENSITY_HIGH:
        statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_MEDIUM:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_LOW:
        statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
        break;
    default:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
}

Voir :

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

3 votes

J'aime votre idée d'utiliser des valeurs basées sur la densité. Si vous allez utiliser le code à plusieurs endroits (ou utiliser d'autres valeurs liées à la densité), je préfère déléguer le travail au système et stocker les valeurs dans une ressource dimen, ce qui rend le changement inutile. Vous devez créer un dossier spécifique aux dimensions et un fichier de ressources pour chaque densité. final Resources res = context.getResources(); int statusbarHeight = 0; try { statusbarHeight = res.getDimensionPixelSize(R.dimen.android_statusbar_height); } catch (NotFoundException e) {}

5 votes

Durcir ces valeurs est dangereux, que se passerait-il s'ils changeaient dans une version ultérieure de la plateforme?

0 votes

Je pense qu'au lieu d'utiliser des tailles de pixels codées en dur (une pour chaque densité), il vaut mieux utiliser "25dp".

13voto

Braj Points 91

Oui, lorsque j'essaie avec View, il fournit le résultat de 25px. Voici tout le code :

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("Hauteur de la barre de titre : " + titleBarHeight 
                    + ", Hauteur de la barre d'état : " + statusBarHeight);
            }
        }
    }
}

0 votes

Le code ci-dessus fonctionne pour moi lorsque je crée un nouveau linear layout comme vous l'avez fait ci-dessus, mais lorsque je fais findviewbyid pour le lySpin provenant du xml, alors il renvoie null. Je ne comprends pas pourquoi il se comporte ainsi.

0 votes

Parce que la disposition ne connaît pas encore sa taille dans onCreate car elle n'a pas fini d'être dessinée. Ce que je fais habituellement, c'est poster un Runnable sur le fil UI à partir de onCreate, ce qui donne du temps à l'interface utilisateur pour se dessiner.

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