Як змінити новий колір та висоту індикатора TabLayout


124

Я розігрувався з новим android.support.design.widget.TabLayoutі виявив проблему, що у визначенні класу немає методів зміни кольору індикатора та висоти за замовчуванням.

Провівши деякі дослідження, виявив, що колір індикатора за замовчуванням взято з AppTheme. Конкретно звідси:

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

Тепер у моєму випадку, якщо я зміню colorAccent, це вплине на всі інші представлення, які використовують це значення як колір тла, наприклад, ProgressBar

Тепер чи є спосіб змінити індикатор кольору на інше, окрім colorAccent?

Відповіді:


250

Маючи проблему з тим, що новий 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"/>

І проблема вирішена: і колір індикатора та висоту вкладки можна змінити від значень за замовчуванням.


5
чи є спосіб змінити "tabSelectedTextColor" (не колір або висоту таблікатора) за допомогою коду Java.
Пракаш

2
атрибут app: tabIndicatorColor у віджеті tabLayout xml - це єдине зміна, яке мені потрібно було внести, щоб виправити цю проблему. Дякую!
Бреден Холт

Я зробив це як батьківський стиль:parent="@style/Base.Widget.Design.TabLayout"
Ultimo_m

Це рішення виявляється законним
Nikhil

101

За допомогою бібліотеки підтримки дизайну тепер ви можете змінити їх у xml:

Щоб змінити колір індикатора TabLayout:

app:tabIndicatorColor="@color/color"

Щоб змінити висоту індикатора TabLayout:

app:tabIndicatorHeight="4dp"

4
Я ставлю цю лінію, але колір все ще є акцентним кольором
Махді

@Kenji Ви впевнені, що цей рядок було розміщено у TabLayout, а не у біті панелі інструментів xml? Легке заміна зробити :)
Уес Вінн

Ідеальне рішення для висоти. Це чудово працює. Дякую Малек.
Хардік Джоші

1
Що робити, якщо замість цього я хочу застосувати колір градієнта?
хамза хан

35

Оскільки я не можу опублікувати коментар розробника для Android , ось оновлена ​​відповідь для всіх, кому потрібно програмно встановити вибраний колір індикатора вкладки:

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

Аналогічно для висоти:

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

Ці методи були нещодавно додані до версії 23.0.0 Бібліотеки підтримки , тому відповідь Сохеїла Сетаеші використовує роздуми.


2
setSelectedTabIndicatorHeight зараз застарілий, будь-яка ідея, що зараз використовувати?
Michalsx


13

За допомогою бібліотеки підтримки дизайну v23 ви можете програмно встановити колір та висоту.

Просто використовуйте для висоти:

TabLayout.setSelectedTabIndicatorHeight(int height)

Тут офіційний javadoc .

Просто використовуйте для кольору:

TabLayout.setSelectedTabIndicatorColor(int color)

Тут офіційний javadoc .

Тут ви можете знайти інформацію в Google Tracker .


Які цілі числа ми повинні використовувати для кольору?
the_prole

Ви можете використовувати клас Color, наприклад Color.RED
Soumya

setSelectedTabIndicatorHeight зараз застарілий
APP

9

Для програмного зміни кольору та висоти індикатора ви можете використовувати відображення. наприклад для коду використання індикаторного кольору нижче:

        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", а потім викликайте його за потрібною висотою


1
Дякую! це мені допомагає! Я думаю, Google забув надати метод для цього у своїй бібліотеці підтримки.
Shinta S

1
Навіщо використовувати рефлексію, якщо вона вже доступна як публічні функції? developer.android.com/reference/android/support/design/widget/…
андроїд розробник

@SoheilSetayeshi О, добре. Дякую. Можливо, тоді слід оновити відповідь.
андроїд розробник

1
Але це ідеальне рішення для API нижче бібліотеки підтримки 23.0.0. Я маю на увазі Whaao! Чудова відповідь!
sud007

6

Використовуйте цей індикатор Foto:

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

6

від xml:

app:tabIndicatorColor="#fff"

від Java:

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


0

Просто введіть цей рядок у свій код. Якщо ви змінили колір, то змініть значення кольору в дужках.

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

0

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.