¿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
AZ13
fuente
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) ...

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

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

Vikram Bodicherla
fuente
3
Sí, explicado aquí: developer.android.com/guide/topics/ui/…
Puntero nulo el
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.

Manfred Moser
fuente
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

matriz defectuosa
fuente
16

Con la nueva biblioteca de soporte v7 (21.0.0) el nombre en R.dimenha cambiado a @ dimen / abc_action_bar_default_height_ material .

Al actualizar desde una versión anterior de la biblioteca de soporte, debe utilizar ese valor como la altura de la barra de acción

MrMaffen
fuente
1
¡Perfecto! Esto seguramente supera ?attr/actionBarSizesi uno está buscando igualar a un regular ActionBar.
karllindmark 01 de
9

Si está utilizando ActionBarSherlock, puede obtener la altura con

@dimen/abs__action_bar_default_height
JesperB
fuente
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;
}
MD Enamul Haque
fuente
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 .

Mate
fuente
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.

Mahoma
fuente
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;
}
Min2
fuente