【问题标题】:How to manage the width of ActionBar navigation tabs?如何管理 ActionBar 导航选项卡的宽度?
【发布时间】:2014-05-22 04:37:52
【问题描述】:

我正在使用 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>

【问题讨论】:

标签: android android-actionbar actionbarsherlock


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 谢谢杰克。不幸的是,即使我删除了所有样式,带有短文本的选项卡仍然有很多填充,在我的场景中,填充导致选项卡水平滚动。在屏幕截图中,实际上右侧还有另一个选项卡,不可见。这实际上是问题所在,通过减少带有短文本标题的选项卡上的填充来停止选项卡滚动。我没有看到任何文本换行,但我想减少填充而不是让它换行。没错,这是 ICS,在 Galaxy Nexus 上,所以我认为这是本机问题,而不是 ABS 问题。
  • 很遗憾,不知道该告诉你什么。我不记得太多选项卡代码及其样式。我只知道它会根据一些条件修改孩子,以便以特殊的方式布置它们。抱歉,我无法提供更多帮助。
【解决方案2】:

您好像只是在使用 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>

【讨论】:

    【解决方案3】:

    在项目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 中不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多