Come modificare il colore e l'altezza del nuovo indicatore TabLayout


124

Stavo giocando con il nuovo android.support.design.widget.TabLayoute ho trovato un problema, nella definizione della classe, non ci sono metodi per cambiare il colore dell'indicatore e l'altezza predefinita.

Facendo alcune ricerche, ho scoperto che il colore dell'indicatore predefinito è preso da AppTheme. In particolare da qui:

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

Ora, nel mio caso, se cambio il colorAccent, influenzerà tutte le altre viste che usano questo valore come colore di sfondo, ad esempio ProgressBar

Ora c'è un modo per cambiare l'indicatoreColor in un'altra cosa oltre a colorAccent?

Risposte:


250

Avendo il problema che il nuovo TabLayout utilizza il colore dell'indicatore dal valore colorAccent, ho deciso di approfondire l' android.support.design.widget.TabLayoutimplementazione, scoprendo che non esistono metodi pubblici per personalizzarlo. Tuttavia ho trovato questa specifica di stile del 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>

Avendo questa specifica di stile, ora possiamo personalizzare il TabLayout in questo modo:

<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"/>

E risolto il problema, sia il colore che l'altezza dell'indicatore di tabulazione possono essere modificati dai valori predefiniti.


5
c'è un modo per cambiare il 'tabSelectedTextColor' (colore o altezza dell'indicatore di tabulazione) tramite codice java.
Prakash

2
l'attributo app: tabIndicatorColor nel widget xml tabLayout è l'unica modifica che dovevo apportare per risolvere questo problema. Grazie!
Braden Holt il

L'ho creato come stile genitore:parent="@style/Base.Widget.Design.TabLayout"
Ultimo_m

Questa soluzione risulta essere legittima
Nikhil

101

Con la libreria di supporto alla progettazione ora puoi cambiarli in xml:

Per modificare il colore dell'indicatore TabLayout:

app:tabIndicatorColor="@color/color"

Per modificare l' altezza dell'indicatore TabLayout:

app:tabIndicatorHeight="4dp"

4
Ho messo questa linea, ma il colore è ancora un colore accento
Mahdi

@Kenji sei sicuro che questa riga sia stata inserita nel TabLayout e non nel bit Toolbar di xml? Facile smarrimento da fare :)
Wes Winn

Soluzione perfetta per l'altezza. Funziona bene. Grazie Malek.
Hardik Joshi

1
E se invece volessi applicare un colore sfumato?
hamza khan

35

Dal momento che non posso pubblicare un seguito al commento dello sviluppatore Android , ecco una risposta aggiornata per chiunque altro abbia bisogno di impostare a livello di programmazione il colore dell'indicatore della scheda selezionata:

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

Allo stesso modo, per l'altezza:

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

Questi metodi sono stati aggiunti solo di recente alla revisione 23.0.0 della libreria di supporto , motivo per cui la risposta di Soheil Setayeshi utilizza la riflessione.


2
setSelectedTabIndicatorHeight è deprecato ora, hai idea di cosa usare ora?
Michalsx


13

Con la libreria di supporto al design v23 è possibile impostare programmaticamente il colore e l'altezza.

Usa solo per l'altezza:

TabLayout.setSelectedTabIndicatorHeight(int height)

Qui il javadoc ufficiale .

Usa solo per il colore:

TabLayout.setSelectedTabIndicatorColor(int color)

Qui il javadoc ufficiale .

Qui puoi trovare le informazioni nel Google Tracker .


Quali numeri interi dovremmo usare per il colore?
the_prole

Puoi usare la classe Color, ad esempio Color.RED
Soumya

setSelectedTabIndicatorHeight è ora obsoleto
APP

9

Per modificare il colore e l'altezza dell'indicatore a livello di codice puoi usare la riflessione. ad esempio per il colore dell'indicatore utilizzare il codice seguente:

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

e per cambiare l'altezza dell'indicatore usa "setSelectedIndicatorHeight" invece di "setSelectedIndicatorColor" quindi invocalo all'altezza desiderata


1
Grazie! questo mi aiuta! Immagino che Google abbia dimenticato di fornire il metodo per questo nella loro libreria di supporto.
Shinta S

1
Perché usare la riflessione, se è già disponibile come funzioni pubbliche? developer.android.com/reference/android/support/design/widget/…
Android

@SoheilSetayeshi Oh, ok. Grazie. Forse dovresti aggiornare la risposta allora.
sviluppatore Android

1
Ma questa è una soluzione perfetta per le API sotto la libreria di supporto 23.0.0. Voglio dire Whaao! Bella risposta!
sud007

6

L'indicatore foto usa questo:

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

6

da xml:

app:tabIndicatorColor="#fff"

da java:

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


0

Basta inserire questa riga nel codice. Se cambi il colore, cambia il valore del colore tra parentesi.

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

0

Android lo rende facile.

public void setTabTextColors(int normalColor, int selectedColor) {
    setTabTextColors(createColorStateList(normalColor, selectedColor));
}

Quindi, diciamo solo

mycooltablayout.setTabTextColors(Color.parseColor("#1464f4"), Color.parseColor("#880088"));

Questo ci darà un colore blu normale e un colore viola selezionato.

Ora impostiamo l'altezza

public void setSelectedTabIndicatorHeight(int height) {
    mTabStrip.setSelectedIndicatorHeight(height);
}

E per altezza diciamo

mycooltablayout.setSelectedIndicatorHeight(6);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.