Quelle est la taille d'ActionBar en pixels?


Réponses:


558

Pour récupérer la hauteur de l'ActionBar en XML, utilisez simplement

?android:attr/actionBarSize

ou si vous êtes un utilisateur ActionBarSherlock ou 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 devez comprendre où cela est défini:

  1. Le nom d'attribut lui-même est défini dans /res/values/attrs.xml de la plateforme
  2. Le fichier themes.xml de la plate- forme sélectionne 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, qui sont définies dans divers fichiers dimens.xml de la plate-forme, c'est-à-dire. core / res / res / values-sw600dp / dimens.xml

7
Très bonne réponse. Je connais le moyen de creuser ces informations, mais pour rechercher cette réponse a été beaucoup plus rapide +1. Votre réponse est également un excellent indice pour rechercher de telles choses.
rekire

1
Je vous remercie. J'essayais d'utiliser @dimen/abc_action_bar_default_heightdirectement (ActionBarComapt) et cela a fonctionné (sur le périphérique mdpi). Mais essayer d'obtenir cette valeur sur Samsung Galaxy SIII m'a retourné une mauvaise valeur. C'est parce que values-xlarge(en quelque sorte) est plus préféré qu'en values-landmode paysage. Faire référence à l'attribut fonctionne plutôt comme un charme.
Alex Semeniuk

4
@ AZ13 Je voudrais ajouter que la android.R.attr.actionBarSizerésolution sera de 0 sur les appareils pré-3.0. Donc, lorsque vous en utilisez ActionBarCompatun, vous vous en tiendrez à la android.support.v7.appcompat.R.attr.actionBarSizeplace.
Drew

1
Le gars l'a demandé en pixels. Je suppose que actionBarSize renvoie la valeur dp. J'ai obtenu la valeur 48dp. Cela signifie que le convertir en pixels me donne 96 pixels pour xhdpi.
Muhammad

"android.R.attr.actionBarSize" ne fonctionne pas dans la version Android 2.3, mais "R.attr.actionBarSize" fonctionne sous Android toute version. utilisez simplement "R.attr.actionBarSize" au lieu de "android.R.attr.actionBarSize" et etc.
Nathaniel Jobs

59

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

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

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


1
Qu'en est-il des différentes hauteurs de la barre d'action en paysage?
Manfred Moser

86
sur 4.0+: la valeur par défaut est 48dp, le paysage est 40dp, sw600dp est 56dp
Jake Wharton

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

45

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

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

33

L'un des échantillons Honeycomb fait référence à ?android:attr/actionBarSize



3
C'est la réponse si votre min sdk est> = 11, si vous êtes min est <11, alors vous utilisez probablement ABS, alors voici la solution: @ dimen / abs__action_bar_default_height
Adam

9
ABS a ?attr/actionBarSize(notez le manque d'espace de noms Android) qui fonctionne à tous les niveaux de l'API.
Jake Wharton

21

Je devais reproduire ces hauteurs correctement dans une application de compatibilité pré-ICS et creuser dans la source principale du framework . Les deux réponses ci-dessus sont en quelque sorte correctes.

Cela revient à 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.


17

Si vous utilisez l'ActionBar de compatibilité du récent package de prise en charge de l'application v7, vous pouvez obtenir la hauteur en utilisant

@dimen/abc_action_bar_default_height

Documentation



9

Si vous utilisez ActionBarSherlock, vous pouvez obtenir la hauteur avec

@dimen/abs__action_bar_default_height

N'utilisez pas abs__directement les ressources préfixées.
Jake Wharton

2
@JakeWharton, dites-nous alors comment le faire correctement.
JesperB

Créez votre propre dimension pour ne pas dépendre de abs_.
Codeversed


1
public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
                true))
            actionBarHeight = TypedValue.complexToDimensionPixelSize(
                    tv.data, getResources().getDisplayMetrics());
    } else {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
                getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

0

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.

ÉDITER:

Si vous avez besoin de la largeur, ce devrait être la largeur de l'écran (non?) Et qui peut être rassemblée comme ceci .


2
Étrange - getHeight () a pour résultat zéro.
Eugene

1
dans mon développement, j'ai remarqué qu'il retourne zéro dans onResume (). Le fait d'appeler getActionBar (). GetHeight () lorsque vous en avez réellement besoin renvoie une valeur positive> 0.
tos

@tos, la spécification de getHeight () indique qu'elle renvoie la largeur actuelle de l'ActionBar, qui est probablement 0 lorsque la vue est créée
Nom d'affichage

0

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

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


0

Je l'ai fait de cette façon pour moi-même, cette méthode d'aide 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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.