Android 如何更改新的表格布局指示器颜色和高度

Android 如何更改新的表格布局指示器颜色和高度,android,material-design,android-design-library,Android,Material Design,Android Design Library,我在玩新的android.support.design.widget.TabLayout,发现了一个问题,在类定义中,没有改变指示器颜色和默认高度的方法 做了一些研究,发现默认的指示器颜色取自AppTheme。具体从这里开始: <item name="colorAccent">#FF4081</item> #FF4081 现在,在我的例子中,如果我更改colorAccent,它将影响使用此值作为背景色的所有其他视图,例如ProgressBar 现在除了colorAcc

我在玩新的
android.support.design.widget.TabLayout
,发现了一个问题,在类定义中,没有改变指示器颜色和默认高度的方法

做了一些研究,发现默认的指示器颜色取自AppTheme。具体从这里开始:

<item name="colorAccent">#FF4081</item>
#FF4081
现在,在我的例子中,如果我更改
colorAccent
,它将影响使用此值作为背景色的所有其他视图,例如ProgressBar


现在除了
colorAccent
之外,还有什么方法可以将指示符颜色更改为其他颜色吗?

由于新的表格布局使用了值
colorAccent
中的指示符颜色,我决定深入研究
android.support.design.widget.TabLayout
实现,发现没有公共方法可自定义此。然而,我发现了这个表格布局的样式规范:

<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
    <item name="tabMaxWidth">@dimen/tab_max_width</item>
    <item name="tabIndicatorColor">?attr/colorAccent</item>
    <item name="tabIndicatorHeight">2dp</item>
    <item name="tabPaddingStart">12dp</item>
    <item name="tabPaddingEnd">12dp</item>
    <item name="tabBackground">?attr/selectableItemBackground</item>
    <item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
    <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>

@尺寸/标签最大宽度
?属性/颜色重音
2dp
12dp
12dp
?属性/可选择项背景
@样式/文本外观.Design.Tab
?android:textColorPrimary
有了这个样式规范,现在我们可以像这样定制TabLayout:

<android.support.design.widget.TabLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@id/pages_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:tabIndicatorColor="@android:color/white"
    app:tabIndicatorHeight="4dp"/>


问题解决后,选项卡指示器颜色和高度都可以从默认值更改。

要以编程方式更改指示器颜色和高度,可以使用反射。例如,指示器颜色使用代码如下:

        try {
            Field field = TabLayout.class.getDeclaredField("mTabStrip");
            field.setAccessible(true);
            Object ob = field.get(tabLayout);
            Class<?> c = Class.forName("android.support.design.widget.TabLayout$SlidingTabStrip");
            Method method = c.getDeclaredMethod("setSelectedIndicatorColor", int.class);
            method.setAccessible(true);
            method.invoke(ob, Color.RED);//now its ok
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
试试看{
Field=TabLayout.class.getDeclaredField(“mTabStrip”);
字段。setAccessible(true);
Object ob=field.get(tabLayout);
Class c=Class.forName(“android.support.design.widget.TabLayout$slidengtabstrip”);
方法=c.getDeclaredMethod(“setSelectedIndicatorColor”,int.class);
方法setAccessible(true);
调用(ob,Color.RED);//现在可以了
}捕获(无此字段例外){
e、 printStackTrace();
}捕获(无此方法例外){
e、 printStackTrace();
}捕获(调用TargetException e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}

若要更改指示器高度,请使用“setSelectedIndicatorHeight”而不是“setSelectedIndicatorColor”,然后根据所需高度调用它

,因为我无法发布后续信息,这里有一个更新的答案,供需要通过编程方式设置所选选项卡指示器颜色的任何其他人使用:

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));
tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));
同样,对于高度:

tabLayout.setSelectedTabIndicatorHeight((int) (2 * getResources().getDisplayMetrics().density));

这些方法最近才添加到中,这就是使用反射的原因。

使用设计支持库v23可以通过编程方式设置颜色和高度

仅用于高度:

TabLayout.setSelectedTabIndicatorHeight(int height)
TabLayout.setSelectedTabIndicatorColor(int color)
给你

仅用于颜色:

TabLayout.setSelectedTabIndicatorHeight(int height)
TabLayout.setSelectedTabIndicatorColor(int color)
给你


在这里,您可以在中找到信息。

使用设计支持库,您现在可以在xml中更改这些信息:

要更改表格布局指示器的颜色

app:tabIndicatorColor="@color/color"
app:tabIndicatorHeight="4dp"
要更改表格布局指示器的高度,请执行以下操作:

app:tabIndicatorColor="@color/color"
app:tabIndicatorHeight="4dp"

您可以使用xml更改此设置

app:tabIndicatorColor="#fff"

只要把这一行放在你的代码里。如果更改颜色,请更改括号中的颜色值

从xml:

app:tabIndicatorColor="#fff"
来自java:

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));
tabLayout.setSelectedTabIndicatorHeight((int) (2 * getResources().getDisplayMetrics().density));

要使用该指示器,请执行以下操作:

 tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.colorWhite));//put your color
安卓让它变得简单

public void setTabTextColors(int normalColor, int selectedColor) {
    setTabTextColors(createColorStateList(normalColor, selectedColor));
}
所以,我们只是说

mycooltablayout.setTabTextColors(Color.parseColor("#1464f4"), Color.parseColor("#880088"));
这将给我们一个蓝色的正常颜色和紫色的选择颜色

现在我们设定高度

public void setSelectedTabIndicatorHeight(int height) {
    mTabStrip.setSelectedIndicatorHeight(height);
}
至于身高,我们说

mycooltablayout.setSelectedIndicatorHeight(6);


非常感谢。这对我有帮助!我猜谷歌忘了在他们的支持库中提供这个方法。如果反射已经作为公共函数提供,为什么要使用反射呢@哦,好的。非常感谢。也许你应该更新答案,但这是一个完美的解决方案,适用于支持库23.0.0以下的API。我是说沃!回答得好!我们应该为颜色使用哪些整数?您可以使用颜色类,例如color.RedSetSelectedTabIndicator高度现在不推荐使用是否有办法更改“tabSelectedTextColor”(而不是tabindicator颜色或高度)tabLayout xml小部件中的app:tabIndicatorColor属性是我修复此问题所需的唯一更改。谢谢我将此作为父样式:
parent=“@style/Base.Widget.Design.TabLayout”
此解决方案被认为是合法的,但颜色仍然是重音color@Kenji您确定这一行是放在TabLayout中,而不是放在xml的工具栏位中吗?容易错位:)完美解决身高问题。它很好用。谢谢Malek。如果我想应用渐变色怎么办?SetSelectedTabitIndicator高度现在不推荐使用,知道现在使用什么吗?这只适用于文本颜色,不适用于标签背面