Как изменить новый цвет и высоту индикатора 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);