如何管理ActionBar导航标签的宽度?

时间:2012-03-16 15:35:46

标签: android android-actionbar actionbarsherlock

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

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>

3 个答案:

答案 0 :(得分:11)

从那个屏幕截图看起来你正在测试ICS这是好事,因为你将观察本机操作栏的行为,而不是认为它是ActionBarSherlock的错误。

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

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

  1. 文字将换成两行。
  2. 标签栏会将标签转换为与其内容一样宽,并允许水平滚动。
  3. 我倾向于认为前者会因第二到第四个标签的宽度非常薄而发生。不幸的是,这只是标签栏的行为方式,我们需要相应地尝试适应其行为。

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

答案 1 :(得分:1)

似乎你只是在ActionBarSherlock的pre 4.0 android模式下使用主题?

来自http://actionbarsherlock.com/theming.html

  

镜像属性

     

由于Android主题系统的限制任何主题   必须在两个属性中声明自定义。正常   android-prefixed属性将主题应用于本机操作栏   并且未加前缀的属性用于自定义实现。以来   两个主题API完全相同,您只需参考您的   自定义两次,而不是必须两次实现。

     

最准确地传达这一点的方法是使用   例。以下是“Styled”示例中的完整主题   如上所述:

<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>

答案 2 :(得分: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中不起作用。