¿Cuál es el tamaño de ActionBar en píxeles?


Respuestas:


558

Para recuperar la altura de ActionBar en XML, simplemente use

?android:attr/actionBarSize

o si eres un usuario de ActionBarSherlock o AppCompat, usa esto

?attr/actionBarSize

Si necesita este valor en tiempo de ejecución, use esto

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

Si necesita comprender dónde se define esto:

  1. El nombre del atributo en sí está definido en /res/values/attrs.xml de la plataforma .
  2. Themes.xml de la plataforma elige este atributo y le asigna un valor.
  3. El valor asignado en el paso 2 depende de diferentes tamaños de dispositivo, que se definen en varios archivos dimens.xml en la plataforma, es decir. core / res / res / values-sw600dp / dimens.xml

77
Gran respuesta. Sé la forma de cavar esta información, pero buscar esta respuesta fue mucho más rápido +1. Su respuesta también es una gran pista sobre cómo buscar esas cosas.
— rekire 01 de

1
Gracias. Estaba tratando de usar @dimen/abc_action_bar_default_heightdirectamente (ActionBarComapt) y funcionó (en el dispositivo mdpi). Pero tratar de obtener este valor en Samsung Galaxy SIII me devolvió un valor incorrecto. Eso es porque values-xlarge(de alguna manera) es más preferido que values-landcuando está en modo horizontal. Hacer referencia al atributo en su lugar funciona como un encanto.
— Alex Semeniuk

44
@ AZ13 Me gustaría agregar que android.R.attr.actionBarSizese resolverá en tamaño 0 en dispositivos anteriores a 3.0. Entonces, al usar ActionBarCompatuno, se apegaría a él en su android.support.v7.appcompat.R.attr.actionBarSizelugar.
— Dibujó el

1
El chico lo preguntó en píxeles. Supongo que actionBarSize devuelve el valor dp. Obtuve el valor 48dp. Eso significa que convertirlo a píxeles me da 96 píxeles para xhdpi.
— Muhammad

"android.R.attr.actionBarSize" no funciona en la versión 2.3 de Android, pero "R.attr.actionBarSize" funciona en todas las versiones de Android. simplemente use "R.attr.actionBarSize" en lugar de "android.R.attr.actionBarSize" y etc.
— Nathaniel Jobs

59

De las fuentes descompiladas de Android 3.2 framework-res.apk, res/values/styles.xmlcontiene:

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

3.0 y 3.1 parecen ser lo mismo (al menos desde AOSP) ...


1
¿Qué pasa con la altura diferente de la barra de acción en el paisaje?
— Manfred Moser

86
en 4.0+: el valor predeterminado es 48dp, el paisaje es 40dp, sw600dp es 56dp
— Jake Wharton

19
¡Es por eso que debe usar el valor android: attr y no un valor codificado!
— Vikram Bodicherla

45

Para obtener la altura real de la barra de acción, debe resolver el atributo actionBarSizeen tiempo de ejecución.

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

33

Una de las muestras de Honeycomb se refiere a ?android:attr/actionBarSize



3
Esta es la respuesta si su min sdk es> = 11, si su min es <11, entonces lo más probable es que esté usando ABS, entonces esta es la solución: @ dimen / abs__action_bar_default_height
— Adam

9
ABS tiene ?attr/actionBarSize(tenga en cuenta la falta de espacio de nombres de Android) que funciona en todos los niveles de API.
— Jake Wharton

21

Necesitaba replicar estas alturas correctamente en una aplicación de compatibilidad anterior a ICS y buscar en la fuente central del marco . Ambas respuestas anteriores son más o menos correctas.

Básicamente se reduce a usar calificadores. La altura está definida por la dimensión "action_bar_default_height"

Está definido en 48dip por defecto. Pero para tierra es 40dip y para sw600dp es 56dip.


17

Si está utilizando la barra de acciones de compatibilidad del reciente paquete de soporte de v7 appcompat, puede obtener la altura usando

@dimen/abc_action_bar_default_height

Documentación



9

Si está utilizando ActionBarSherlock, puede obtener la altura con

@dimen/abs__action_bar_default_height

No use abs__recursos prefijados directamente.
— Jake Wharton

2
@JakeWharton, por favor dinos cómo hacerlo correctamente, entonces.
— JesperB

Crea tu propia dimensión para no depender 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

El Resumen de la clase suele ser un buen lugar para comenzar. Creo que el método getHeight () debería ser suficiente.

EDITAR:

Si necesita el ancho, debe ser el ancho de la pantalla (¿verdad?) Y eso se puede reunir de esta manera .


2
Extraño - getHeight () resulta en cero.
— Eugene

1
En mi desarrollo, noté que devuelve cero en onResume (). Pase el mouse al llamar a getActionBar (). GetHeight () cuando realmente lo necesite, devuelve un valor positivo> 0.
— Tos

@tos la especificación para getHeight () dice que devuelve el ancho actual de ActionBar, que probablemente sea 0 cuando se crea la vista
— Nombre para mostrar

0

En mi Galaxy S4 que tiene> 441 ppp> 1080 x 1920> Obtener la altura de la barra de acción con getResources (). GetDimensionPixelSize Obtuve 144 píxeles.

Usando la fórmula px = dp x (dpi / 160), estaba usando 441 ppp, mientras que mi dispositivo
pertenece a la categoría 480 ppp. poner eso confirma el resultado.


0

Lo hice de esta manera por mí mismo, este método auxiliar debería ser útil para alguien:

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.