2012-04-11 11 views
9

Tengo un MapView con una barra de acción accionada por ActionBarSherlock. La barra de acciones está dividida (en pantallas "estrechas") y superpuesta/semitransparente (android: windowActionBarOverlay es verdadero). Más o menos como la aplicación Google Maps.Determinar si la barra de acciones está dividida

Ahora me gustaría enviar vistas en la parte superior del mapa, en la parte inferior de la pantalla, manteniéndola encima de la barra de acciones inferior. Mi problema aquí es que no sé la altura de la barra de acción inferior. Francamente, ni siquiera puedo encontrar una manera de saber si está dibujado o no. getHeight() parece devolver la altura de la barra de acciones superior (o tal vez es la altura de ambos, pero todavía no sé si la barra de acción inferior existe o no.

Por favor, dime esta información está en frente a mis ojos!

Respuesta

2

la barra inferior debe coincidir con la altura de la barra de acción regular. por lo tanto, el uso de ?android:attr/actionBarSize (o en el caso de ActionBarSherlock ?attr/actionBarSize) para la altura en XML o getResources().getDimensionPixelSize(R.attr.actionBarSize) en el código debería ser suficiente.

editar:

Er, en una segunda lectura de su pregunta, parece estar más centrado en determinar también si existe o no la barra de acción dividida.

Es posible que desee leer estas respuestas y los comentarios de seguimiento de Adam Powell, la acción barra de Guru:

+0

Sí, también necesito saber si existe. De todos modos, me dijeron (creo Roman) en las horas de oficina de Android que esto simplemente no era posible. Al menos no de una manera fácil y directa. Por lo tanto, ahora estamos experimentando con una única barra de acción superior y, en cambio, imitamos la barra de acciones inferior con una vista normal. Esto resuelve no solo este problema sino también otro en el que queríamos "forzar" algunas acciones a la barra de acciones superior. – pakerfeldt

3

me encontré con el mismo problema. En dispositivos telefónicos en modo retrato, la barra de acciones está dividida. Así que los elementos del menú se encuentran en la barra de acciones superior y las pestañas en una segunda barra de acción (tabbar) a continuación. Simplemente no encontré ninguna manera posible de determinar la altura de la barra de acciones: para ver qué espacio queda en la pantalla antes de construir mi pantalla.

por lo que hice una suposición:

  • en dispositivos ScreenSize pequeñas y normales de la barra de acción se divide en modo vertical
  • en dispositivos grandes ScreenSize (como el Nexus 7) de la barra de acción también se divide en modo vertical
  • en dispositivos ScreenSize XLarge (comprimidos) de la barra de acción no se divide en modo vertical

Así que distinguen a los diferentes tamaños de pantalla y ha creado un recurso bool

<!-- res/values/booleans.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_split_actionbar">false</bool> 
</resources> 

<!-- res/values-small-port/booleans.xml 
    res/values-normal-port/booleans.xml 
    res/values-large-port/booleans.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_split_actionbar">true</bool> 
</resources> 

En el código que acceder al valor de esta manera:

Boolean isSplit = getResources().getBoolean(R.bool.is_split_actionbar); 

para obtener la altura actionbar en el onCreateView() Método:

TypedValue typedVal = new TypedValue(); 
getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, typedVal, true); // use android.R when not using ABS 
int actionBarHeight = getResources().getDimensionPixelSize(typedVal.resourceId); 

Y el doble de la altura si el actionbar está dividido:

if(isSplit) 
    actionBarHeight = actionBarHeight * 2; 

No es una solución ideal, pero para mí esto funciona.

+0

Respuesta más cercana a una solución. –

+2

Me parece que esta suposición se basa en una premisa falsa: mi barra de acción se divide en un Nexus 4, pero no en un Nexus 7. –

+0

No está dividido en el emulador Nexus 7 API 25 Android Studio también. – isabsent

5

Si está utilizando ActionBarSherlock se puede buscar el valor booleano abs__split_action_bar_is_narrow

Basta con crear un método estático en el que puede hacer

return ResourcesCompat.getResources_getBoolean(context, 
          R.bool.abs__split_action_bar_is_narrow); 

es necesario utilizar el ResourcesCompat (de ActionBarSherlock) clase porque pre 3.2 no puede leer carpetas con métricas (como valores-sw480)

+0

¿Funcionará esto aún en API 3.1 +? es decir, si ActionBarSherlock realmente está utilizando la barra de acción nativa? –

+0

@CarlosP Sí, funcionó en un Galaxy Nexus 4.2.2 –

+0

Gracias por informarnos, agradecerlo, espero que ayude a otros usuarios. –

Cuestiones relacionadas