2012-03-16 14 views
17

Estoy usando ActionBarSherlock y tengo una barra de acciones con pestañas de navegación en ella. Quiero que las pestañas se dimensionen automáticamente en función del tamaño del texto que contienen, pero parece que hay un estilo o una configuración en alguna parte que les obliga a usar un tamaño mínimo. Entonces, por ejemplo, en la captura de pantalla, la pestaña "Pestaña muy larga" no tiene relleno (de acuerdo con el estilo que apliqué) pero las pestañas marcadas con "T" tienen una gran cantidad de relleno, a pesar de que ajuste el relleno a 0dp.¿Cómo administrar el ancho de las pestañas de navegación de ActionBar?

enter image description here

Como se puede ver a continuación He intentado un enfoque de fuerza bruta mediante el establecimiento de varios atributos en varios estilos, pero no he tenido éxito todavía.

¿Cómo controlo el relleno/ancho en las pestañas de la barra de acciones?

<style 
    name="CustomActivity" 
    parent="@style/Theme.Sherlock" 
    > 
    <item name="actionBarTabStyle">@style/customActionBarTabStyle</item> 
    <item name="actionBarTabBarStyle">@style/customActionBarTabBarStyle</item> 
    <item name="actionBarTabTextStyle">@style/customActionBarTabTextStyle</item> 
</style> 

<style name="customActionBarTabStyle" parent="style/Widget.Sherlock.ActionBar.TabView"> 
    <item name="android:background">@drawable/tab_indicator</item> 
    <item name="android:paddingLeft">0dp</item> 
    <item name="android:paddingRight">0dp</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:minWidth">0dp</item> 
</style> 

<style name="customActionBarTabBarStyle" parent="style/Widget.Sherlock.ActionBar.TabBar"> 
    <item name="android:paddingLeft">0dp</item> 
    <item name="android:paddingRight">0dp</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:minWidth">0dp</item> 
</style> 

<style name="customActionBarTabTextStyle" parent="style/Widget.Sherlock.ActionBar.TabText"> 
    <item name="android:paddingLeft">0dp</item> 
    <item name="android:paddingRight">0dp</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:minWidth">0dp</item> 
</style> 
+0

de pago: [¿Cómo hacer de Andorid Barra de acciones/TabWidget LinearLayout para envolver es los niños] [1] [1]: http://stackoverflow.com/questions/28024127/how-to-make- andorids-actionbar-tabwidget-linearlayout-to-wrap-its-children/28223519 # 28223519 – Lewapq

Respuesta

11

A partir de ese tiro de la pantalla parece que se está probando en ICS lo cual es bueno ya que va a observar el comportamiento de la barra de acción nativa en lugar de pensar que es un error con ActionBarSherlock.

Básicamente, la barra de acciones intentará expandir las pestañas para ocupar la misma cantidad de espacio si hay suficiente espacio para hacerlo, a fin de proporcionar una apariencia más limpia cuando solo hay unas pocas pestañas.

Al establecer el relleno actionBarTabTextStyle en cero, en realidad empeora el problema ya que ahora el texto en la primera pestaña no tiene nada a su alrededor para evitar que toque los divisores y el borde de la pantalla. Si aumenta el relleno (o lo devuelve al valor predeterminado), debe ver una de estas dos cosas:

  1. El texto se ajustará a dos líneas.
  2. La barra de pestañas convertirá pestañas simplemente para que sean tan anchas como su contenido y permitan el desplazamiento horizontal.

Me inclino a pensar que lo primero ocurrirá debido a los anchos muy delgados de la segunda a la cuarta pestaña. Desafortunadamente, así es como se comporta la barra de pestañas y solo debemos tratar de acomodar su comportamiento en consecuencia.

Si es posible, intente crear etiquetas de pestaña que tengan un ancho más unificado que probablemente active el segundo estado mencionado anteriormente. Siga probando con ICS para asegurarse de que el comportamiento que está viendo proviene de la plataforma y, luego, cuando se ejecuta en pre-ICS, debe obtener el mismo comportamiento de la biblioteca.

+1

Gracias Jake. Desafortunadamente, incluso cuando arranco todos mis estilos, las pestañas con texto corto aún tienen una gran cantidad de relleno, y en mi caso, ese relleno hace que las pestañas se desplacen horizontalmente. En la captura de pantalla, en realidad, hay otra pestaña a la derecha, no visible. Ese es realmente el problema, para detener el desplazamiento de las pestañas al reducir el relleno en pestañas con títulos cortos de texto. No he visto ningún ajuste de texto, aunque quiero reducir el relleno y no permitir que se enrolle. tienes razón en que se trata de ICS, en un Galaxy Nexus, así que creo que es un problema nativo en lugar de un problema de ABS. –

+0

No estoy seguro de qué decir por desgracia. No recuerdo mucho del código de pestaña ni sus estilos. Solo sé que modifica a los niños según algunas condiciones para poder diseñarlos de una manera especial. Lo siento, no podría ser de más ayuda. –

1

Parece que solo está utilizando el tema para el modo Android pre 4.0 de ActionBarSherlock?

De http://actionbarsherlock.com/theming.html:

espejo Atributos

Debido a las limitaciones en el sistema de tematización Android ningún tema personalizaciones se debe declarar en dos atributos. Los atributos android-prefixed normales aplican el tema a la barra de acciones nativa y los atributos no prefijados son para la implementación personalizada. Dado que ambas API de temas son exactamente iguales, solo necesita hacer referencia a sus personalizaciones dos veces en lugar de tener que implementarlas dos veces.

La manera más fácil de transmitir exactamente lo que esto conlleva es con un ejemplo . El siguiente es el tema completo del ejemplo con “estilo” mencionado anteriormente:

<style name="Theme.Styled" parent="Theme.Sherlock.Light.DarkActionBar"> 
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item> 
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item> 
</style> 

<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse"> 
    <item name="background">@drawable/bg_striped</item> 
    <item name="android:background">@drawable/bg_striped</item> 

    <item name="backgroundSplit">@drawable/bg_striped_split</item> 
    <item name="android:backgroundSplit">@drawable/bg_striped_split</item> 
</style> 
1

Ignorar esta clase de proyecto ActionBarSherlock ./ActionbarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    Re-measure if we went beyond our maximum size. 
    if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { 

     //do nothing , override by me for ActionBarTabs not rezize never 

    } 
} 

código original de

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    // Re-measure if we went beyond our maximum size. 
    if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { 
     super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY), 
       heightMeasureSpec); 
    } 
} 

Cuando se ejecuta, el código de Android 2.3.3 funciona bien cuando mis pestañas no tienen línea rota, pero en Android 4.4 no funciona.

Cuestiones relacionadas