Réponses:
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:
@dimen/abc_action_bar_default_height
directement (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-land
mode paysage. Faire référence à l'attribut fonctionne plutôt comme un charme.
android.R.attr.actionBarSize
résolution sera de 0 sur les appareils pré-3.0. Donc, lorsque vous en utilisez ActionBarCompat
un, vous vous en tiendrez à la android.support.v7.appcompat.R.attr.actionBarSize
place.
À partir des 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 de l'AOSP) ...
Pour obtenir la hauteur réelle de la barre d'actions, 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);
L'un des échantillons Honeycomb fait référence à ?android:attr/actionBarSize
?attr/actionBarSize
(notez le manque d'espace de noms Android) qui fonctionne à tous les niveaux de l'API.
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.
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
Avec la nouvelle bibliothèque de support v7 (21.0.0), le nom de R.dimen
a 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
?attr/actionBarSize
si l'on cherche à correspondre à un habitué ActionBar
.
Si vous utilisez ActionBarSherlock, vous pouvez obtenir la hauteur avec
@dimen/abs__action_bar_default_height
abs__
directement les ressources préfixées.
La réponse de @ AZ13 est bonne, mais selon les directives de conception d'Android , l'ActionBar devrait être d' au moins 48dp de haut .
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;
}
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 .
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.
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;
}