Las pestañas de navegación de Android ActionBar parecen diferentes en teléfonos y tabletas

¿Es posible que las pestañas de navegación de ActionBar se muestren iguales en teléfonos y tabletas?

Vea las imágenes para teléfonos y tablets a continuación:

TELÉFONO: Imagen del teléfono

TABLETA: Tableta

La documentación de Android indica "… cuando la pantalla es lo suficientemente amplia, las pestañas aparecen en la barra de acción junto a los botones de acción …". No queremos que aparezcan en ActionBar . ¿Alguna solución?

Las pestañas ActionBar son creadas por ScrollingTabContainerView . El ActionBarView , la View real de la ActionBar , contiene un método ActionBarView.setEmbeddedTabView que es esencialmente responsable de la colocación de las pestañas debajo o incrustadas en ActionBar .

Cuando la ActionBar se inicializa en Activity , utiliza la ActionBarPolicy para determinar cuándo usar las pestañas incrustadas basadas en un valor boolean definido como true en los recursos del sistema , pero false en el modo vertical . Por lo tanto, en esta inicialización se llama ActionBarImpl.setHasEmbeddedTabs para determinar dónde colocar las fichas. Y también, como dicen los docs:

… cuando la pantalla es suficientemente ancha las pestañas aparecen en la barra de acción junto a los botones de acción

Entonces, ¿cómo puedo dejar de incrustar las pestañas?

Parece que tienes dos opciones aquí y una es claramente, al menos para mí, mejor que la otra.

  1. Puede utilizar la reflexión para invocar ActionBarImpl.setHasEmbeddedTabs y configurarlo para que siempre sea false . Es necesario utilizar la reflexión porque ActionBarImpl es una clase interna y no hay un método ActionBar público para indicar cuándo incrustar pestañas.

  2. Puede dejar de usar la API de ActionBar.Tab y cambiar a una alternativa, como Google SlidingTabLayout . Esto le requerirá usar un ViewPager , que es generalmente una ventaja agradable al usar las lengüetas de todos modos y usted puede incluso utilizarla ya.

Aquí hay ejemplos para ambos:

Uso de la reflexión

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ActionBar actionBar = getActionBar(); // Implement your tabs ... try { final Class<?> clazz = actionBar.getClass(); final Method embedTabs = clazz.getDeclaredMethod("setHasEmbeddedTabs", boolean.class); embedTabs.invoke(actionBar, false); } catch (final Exception ignored) { // Nothing to do } } 

Resultados de la reflexión

Ejemplo

Cambio de las pestañas fijas a las pestañas desplazables

Para usar SlidingTabLayout de Google, necesitará copiar más de dos clases en su proyecto. Las clases que necesitas son:

  • SlidingTabLayout
  • SlidingTabStrip

Un ejemplo de diseño que implemente el SlidingTabLayout vería así:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <your_path_to.SlidingTabLayout android:id="@+id/slidingTabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> 

Después de inflar el diseño e inicializar el SlidingTabLayout con View.findViewById , llama a SlidingTabLayout.setViewPager para vincular ViewPager a las pestañas.

Echa un vistazo al ejemplo de Google para un proyecto completo

Resultados de la pestaña desplazable

Las pestañas desplazables se utilizan en varias aplicaciones de Google, como Play Store y Play Music. Para un breve video que demuestra, si no está familiarizado, echa un vistazo a los documentos de diseño de Android en las pestañas .

Conclusión

En resumen, yo recomendaría usar pestañas desplazables en lugar de pestañas fijas (al menos en modo horizontal), si no desea que se incrusten.

  • Número de pestañas en ActionBar
  • Android 4.2.2 hace que el icono de la barra de acción y el título se puedan hacer clic como si formaran parte del mismo botón
  • App: showAsAction vs android: showAsAction
  • Uso del generador de estilo Action bar con generador de colores holo
  • Activar / desactivar dinámicamente ocultar / mostrar el icono de acción de Android ActionBar
  • ¿Cómo se elimina el texto del título de la Android ActionBar?
  • Cambiar los iconos en ActionBar dinámicamente
  • Ocultar sólo la barra de acciones en las pestañas de la barra de acción de desplazamiento no
  • Mostrar el botón de arriba / atrás en android anidado PreferenceScreen?
  • Cambiar el color de fondo de ActionBar en el código de la lista de navegación
  • Android (3.0) La barra de acción no quiere ir
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.