2012-08-22 16 views
5

Estoy usando la función de pestaña ActionBar con un PageViewer, pero me sale un problema. En mi Nexus 7, las pestañas muestran así:Cómo forzar la división de la pestaña y el título/Inicio/Menú de ActionBar?

On Nexus 7

Se puede ver el título se corta debido a la falta de espacio. Pero en HTC Incredible S con Android 4.0 se muestra como:

enter image description here

Y esto es lo que quiero. Sin embargo, quiero que la barra de pestañas se coloque en la parte inferior de la pantalla, pero es aceptable dividirla en dos filas y ambas en la parte superior.

¿Alguien sabe cómo forzar la aplicación en Nexus 7 también divide la barra de pestañas en otra fila? ¡Gracias!

Respuesta

15

AFAIK, la barra de acciones solo decide si colocar las pestañas en una segunda fila o no, y no podemos influir en eso.

Además, tenga en cuenta que, en muchos casos, sus pestañas no aparecerán en absoluto, reemplazadas por una lista desplegable; básicamente, Android convierte la navegación de pestañas para mostrar la navegación.

Si desea asegurarse de que sus pestañas son siempre las pestañas, y están siempre por debajo de la barra de acción, retire las lengüetas de la barra de acción y pasar a utilizar un ViewPager para su contenido, ya sea con PagerTabStrip (del paquete androide de la ayuda , de donde viene ViewPager) o el indicador de pestañas del proyecto ViewPagerIndicator para las pestañas. Como beneficio adicional, ahora sus contenidos se pueden deslizar horizontalmente para moverse entre pestañas, lo cual es un enfoque popular hoy en día.

I en factr quieren que la barra de pestañas se coloca en la parte inferior de la pantalla, aunque

Por favor tener en cuenta que esto viola las directrices de diseño de Android: http://developer.android.com/design/patterns/pure-android.html

-1

no hay manera, para evitar pestañas para convertirse en spinner configura el modo de navegación después de agregar las pestañas

1

Si necesita admitir teléfonos y tabletas y no desea utilizar una implementación por separado, puede poner esto en su actividad:

@Override 
public Resources getResources() { 
    if (mResourcesImpl == null) { 
     mResourcesImpl = new ResourcesImpl(super.getResources()); 
    } 
    return mResourcesImpl; 
} 

class ResourcesImpl extends Resources { 
    private Resources mResources; 
    private Set<Integer> mActionBarEmbedTabsIds = new HashSet<Integer>(); 

    ResourcesImpl(Resources resources) { 
     super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration()); 

     mResources = resources; 

     String packageName = getPackageName(); 
     mActionBarEmbedTabsIds.add(mResources.getIdentifier("abc_action_bar_embed_tabs", "bool", packageName)); 
     mActionBarEmbedTabsIds.add(mResources.getIdentifier("abc_action_bar_embed_tabs_pre_jb", "bool", packageName)); 
     mActionBarEmbedTabsIds.add(mResources.getIdentifier("action_bar_embed_tabs", "bool", "android")); 
     mActionBarEmbedTabsIds.add(mResources.getIdentifier("action_bar_embed_tabs_pre_jb", "bool", "android")); 
     mActionBarEmbedTabsIds.remove(0); 
    } 

    @Override 
    public boolean getBoolean(int id) throws NotFoundException { 
     if (mActionBarEmbedTabsIds.contains(id)) { 
      return areActionBarTabsEmbed(); // stacked ot embed goes here 
     } 
     return super.getBoolean(id); 
    } 
} 
7

Utilizo esto para forzar las pestañas apiladas o no apiladas de ActionBar de Gingerbread a KitKat.

Modded Desde: http://www.blogc.at/2014/01/23/android-tabs-appear-above-or-below-actionbar/

http://i.imgur.com/fO0Vk3V.png

setHasEmbeddedTabs(mActionbar,false); 

    public static void setHasEmbeddedTabs(Object inActionBar, final boolean inHasEmbeddedTabs) 
    { 
     // get the ActionBar class 
     Class<?> actionBarClass = inActionBar.getClass(); 

     // if it is a Jelly Bean implementation (ActionBarImplJB), get the super class (ActionBarImplICS) 
     if ("android.support.v7.app.ActionBarImplJB".equals(actionBarClass.getName())) 
     { 
      actionBarClass = actionBarClass.getSuperclass(); 
     } 

     // if Android 4.3 > 
     if ("android.support.v7.app.ActionBarImplJBMR2".equals(actionBarClass.getName())){ 
      actionBarClass = actionBarClass.getSuperclass().getSuperclass(); 
     } 

     try 
     { 
      // try to get the mActionBar field, because the current ActionBar is probably just a wrapper Class 
      // if this fails, no worries, this will be an instance of the native ActionBar class or from the ActionBarImplBase class 
      final Field actionBarField = actionBarClass.getDeclaredField("mActionBar"); 
      actionBarField.setAccessible(true); 
      inActionBar = actionBarField.get(inActionBar); 
      actionBarClass = inActionBar.getClass(); 
     } 
     catch (IllegalAccessException e) {} 
     catch (IllegalArgumentException e) {} 
     catch (NoSuchFieldException e) {} 

     try 
     { 
      // now call the method setHasEmbeddedTabs, this will put the tabs inside the ActionBar 
      // if this fails, you're on you own <img class="wp-smiley" alt=";-)" src="http://www.blogc.at/wp-includes/images/smilies/icon_wink.gif"> 
      final Method method = actionBarClass.getDeclaredMethod("setHasEmbeddedTabs", new Class[] { Boolean.TYPE }); 
      method.setAccessible(true); 
      method.invoke(inActionBar, new Object[]{ inHasEmbeddedTabs }); 
     } 
     catch (NoSuchMethodException e)  {} 
     catch (InvocationTargetException e) {} 
     catch (IllegalAccessException e) {} 
     catch (IllegalArgumentException e) {} 
    } 
+0

Esto funciona muy bien! Quería señalar que debe recordarse sobre los cambios de orientación. –

Cuestiones relacionadas