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
AZ13
la source
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) ...

Jake Wharton
la source
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);
David Boho
la source
33

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

Vikram Bodicherla
la source
3
Oui, expliqué ici: developer.android.com/guide/topics/ui/…
Pointer Null
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.

Manfred Moser
la source
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

matrice imparfaite
la source
16

Avec la nouvelle bibliothèque de support v7 (21.0.0), le nom de R.dimena changé en @ dimen / abc_action_bar_default_height_ material .

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

MrMaffen
la source
1
Parfait! Cela bat bien sûr ?attr/actionBarSizesi l'on cherche à correspondre à un habitué ActionBar.
karllindmark
9

Si vous utilisez ActionBarSherlock, vous pouvez obtenir la hauteur avec

@dimen/abs__action_bar_default_height
JesperB
la source
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;
}
Md. Enamul Haque
la source
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 .

Mat
la source
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.

Muhammad
la source
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;
}
Min2
la source