web-dev-qa-db-fra.com

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

J'ai besoin de connaître la taille exacte de l'ActionBar en pixels pour appliquer une image d'arrière-plan correcte.

249
Eugene

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

?android:attr/actionBarSize

ou si vous êtes un utilisateur ActionBarSherlock ou AppCompat, utilisez cette

?attr/actionBarSize

Si vous avez besoin de cette valeur à 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 la plate-forme / res/values ​​/ attrs.xml
  2. La plate-forme themes.xml choisit cet attribut et lui attribue une valeur.
  3. La valeur attribuée à l'étape 2 dépend de différentes tailles de périphériques, définies dans divers fichiers dimens.xml de la plate-forme, c'est-à-dire. core/res/res/values-sw600dp/dimens.xml
531
AZ13

À partir des sources décompilées de Android 3.2, framework-res.apk, res/values/styles.xml 3.2 contient:

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

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

54
Jake Wharton

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);
43
David Boho

Un des échantillons de Honeycomb fait référence à ?android:attr/actionBarSize

33
Vikram Bodicherla

J'avais besoin de reproduire correctement ces hauteurs dans une application de compatibilité pré-ICS et de creuser dans le source de base du framework . Les deux réponses ci-dessus sont en quelque sorte correctes.

Cela revient essentiellement à utiliser des qualificatifs. La hauteur est définie par la dimension "action_bar_default_height"

Il est défini sur 48dip par défaut. Mais pour -land c'est 40dip et pour sw600dp c'est 56dip.

21
Manfred Moser

Si vous utilisez le composant ActionBar de compatibilité du package de prise en charge v7 appcompat récent, vous pouvez obtenir la hauteur à l'aide de

@dimen/abc_action_bar_default_height

Documentation

17
flawedmatrix

Avec la nouvelle bibliothèque de support v7 (21.0.0), le nom dans R.dimen a été remplacé par @ dimen/abc_action_bar_default_height _ matériau .

Lors de la mise à niveau à partir d'une version précédente de la bibliothèque de support, vous devez donc utiliser cette valeur comme hauteur de la barre d'actions.

16
MrMaffen

Si vous utilisez ActionBarSherlock, vous pouvez obtenir la hauteur avec

@dimen/abs__action_bar_default_height
9
JesperB

La réponse de @ AZ13 est bonne, mais selon les directives de conception d'Android , le ActionBar devrait être au moins 48dp de haut .

4
aaronsnoswell

Sur mon Galaxy S4 ayant> 441 dpi> 1080 x 1920> Obtention de la hauteur de la barre d’action avec getResources (). GetDimensionPixelSize J’ai obtenu 144 pixels.

En utilisant la formule px = dp x (dpi/160), j’utilisais 441dpi, alors que mon appareil se trouve
dans la catégorie 480dpi. si bien que cela confirme le résultat.

0
Muhammad

Le Résumé de la classe est généralement un bon point de départ. Je pense que la méthode getHeight () devrait suffire.

MODIFIER:

Si vous avez besoin de la largeur, ce devrait être la largeur de l'écran (non?) Et que vous pouvez rassembler comme ceci .

0
Matt

J'ai fait de cette manière pour moi-même, cette méthode d'assistance devrait être utile pour quelqu'un:

private static final int[] RES_IDS_ACTION_BAR_SIZE = {R.attr.actionBarSize};

/**
 * Calculates the Action Bar height in pixels.
 */
public static int calculateActionBarSize(Context context) {
    if (context == null) {
        return 0;
    }

    Resources.Theme curTheme = context.getTheme();
    if (curTheme == null) {
        return 0;
    }

    TypedArray att = curTheme.obtainStyledAttributes(RES_IDS_ACTION_BAR_SIZE);
    if (att == null) {
        return 0;
    }

    float size = att.getDimension(0, 0);
    att.recycle();
    return (int) size;
}
0
Min2