Цвет текущей вкладки TabWidget

У меня есть TabWidget, для которого я включен, и установите stripLeft и stripRight...

mTabHost.getTabWidget().setStripEnabled(true);
mTabHost.getTabWidget().setRightStripDrawable(R.drawable.redline);
mTabHost.getTabWidget().setLeftStripDrawable(R.drawable.redline);

Как вы можете видеть на изображении ниже, это не меняет цвет нижней строки текущей выбранной вкладки (TAB 2).

enter image description here

Как изменить цвет нижней строки текущей вкладки, на которой по умолчанию используется синий? (Я предполагаю, что синий цвет устанавливается в стандартном стиле AppTheme в styles.xml.)

Я посмотрел на этот ответ, но он не говорит, как изменить цвет...

Ответ 1

Цвет индикатора вкладки устанавливается с помощью выделенного селектора, который можно найти здесь и выглядит следующим образом:

<!-- AOSP copyright notice can be found at the above link -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_holo" />
    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_holo" />

    <!-- Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused_holo" />
    <item android:state_focused="true" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_focused_holo" />

    <!-- Pressed -->
    <!--    Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_holo" />
    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_holo" />

    <!--    Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_holo" />
    <item android:state_focused="true" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_holo" />
</selector>

Выделимости, используемые селектором, окрашены в этот голубой цвет. Вы можете заменить эти чертежи своими собственными перекрашенными версиями. Оригиналы выглядят так (оригиналы маленькие, ссылки включены):

Вы хотите скопировать указанный выше селектор в свой собственный проект вместе с чертежами. Затем вы захотите перекрасить чертежи любым цветом, которым вы хотите. Затем вы захотите установить селектор в качестве фона для ваших индикаторов вкладок. Вы можете сделать это так (после настройки вкладок):

TabHost host = (TabHost)view.findViewById(R.id.tab_host);
TabWidget widget = host.getTabWidget();
for(int i = 0; i < widget.getChildCount(); i++) {
    View v = widget.getChildAt(i);

    // Look for the title view to ensure this is an indicator and not a divider.
    TextView tv = (TextView)v.findViewById(android.R.id.title);
    if(tv == null) {
        continue;
    }
    v.setBackgroundResource(R.drawable.your_tab_selector_drawable);
}

Там может быть более простой способ сделать это, установив собственный макет индикатора клиента с помощью фонового переключателя, но это то, что сработало для меня легче.

Ответ 2

Вот как я изменил свои вкладки,

private void changetabs(TabWidget tabWidget) {
    // Change background
    for(int i=0; i < tabWidget.getChildCount(); i++)
        tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_selector);
}

и мой tab_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_holo" />
<item android:state_focused="false" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_holo" />

<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused_holo" />
<item android:state_focused="true" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_focused_holo" />

<!-- Pressed -->
<!--    Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_holo" />
<item android:state_focused="false" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_holo" />

<!--    Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_holo" />
<item android:state_focused="true" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_holo" />

Надеюсь, это поможет кому-то.

Ответ 3

Если кто-то наткнулся на него, есть онлайн-инструмент для быстрой сборки чертежей (9 патчей) для вкладок. Просто выберите цвет и нажмите кнопку. Здесь вы идете...

Благодаря Джеффу Гильфельт


Генератор стилей Android Action Bar позволяет легко создавать простой, привлекательный и бесшовный стиль пользовательских действий для вашего приложения для Android. Он будет генерировать все необходимые девять патч-активов плюс связанные с ними XML-образы и стили, которые вы можете скопировать прямо в свой проект.

http://jgilfelt.github.io/android-actionbarstylegenerator/

Ответ 4

С этой целью вы можете использовать приложение: tabIndicatorColor. Он изменит цвет линии выбранного индикатора вкладки в соответствии с вашим требованием.

<android.support.design.widget.TabLayout
                    android:id="@+id/tabs"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:tabIndicatorColor="@android:color/white"
                    app:tabMode="fixed" />

Ответ 5

Вы можете использовать фильтр,
Это будет применено к области, которая не прозрачна.

tabHost.getTabWidget().getChildAt(tabHost.getCurrentTab()).getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);

Одна строка кода - нет необходимости изменять состояния.

Ответ 6

Цвет акцента используется по умолчанию в качестве активного цвета вкладки. Вы можете установить/изменить его в файле style.xml:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">

    <item name="colorAccent">@color/myAccentColor</item>

</style>

Ответ 7

Мой способ решить эту проблему - использовать setBackgroundResource. Во-первых, вам нужно создать точно такой же backgroud

line_label_1_pressed.xml

<item android:top="-6dp" android:left="-6dp" android:right="-6dp">
    <shape>
        <size android:height="50dp"/>
        <solid android:color="@android:color/transparent"/>
        <stroke android:color="@color/myColor" android:width="6dp"/>
    </shape>
</item>

line_label_1.xml

<item>
    <shape>
        <solid android:color="@android:color/transparent" />
    </shape>
</item>

а затем создайте tab_selector.xml, следуя

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

затем setbackgroudResource, используя tab_selector.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/tab_selector"
android:gravity="center_horizontal|center_vertical" />

Ответ 8

Я нашел другое решение, откройте styles.xml и изменил одну строку:

res → values ​​- > styles.xml

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@android:color/holo_orange_light</item> <!-- set the color in this line -->
    <item name="windowNoTitle">true</item>
</style>

Ответ 9

Просто используйте что-то вроде

tabHost.setSelectedTabIndicatorColor(Color.WHITE);