【问题标题】:TabLayout tab styleTabLayout 选项卡样式
【发布时间】:2015-08-25 13:54:03
【问题描述】:

我使用来自com.android.support:design 库的新TabLayout。我想更改选定/未选定选项卡的背景。 我查看了来源,发现只有 tabBackground 属性会更改所有选项卡的颜色,并且不控制选定的选项卡颜色。

如何控制选中/未选中的标签背景?

【问题讨论】:

标签: android android-design-library


【解决方案1】:

定义:

    <style name="AppTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabMaxWidth">@dimen/tab_max_width</item>
        <item name="tabIndicatorColor">?attr/colorAccent</item>
        <item name="tabIndicatorHeight">4dp</item>
        <item name="tabPaddingStart">6dp</item>
        <item name="tabPaddingEnd">6dp</item>
        <item name="tabBackground">?attr/selectableItemBackground</item>
        <item name="tabTextAppearance">@style/AppTabTextAppearance</item>
        <item name="tabSelectedTextColor">@color/range</item>
    </style>

    <!-- for text -->
    <style name="AppTabTextAppearance" parent="TextAppearance.Design.Tab">
        <item name="android:textSize">12sp</item>
        <item name="android:textColor">@color/orange</item>
        <item name="textAllCaps">false</item>
    </style>

申请:

<android.support.design.widget.TabLayout
    style="@style/AppTabLayout"
    app:tabTextAppearance="@style/AppTabTextAppearance"
    android:layout_width="match_parent"
    .... />

【讨论】:

  • 选择标签背景在哪里?
  • @Forte_201092 在TabLayout 选中的标签用tabIndicatorColor 表示
  • 那么,在TabLayout,我们不能改变选中的标签背景?
  • @AnhTriet 你必须用两种状态定义drawable-selector:按下和未按下(或选中/未选中,我不记得了,你明白了)。然后将此选择器设置为 tabBackground。所以你可以控制选定的标签页。
  • 如何在两个标签之间放置分隔符?
【解决方案2】:

如果您查看TabLayout.class,您会注意到内部TabView.class 用于选项卡的实际布局。它与具有isSelected 属性的任何其他布局相同。选择选项卡也会对此产生影响,因此您需要做的就是创建选择器背景可绘制对象

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@color/tab_bg_selected"/>
<item android:drawable="@color/tab_bg_unselected"/></selector>

并将其附加到 tabBackground 属性,例如像 XML 一样

<android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabBackground="@drawable/tab_bg"
            app:tabIndicatorHeight="4dp"/>

【讨论】:

    【解决方案3】:

    我也遇到了这个问题。我刚刚在整个项目中搜索了tabIndicatorColor,在一些R.java中发现了如下代码:

           @see #TabLayout_tabBackground
           @see #TabLayout_tabContentStart
           @see #TabLayout_tabGravity
           @see #TabLayout_tabIndicatorColor
           @see #TabLayout_tabIndicatorHeight
           @see #TabLayout_tabMaxWidth
           @see #TabLayout_tabMinWidth
           @see #TabLayout_tabMode
           @see #TabLayout_tabPadding
           @see #TabLayout_tabPaddingBottom
           @see #TabLayout_tabPaddingEnd
           @see #TabLayout_tabPaddingStart
           @see #TabLayout_tabPaddingTop
           @see #TabLayout_tabSelectedTextColor
           @see #TabLayout_tabTextAppearance
           @see #TabLayout_tabTextColor
    

    这样问题就解决了。希望这对您有所帮助。
    即我使用 IDEA

    【讨论】:

    • 为什么“问题解决了”?由此,我们如何设置选中的标签背景?
    【解决方案4】:

    我阅读了How to Style ActionBar, tab background on selected tab 并弄清楚该怎么做。这确实是类似的问题,但我找到了专门针对 TabLayout 的很棒的解决方案:

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@color/tab_layout_color"
        app:tabIndicatorHeight="48dp"
        app:tabIndicatorColor="@color/selected_tab_color"
        />
    

    请注意,layout_heighttabIndicatorHeight 具有相同的高度。因此,您可以通过这种方式获得漂亮的过渡动画。

    【讨论】:

    • 此解决方案有一个错误 - 指示器与选项卡文本重叠