2012-03-16 89 views
17

我正在使用ActionBarSherlock并在其中包含导航选项卡的ActionBar。我希望标签根据文本大小自动调整大小,但似乎有某种风格或设置强制它们使用最小尺寸。因此,例如在屏幕截图中,“Very Long Tab”选项卡没有填充(与我应用的样式一致),但标记为“T”的选项卡有很多填充,尽管我将填充设置为0dp。如何管理ActionBar导航标签的宽度?

enter image description here

正如你可以看到下面我试着通过几种风格设置各种属性的蛮力方法,但我没有成功。

如何控制操作栏选项卡中的填充/宽度?

<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

结帐:如何使的Andorid的动作条/ TabWidget的LinearLayout来包装它的儿童] [1] [1]:http://stackoverflow.com/questions/28024127/how-to-make- andorids-actionbar-tabwidget-linearlayout-to-wrap-its-children/28223519#28223519 – Lewapq 2015-01-30 11:30:19

回答

11

从该屏幕截图看起来你是在ICS这是很好的,因为你会观察到本机操作栏的行为,而不是认为这是ActionBarSherlock一个bug测试。

基本上,如果有足够的空间来操作,操作栏将尝试扩展标签以占用相等的空间量,以便在只有少数标签时提供更清晰的外观。

通过将​​填充设置为零,实际上使问题变得更加严重,因为现在第一个选项卡中的文本没有任何内容来阻止它与分隔符和屏幕边缘接触。如果您增加填充(或将其恢复为默认值),您应该看到以下两种情况之一:

  1. 该文本将包装为两行。
  2. 标签栏将标签转换为与其内容一样宽,并允许水平滚动。

我倾向于认为前者会因第二至第四个标签的宽度非常薄而发生。不幸的是,这只是标签栏的行为方式,我们需要试着相应地适应其行为。

如果可能,请尝试创建具有更统一宽度的选项卡标签,这可能会触发上述第二种状态。继续使用ICS进行测试,以确保您看到的行为来自平台,然后在ICS上运行时,您应该从库中获得相同的行为。

+1

谢谢杰克。不幸的是,即使我撕掉了我的所有样式,短文本的标签仍然有很多填充,并且在我的场景中,填充会导致标签水平滚动。在屏幕截图中,实际上还有另一个标签在右侧,不可见。这实际上是问题,通过减少短文本标题上的填充来停止选项卡滚动。我还没有看到任何文字换行,尽管我想减少填充而不让它换行。你是对的,这是ICS,在Galaxy Nexus上,所以我认为这是一个本地问题,而不是ABS问题。 – 2012-03-16 17:00:15

+0

不知道什么可以告诉你。我不记得很多标签代码和它的样式。我只知道它根据几个条件修改了孩子,以便以特殊的方式进行布置。对不起,我无法提供更多帮助。 – 2012-03-16 22:57:21

1

似乎你只是使用ActionBarSherlock的前4.0 Android模式的主题?

http://actionbarsherlock.com/theming.html

镜像的属性

由于任何主题 自定义必须在两个属性来宣布Android的主题化系统的限制。正常的 android-prefixed属性将主题应用于本机操作栏 ,并且前缀的属性用于自定义实现。由于 这两个主题API完全相同,因此只需要两次引用您的 自定义设置,而不必实施两次。

最简单的表达方法是用 示例来表达。以下是从“病急乱投医”例如 充分主题上面提到的:

<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

重写此类项目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 

    } 
} 

原始代码

@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); 
    } 
} 

运行时,该代码android 2.3.3在我的Tabs没有折行的时候工作的很好,但是在android 4.4中不起作用。