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_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.
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.
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) ...
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);
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.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
?attr/actionBarSizesi 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;
}