Android: Split ActionBar altura del padre real

Utilizo la barra de acción (origen androide, no ABS) y posiciono mis vistas relativamente en el diseño raíz ( RelativeLayout ). Para calcular la posición relativa en la pantalla utilicé los getParent().getHeight() / getParent().getWidth() de mi vista. Con la ActionBar normal funciona bien. Obtengo la altura real del padre (altura de la actividad – altura de la barra de acción, por ejemplo 690px en la pantalla de 800 píxeles). Pero si uso la opción splitActionBarWhenNarrow y la barra inferior se muestra, obtengo la misma altura del padre (por ejemplo, 690px en la pantalla de 800px). Por lo tanto, algunas de mis ventanas posicionadas mediante programación están bajo la barra de acción inferior.

¿Cómo puedo obtener la altura real del padre, sin las barras de acción?

Editar:

Leo el ancho y la altura de los onWindowFocusChanged en el método onWindowFocusChanged de la actividad.

Tanto la barra de acción superior como la inferior son de la misma altura. Por lo que sé, no puede solicitar el tamaño de la barra de acción mediante programación. Esta publicación da un ejemplo de cómo establecer la altura de la barra de acción con un estilo para que sea coherente.

Para determinar si se ha dividido o no la barra de acción, debe calcularla manualmente. Según las pautas del diseño (cerca de la parte inferior)

¿Cuántas acciones caben en la barra de acción principal? La capacidad de la barra de acción se controla mediante las siguientes reglas:

  • Los botones de acción en la barra de acción principal no pueden ocupar más del 50% del ancho de la barra. Los botones de acción de las barras de acción inferiores pueden utilizar todo el ancho.
  • El ancho de la pantalla en píxeles independientes de la densidad (dp) determina el número de elementos que caben en la barra de acción principal:

  • más pequeño que 360 ​​dp = 2 iconos

  • 360-499 dp = 3 iconos

  • 500-599 dp = 4 iconos

  • 600 dp y mayor = 5 iconos

Ejemplo: tabla de ejemplos

Así que quieres hacer algo como esto.

 DisplayMetrics displayMetrics = new DisplayMetrics(); Display display = getWindowManager().getDefaultDisplay(); display.getMetrics(displayMetrics); float density = displayMetrics.density; // width in dp float width = (displayMetrics.widthPixels / density); // I will assume you have 3 action bar icons if (width < 360) { // 2 menu items fit. // Calculate action bar height with 2*(actionbar height) // to accommodate the bottom action bar. } else { // 3+ menu items fit // Calculate action bar height with 1*(actionbar height). } 

¿Y cómo puedo detectar si la barra de acción está dividida o no?

Sencillo. Utiliza valores booleanos. Por defecto, tendrás una ActionBar dividida si el ancho de la pantalla es menor que 400dp. Ya hay uno declarado (que es el que utiliza la ActionBar para determinar si se trata de un dispositivo de teléfono o una tableta). Si está orientado a Android HC +, puede acceder al valor predeterminado de ActionBars: android.R.bool.split_action_bar_is_narrow , si está utilizando ActionBarSherlock: R.bool.abs_split_action_bar_is_narrow . Encontrado aquí para el ActionBar por defecto, aquí su ABS.

Ahora puede acceder al valor booleano de la siguiente manera:

 boolean isActionBarSplitted = getResources().getBoolean(R.bool.split_action_bar); if(isActionBarSplitted){ // Parent height - SplitActionBar height } else{ // No Split ActionBar } 

Tenga en cuenta que android.R.bool.split_action_bar_is_narrow es un recurso interno, por lo que tiene que hacerlo funcionar como se describe aquí .

  • ¿Qué carpetas de diseño son necesarias para admitir todos los dispositivos Android?
  • Listview error: "Su contenido debe tener un ListView cuyo atributo id es 'android.R.id.list'"
  • Alinear los controles uno junto al otro en un diseño relativo
  • ¿Por qué el título no está centrado en la barra de herramientas?
  • El pie de página sube cuando se muestra el teclado
  • Android: configurar el diseño de fondo de forma programática
  • RelativeLayout dentro de LinearLayout?
  • Uso de layout_above en un RelativeLayout
  • ¿Qué es android: layout_alignLeft en Android?
  • RelativeLayout refresh after view.setVisibility (View.GONE) y view.setVisibility (View.VISIBLE)
  • ¿Puedo configurar "android: layout_below" en tiempo de ejecución, de forma programática?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.