284 votes

Quelle est la taille de la barre d'action en pixels ?

J'ai besoin de connaître la taille exacte de la barre d'action en pixels afin d'appliquer une image de fond correcte.

604voto

AZ13 Points 3889

Pour récupérer la hauteur de la barre d'action en XML, utilisez simplement

?android:attr/actionBarSize

ou si vous êtes un utilisateur d'ActionBarSherlock ou d'AppCompat, utilisez ceci

?attr/actionBarSize

Si vous avez besoin de cette valeur au moment de l'exécution, utilisez ceci

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

Si vous avez besoin de comprendre où cela est défini :

  1. Le nom de l'attribut lui-même est défini dans l'attribut /res/values/attrs.xml
  2. La plate-forme thèmes.xml sélectionne cet attribut et lui attribue une valeur.
  3. La valeur attribuée à l'étape 2 dépend des différentes tailles de dispositifs, qui sont définies dans le document intitulé divers fichiers dimens.xml dans la plateforme, c'est-à-dire core/res/res/values-sw600dp/dimens.xml

7 votes

Bonne réponse. Je connais la façon de creuser ces informations, mais la recherche de cette réponse était beaucoup plus rapide +1. Votre réponse est également un excellent indice pour la recherche de ce genre de choses.

1 votes

Merci. J'essayais d'utiliser @dimen/abc_action_bar_default_height directement (ActionBarComapt) et cela a fonctionné (sur un périphérique mdpi). Mais essayer d'obtenir cette valeur sur un Samsung Galaxy SIII m'a renvoyé une valeur erronée. C'est parce que values-xlarge (en quelque sorte) est plus préférée que values-land en mode paysage. Se référer à l'attribut à la place fonctionne comme un charme.

4 votes

@AZ13 Je voudrais ajouter que android.R.attr.actionBarSize sera résolu à la taille 0 sur les appareils pré-3.0. Ainsi, lorsque vous utilisez ActionBarCompat on s'en tiendrait à android.support.v7.appcompat.R.attr.actionBarSize à la place.

63voto

Jake Wharton Points 26095

Depuis les sources décompilées d'Android 3.2. framework-res.apk , res/values/styles.xml contient :

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0 et 3.1 semblent être les mêmes (au moins à partir de l'AOSP)...

1 votes

Qu'en est-il de la hauteur différente de la barre d'action en paysage ?

90 votes

Sur 4.0+ : la valeur par défaut est 48dp, landscape est 40dp, sw600dp est 56dp

24 votes

C'est pourquoi vous devez utiliser la valeur Android:attr et non une valeur codée en dur !

48voto

David Wiesner Points 431

Pour obtenir la hauteur réelle de la barre d'action, vous devez résoudre l'attribut actionBarSize au moment de l'exécution.

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);

35voto

Vikram Bodicherla Points 3855

L'un des échantillons du Nid d'abeille fait référence à ?android:attr/actionBarSize

3 votes

3 votes

Voici la réponse si votre sdk min est >=11, si votre min est <11, alors il est probable que vous utilisez ABS, alors voici la solution : @dimen/abs__action_bar_default_height

9 votes

L'ABS a ?attr/actionBarSize (notez l'absence d'espace de nom Android) qui fonctionne à tous les niveaux de l'API.

21voto

Manfred Moser Points 13454

J'avais besoin de reproduire ces hauteurs correctement dans une application de compatibilité pré-SIC et j'ai creusé dans la base de données de l'entreprise. source principale du cadre . Les deux réponses ci-dessus sont en quelque sorte correctes.

Cela se résume essentiellement à l'utilisation de qualificatifs. La hauteur est définie par la dimension "action_bar_default_height".

Il est défini à 48dip par défaut. Mais pour -land il est de 40dip et pour sw600dp il est de 56dip.

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