如何设计冰淇淋三明治标签之间的分隔线?

时间:2012-02-07 07:32:27

标签: android android-tabs

我使用以下样式和一组九个补丁图像在一些Ice Cream Sandwich选项卡底部创建一条红线,而不是标准蓝线:

<style name="customTabStyle" parent="@android:style/Widget.Holo.ActionBar.TabBar">
    <item name="android:tabStripLeft">@null</item>
    <item name="android:tabStripRight">@null</item>
    <item name="android:tabStripEnabled">false</item>
    <item name="android:showDividers">none</item>
    <item name="android:measureWithLargestChild">true</item>
    <item name="android:background">@drawable/tab_line</item>
    <item name="android:gravity">center</item>
</style>

<style name="customTabBar" parent="@android:style/Widget.Holo">
    <item name="android:showDividers">middle</item>
    <item name="android:divider">@drawable/divider2</item>
    <item name="android:dividerPadding">0dp</item>
</style>

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    <item name="android:actionBarTabStyle">@style/customTabStyle</item>
    <item name="android:actionBarTabBarStyle">@style/customTabBar</item>
</style>

显示红线,除了标签之间的分隔线外,每条线看起来都很好。 正如您在图像中的绿色框内看到的那样,线条未在分隔线下方绘制。 如何为此分隔符选择可绘制或样式?

android:dividerandroid:showDividers项不对标签之间的分隔符负责。它们仅选择在选项卡图标和选项卡标题之间绘制的分隔符。我隐藏了那些分隔线,因为没有标题,分隔线看起来很奇怪。

Screenshot from the resulting tab bar


更新考虑到Aneal的回答,我添加了第二个样式customTabBar。样式选择drawable作为分隔符。分隔线是一条黑色实线,使用以下9patch drawable创建:

9patch drawable creating the divider

使用此drawable绘制分隔符,但旁边还有一个空行:

tab bar with dividers

6 个答案:

答案 0 :(得分:51)

删除我使用的每个样式后,我得到了以下图像:

enter image description here

此图像还包含小间隙。因此,这似乎是某种默认行为。

但是我找到了解决问题的方法。我将红线设置为整个标签栏的标准背景。这样就出现了间隙,但是没有人能够看到它,因为已经显示已经包含该线的背景。

我现在使用以下样式进行所有活动:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    <item name="android:actionBarTabBarStyle">@style/customTabBar</item>
    <item name="android:actionBarTabStyle">@style/customTabStyle</item>
</style>

此样式用于设置标签栏中每个标签的样式:

<style name="customTabStyle" parent="@android:style/Widget.Holo.ActionBar.TabView">
    <item name="android:showDividers">none</item>
    <item name="android:measureWithLargestChild">true</item>
    <item name="android:background">@drawable/tab_line</item>
    <item name="android:gravity">center</item>
</style>

要设置整个Tabbar的样式,请使用以下样式:

<style name="customTabBar" parent="@android:style/Widget.Holo.ActionBar.TabBar">
    <item name="android:showDividers">middle</item>
    <item name="android:divider">@drawable/divider</item>
    <item name="android:dividerPadding">0dp</item>
    <item name="android:background">@drawable/tab_unselected</item>
</style>

此样式定义我的自定义分隔符,并定义标签栏的背景。作为背景,我直接设置了如果未选择选项卡而绘制的九个补丁绘图。 所有这一切的结果是一个带有红色下划线的tabbar,没有任何间隙。

enter image description here

答案 1 :(得分:22)

你走了。

<style name="YourTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarTabBarStyle">@style/Divider</item>
</style>

<style name="Divider" parent="@android:style/Widget.Holo.ActionBar.TabBar">
    <item name="android:divider">@drawable/your_divider_drawable_here</item>
    <item name="android:showDividers">middle</item>
    <item name="android:dividerPadding">12dip</item>
</style>

答案 2 :(得分:8)

<style name="AppTheme" parent="AppBaseTheme">
    <item>......
    </item>
    <item name="android:actionBarDivider">@null</item>

</style>

这里@null是不提供任何分隔符 如果你想自定义你的分隔符而不是使用@ drawable / your_divider_image

答案 3 :(得分:6)

如果您想摆脱分隔线,您可以这样做:

<style name="customTabBar" parent="@android:style/Widget.Holo.ActionBar.TabBar">
    <item name="android:divider">@null</item>
</style>

答案 4 :(得分:6)

顺便说一下。这是由于ICS在LinerLayout类中实现android:divider属性的巨大错误造成的。它是在Honeycomb中引入的,在ICS中被打破并再次在Jelly Bean中工作。

问题是,当你使用android:divider时,它会在它之间为地方分隔符创建一个小空间,但是将divider no放入这个空间,但是在它之后,它将被标签本身重叠,空间将保持为空。非常愚蠢的错误。尝试比较版本4.0和4.1的LinerLayout源代码。

是的解决方案是将分隔符放在所有选项卡的背景中,它只会在由此错误引起的选项卡之间的间隙中可见。

答案 5 :(得分:1)

基于ATom's answer,这里有一种在所有Android版本中都有类似分隔符的方法。

为了使其工作,您不使用任何本机分隔符方法(因为它们在某些版本中被破坏)。不要忘记删除任何设置分隔符的代码。

诀窍就是在每个标签使用的视图中设置一个非常小的右边距。通过这种方式,您可以看到背景(TabHost)。要完成此操作,请在TabHost上设置背景以模拟拉伸的分隔符。

虽然这个技巧不适用于你可能想要的所有可能设计,但它适用于许多情况,例如我的设计。

以下是一个示例实现:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // ...
    //      inflate or create tabHost  in code
    //      call tabHost.setup
    // ...

    TabWidget tabWidget = tabHost.getTabWidget();
    tabWidget.setBackgroundResource(R.drawable.tab_divider);

    // ...  add tabs

    for( int i = 0; tabWidget.getChildCount()-1; i++) {
        View view = tabWidget.getChildAt(i);
        LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
        layoutParams.rightMargin = getResources().getDimensionPixelSize(R.dimen.tab_divider_width); //1dp
        view.setLayoutParams(layoutParams);
    }
    return tabHost;
}

这是一个示例tab_divider drawable:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
        <solid android:color="@color/divider_color" />
        <stroke android:width="@dimen/tab_divider_vertical_padding" 
                android:color="@color/tab_background_color"/>
</shape>