17

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

在此处输入图像描述

正如您在下面看到的,我尝试了一种蛮力方法,通过在几种样式上设置各种属性,但我还没有成功。

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

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

3 回答 3

11

从该屏幕截图看起来您正在 ICS 上进行测试,这很好,因为您将观察本机操作栏的行为,而不是认为这是 ActionBarSherlock 的错误。

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

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

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

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

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

于 2012-03-16T16:46:34.907 回答
1

看来您只是在使用 ActionBarSherlock 4.0 之前的 android 模式的主题?

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

镜像属性

由于 Android 主题系统的限制,任何主题自定义都必须在两个属性中声明。普通的 android-prefixed 属性将主题应用于本机操作栏,unprefixed 属性用于自定义实现。由于两个主题 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>
于 2012-07-05T12:42:39.307 回答
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 中的代码可以正常工作,但在 android 4.4 中不起作用。

于 2014-05-21T20:37:52.280 回答