Respuestas:
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:
@dimen/abc_action_bar_default_height
directamente (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-land
cuando está en modo horizontal. Hacer referencia al atributo en su lugar funciona como un encanto.
android.R.attr.actionBarSize
se resolverá en tamaño 0 en dispositivos anteriores a 3.0. Entonces, al usar ActionBarCompat
uno, se apegaría a él en su android.support.v7.appcompat.R.attr.actionBarSize
lugar.
De las fuentes descompiladas de Android 3.2 framework-res.apk
, res/values/styles.xml
contiene:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0 y 3.1 parecen ser lo mismo (al menos desde AOSP) ...
Para obtener la altura real de la barra de acción, debe resolver el atributo actionBarSize
en tiempo de ejecución.
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
Una de las muestras de Honeycomb se refiere a ?android:attr/actionBarSize
?attr/actionBarSize
(tenga en cuenta la falta de espacio de nombres de Android) que funciona en todos los niveles de API.
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.
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
Con la nueva biblioteca de soporte v7 (21.0.0) el nombre en R.dimen
ha 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
?attr/actionBarSize
si uno está buscando igualar a un regular ActionBar
.
Si está utilizando ActionBarSherlock, puede obtener la altura con
@dimen/abs__action_bar_default_height
abs__
recursos prefijados directamente.
La respuesta de @ AZ13 es buena, pero según las pautas de diseño de Android , la ActionBar debe tener al menos 48dp de altura .
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;
}
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 .
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.
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;
}