Как изменить новый цвет и высоту индикатора TabLayout

Я играл с новым android.support.design.widget.TabLayout и нашел проблему, в определении класса нет методов изменения цвета индикатора и высоты по умолчанию.

Проведя некоторые исследования, выяснилось, что цвет индикатора по умолчанию берется из AppTheme. В частности, здесь:

<item name="colorAccent">#FF4081</item>

Теперь, в моем случае, если я изменю colorAccent, это повлияет на все другие представления, которые используют это значение в качестве фона, например ProgressBar

Теперь есть ли способ изменить индикаторColor на другое, кроме colorAccent?

Ответ 1

Проблема с тем, что новый TabLayout использует цвет индикатора из значения colorAccent, я решил вникать в реализацию android.support.design.widget.TabLayout, обнаружив, что для его настройки нет общедоступных методов. Однако я нашел эту спецификацию стиля 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>

Имея эту спецификацию стиля, теперь мы можем настроить 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"/>

И проблема решена, и цвет и высота индикатора табуляции могут быть изменены с их значений по умолчанию.

Ответ 2

В библиотеке поддержки дизайна теперь вы можете изменить их в xml:

Чтобы изменить цвет индикатора TabLayout:

app:tabIndicatorColor="@color/color"

Чтобы изменить высоту индикатора TabLayout:

app:tabIndicatorHeight="4dp"

Ответ 3

Поскольку я не могу опубликовать комментарий к комментарию разработчика Android, здесь обновленный ответ для всех, кто должен программно установить выбранный цвет индикатора табуляции:

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));

Аналогично, для height:

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

Эти методы были недавно добавлены в версия 23.0.0 библиотеки поддержки, поэтому Ответ Сохеила Сетээши использует отражение.

Ответ 4

app:tabIndicatorColor="@android:color/white"

Ответ 5

С поддержкой библиотеки поддержки v23 вы можете программно установить цвет и высоту.

Просто используйте для высоты:

TabLayout.setSelectedTabIndicatorHeight(int height)

Здесь официальный javadoc.

Просто используйте для цвета:

TabLayout.setSelectedTabIndicatorColor(int color)

Здесь официальный javadoc.

Здесь вы можете найти информацию в Google Tracker.

Ответ 6

Чтобы программно изменить цвет и высоту индикатора, вы можете использовать отражение. например, для кода использования цвета индикатора ниже:

        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();
        }

и для изменения высоты экрана используйте "setSelectedIndicatorHeight" вместо "setSelectedIndicatorColor", а затем вызовите его по желаемой высоте

Ответ 7

Фотокамера использует это:

 tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.colorWhite));//put your color

Ответ 8

из XML:

app:tabIndicatorColor="#fff"

из Java:

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

Ответ 9

Вы можете изменить это, используя xml

app:tabIndicatorColor="#fff"

Ответ 10

Просто поместите эту строку в свой код. Если вы измените цвет, измените значение цвета в круглых скобках.

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));

Ответ 11

Android делает это проще.

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);