Wie ändere ich eine Tab-Hintergrundfarbe, wenn ich TabLayout verwende?

119

Dies ist mein Code in der Hauptaktivität

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



  }
}

Und das ist mein Code im 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>

Ich möchte die Hintergrundfarbe einer Registerkarte ändern, wenn sie ausgewählt ist

Joel Lara
quelle

Antworten:

284

Was letztendlich für mich funktioniert hat, ähnelt dem, was @ 如果 我 是 DJ vorgeschlagen hat, aber das tabBackgroundsollte in der layoutDatei und nicht in der sein style, also sieht es so aus:

res/layout/somefile.xml::

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

und der Selektor 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>
Tako
quelle
2
Sie können diesem Attribut auch einen Farbwert hinzufügen: dh: app: tabBackground: @ color / colorAccent
Val Martinez
Vielen Dank für die Lösung. Allerdings habe ich damit den Standard-Ripple-Effekt verloren.
Ken Ratanachai S.
4
Wie kann ich das programmatisch machen?
TSR
1
@TSR, wenn Sie nicht für jede Registerkarte unterschiedliche Farben benötigen, können Sie dies tun tabLayout.setBackgroundColor(colorInt). Wenn Sie es für jeden Reiter benötigen, können Sie die Kinder aus dem TabLayout extrahieren
karl
1
Um das Erscheinungsbild zu verbessern, sollten wir auch state_pressed hinzufügen : <item android: drawable = "@ color / tab_background_selected" android: state_pressed = "true" />
Denken Sie zweimal
21

Sie können dies versuchen:

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

In Ihrer XML-Hintergrunddatei:

<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>
如果 我 是 DJ
quelle
und wie setzt man das um?
TSR
13

Fügen Sie atribute in xml hinzu:

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

Und erstellen Sie im Zeichenordner 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>
Hai Rom
quelle
5

Haben Sie versucht, die API zu überprüfen ?

Sie müssen einen Listener für das OnTabSelectedListenerEreignis erstellen. Wenn ein Benutzer eine Registerkarte auswählt, sollten Sie überprüfen, ob diese die richtige ist, und dann die Hintergrundfarbe mit ändern. tabLayout.setBackgroundColor(int color)Wenn dies nicht die richtige Registerkarte ist, stellen Sie sicher, dass Sie wieder zur Registerkarte wechseln wieder normale Farbe mit der gleichen Methode.

Sorifiend
quelle
Ja, das habe ich versucht, aber tabLayout ändert die Farbe des vollständigen Tab-Widgets, und ich kann in tabLayout keine Methode finden. Tab, das nur die Tab-Farbe ändert, und die anderen Tabs bleiben in derselben Farbe.
Joel Lara
Ich bin mir nicht 100% sicher, wonach Sie suchen. Wenn Sie nur den Hauptteil einer Registerkarte einfärben möchten, können Sie einen Container / eine Ansicht innerhalb dieser Registerkarte hinzufügen. Anschließend sollten Sie in der Lage sein, die Hintergrundfarbe für den Container / die Ansicht in XML wie gewohnt festzulegen. Im Folgenden wird beispielsweise der Hintergrund festgelegt zu rotandroid:background=FF0000
sorifiend
Diese anderen Fragen / Antworten können Ihnen helfen: stackoverflow.com/questions/30904138/… und stackoverflow.com/a/30755351/1270000
sorifiend
3

Sie können es in der XML haben.

<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"/>
XurajB
quelle
2

Da ich die beste und passende Option für mich gefunden habe und sie auch mit Animation funktioniert.

Sie können verwenden indicator es selbst als Hintergrund verwenden.

Sie können einstellen app:tabIndicatorGravity="stretch" Attribut , das als Hintergrund verwendet werden soll.

Beispiel:

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

Hoffe es wird dir helfen.

Pratik Butani
quelle
Dadurch wird die Akzentfarbe automatisch übernommen. Wie man ihm eine andere Farbe gibt, ohne die Akzentfarbe zu ändern. danke
MindRoasterMir
1
Sie können app:tabIndicatorColor@MindRoasterMir
Pratik Butani
1

Sie können den Hintergrund oder die Welligkeit der einzelnen Registerkarten folgendermaßen ändern:

    //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));
            }
        }
    }
José Maurício
quelle
1

Nach einigem Herumspielen habe ich so das gewünschte Aussehen erhalten (zumindest im Emulator) und es behält den Welleneffekt bei.

Registerkartenlayout mit Registerkartenauswahl mit Farbargument

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

Und die @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>

Zu Ihrer Information: Dies hat der Emulator gezeigt, bevor ich das colorArgument hinzugefügt habe zu @drawable/tab_selector:

Registerkartenlayout mit Registerkartenauswahl ohne Farbargument

rexxar
quelle
0

Mit diesem Attribut können Sie die Hintergrundfarbe der Registerkarte ändern

<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"/>'
M_Owais
quelle
-2

Eine der einfachsten Lösungen besteht darin, colorPrimary aus der Datei colours.xml zu ändern.

Ahmad Sadiq
quelle