Come si cambia il colore di sfondo di una scheda quando si utilizza TabLayout?


119

Questo è il mio codice nell'attività principale

public class FilterActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_filter);

    // Get the ViewPager and set it's PagerAdapter so that it can display items
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
    PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager(), FilterActivity.this);
    viewPager.setAdapter(pageAdapter);

    // Give the TabLayout the ViewPager
    final TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
    tabLayout.setupWithViewPager(viewPager);



  }
}

E questo è il mio codice nell'XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar">
    </include>

    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="fill_parent"
        style="@style/MyCustomTabLayout"
        android:layout_height="48dp"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="@android:color/white" />

</LinearLayout>

Voglio cambiare il colore di sfondo di una scheda quando è selezionata

Risposte:


285

Ciò che alla fine ha funzionato per me è simile a quello che @ 如果 我 是 DJ ha suggerito, ma tabBackgrounddovrebbe essere nel layoutfile e non all'interno style, quindi sembra:

res/layout/somefile.xml:

<android.support.design.widget.TabLayout
    ....
    app:tabBackground="@drawable/tab_color_selector"
    ...
    />

e il selettore res/drawable/tab_color_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/tab_background_selected" android:state_selected="true"/>
    <item android:drawable="@color/tab_background_unselected"/>
</selector>

2
Puoi anche aggiungere un valore di colore a quell'attributo: ie: app: tabBackground: @ color / colorAccent
Val Martinez

Grazie per la soluzione. Tuttavia, ho perso l'effetto a catena predefinito con esso.
Ken Ratanachai S.

4
Come posso farlo in modo programmatico?
TSR

1
@TSR, se non hai bisogno di colori diversi per ogni scheda, puoi farlo tabLayout.setBackgroundColor(colorInt). Se ne hai bisogno per ogni scheda, puoi estrarre i bambini dal tuo TabLayout
karl

1
per migliorare l'aspetto grafico , penso che dovremmo anche aggiungere state_pressed : <item android: drawable = "@ color / tab_background_selected" android: state_pressed = "true" />
Think Twice Code Once

21

Puoi provare questo:

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
    <item name="tabBackground">@drawable/background</item>
</style>

Nel tuo file xml in background:

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

e come implementarlo?
TSR

13

Aggiungi attributo in xml:

<android.support.design.widget.TabLayout
    ....
    app:tabBackground="@drawable/tab_color_selector"
    ...
    />

E crea nella cartella disegnabile, tab_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/tab_background_selected" android:state_selected="true"/>
    <item android:drawable="@color/tab_background_unselected"/>
</selector>

5

Hai provato a controllare l' API ?

Dovrai creare un listener per l' OnTabSelectedListenerevento, quindi quando un utente seleziona una scheda dovresti controllare se è quella corretta, quindi cambiare il colore di sfondo usando tabLayout.setBackgroundColor(int color), o se non è la scheda corretta assicurati di tornare alla colore normale di nuovo con lo stesso metodo.


Sì, l'ho provato, ma tabLayout cambia il colore del widget della scheda completa e non riesco a trovare un metodo su tabLayout.Tab che cambia solo il colore della scheda e le altre schede rimangono dello stesso colore.
Joel Lara

Non sono sicuro al 100% di cosa stai cercando. Se vuoi colorare solo il corpo di una scheda, puoi aggiungere un contenitore / vista all'interno di quella scheda, quindi dovresti essere in grado di impostare il colore di sfondo del contenitore / vista nell'XML come al solito, ad esempio quanto segue imposterà lo sfondo to redandroid:background=FF0000
sorifiend


3

Puoi averlo in xml.

<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        app:tabTextColor="@color/colorGray"
        app:tabSelectedTextColor="@color/colorWhite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

2

Come ho trovato l'opzione migliore e adatta a me e funzionerà anche con l'animazione.

Puoi usare indicator come sfondo.

Puoi impostare app:tabIndicatorGravity="stretch" attributo da utilizzare come sfondo.

Esempio:

   <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabIndicatorGravity="stretch"
        app:tabSelectedTextColor="@color/white"
        app:tabTextColor="@color/colorAccent">

        <android.support.design.widget.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Chef" />


        <android.support.design.widget.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="User" />

    </android.support.design.widget.TabLayout>

Spero che ti aiuti.


Questo sta prendendo automaticamente il colore dell'accento. Come dargli un colore diverso senza cambiare il colore dell'accento. grazie
MindRoasterMir

1
Puoi usare app:tabIndicatorColor@MindRoasterMir
Butani

1

Puoi cambiare lo sfondo o il colore delle increspature di ciascuna scheda in questo modo:

    //set ripple color for each tab
    for(int n = 0; n < mTabLayout.getTabCount(); n++){

        View tab = ((ViewGroup)mTabLayout.getChildAt(0)).getChildAt(n);

        if(tab != null && tab.getBackground() instanceof RippleDrawable){
            RippleDrawable rippleDrawable = (RippleDrawable)tab.getBackground();
            if (rippleDrawable != null) {
                rippleDrawable.setColor(ColorStateList.valueOf(rippleColor));
            }
        }
    }

1

Dopo un po 'di scherzi, è così che ho ottenuto l'aspetto desiderato (almeno nell'emulatore) e mantiene l'effetto a catena.

layout a schede con selettore di schede con argomento colore

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabBackground="@drawable/tab_selector"
    app:tabIconTint="@drawable/tab_selector"
    app:tabIconTintMode="src_atop"
    app:tabTextColor="@drawable/tab_selector" />

E il @drawable/tab_selector:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorPrimary" android:drawable="@color/colorPrimaryDark" android:state_selected="true" />
    <item android:color="@color/colorPrimaryDark" android:drawable="@color/colorPrimary" />
</selector>

FYI: Questo è ciò che l'emulatore ha mostrato prima che aggiungessi l' colorargomento a @drawable/tab_selector:

layout a schede con selettore di schede senza argomenti di colore


0

È possibile modificare il colore di sfondo della scheda tramite questo attributo

<android.support.design.widget.TabLayout
android:id="@+id/tabs"
style="@style/CategoryTab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
'android:background="@color/primary_color"/>'

-2

Una delle soluzioni più semplici è cambiare colorPrimary dal file colors.xml.

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.