Bagaimana cara mengubah warna latar belakang tab saat menggunakan TabLayout?


119

Ini adalah kode saya di aktivitas utama

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



  }
}

Dan ini kode saya di 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>

Saya ingin mengubah warna latar belakang satu tab saat dipilih

Jawaban:


285

Apa yang akhirnya berhasil bagi saya mirip dengan apa yang disarankan @ 如果 我 是 DJ, tetapi tabBackgroundharus ada di layoutfile dan bukan di dalam style, jadi terlihat seperti:

res/layout/somefile.xml:

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

dan pemilih 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
Anda juga dapat menambahkan nilai warna ke atribut tersebut: yaitu: app: tabBackground: @ color / colorAccent
Val Martinez

Terima kasih atas solusinya. Namun, saya kehilangan efek riak default dengannya.
Ken Ratanachai S.

4
Bagaimana saya bisa melakukan ini secara terprogram?
TSR

1
@TSR, jika Anda tidak membutuhkan warna yang berbeda untuk setiap tab, Anda dapat melakukannya tabLayout.setBackgroundColor(colorInt). Jika Anda membutuhkannya untuk setiap tab, Anda dapat mengekstrak anak-anak dari TabLayout Anda
karl

1
untuk meningkatkan tampilan dan nuansa, saya rasa kita juga harus menambahkan state_pressed : <item android: drawable = "@ color / tab_background_selected" android: state_pressed = "true" />
Think Twice Code Once

21

Anda dapat mencoba ini:

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

Di file xml latar belakang Anda:

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

dan bagaimana menerapkan ini?
TSR

13

Tambahkan atribut dalam xml:

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

Dan buat di folder 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>

5

Sudahkah Anda mencoba memeriksa API ?

Anda perlu membuat pendengar untuk OnTabSelectedListeneracara tersebut, kemudian ketika pengguna memilih tab apa pun Anda harus memeriksa apakah itu benar, kemudian mengubah warna latar belakang menggunakan tabLayout.setBackgroundColor(int color), atau jika itu bukan tab yang benar pastikan Anda mengubah kembali ke warna normal kembali dengan metode yang sama.


Ya, saya sudah mencobanya, tetapi tabLayout mengubah warna widget tab lengkap, dan saya tidak dapat menemukan metode di tabLayout.Tab yang hanya mengubah warna tab dan tab lainnya tetap dengan warna yang sama.
Joel Lara

Saya tidak 100% yakin apa yang Anda cari. Jika Anda hanya ingin mewarnai satu tab saja maka Anda dapat menambahkan wadah / tampilan di dalam tab tersebut, maka Anda harus dapat mengatur warna latar belakang wadah / tampilan di XML seperti biasa, misalnya berikut ini akan mengatur latar belakang menjadi merahandroid:background=FF0000
sorifiend

Pertanyaan / jawaban lain ini dapat membantu Anda: stackoverflow.com/questions/30904138/… dan stackoverflow.com/a/30755351/1270000
sorifiend

3

Anda dapat memilikinya di 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

Karena saya menemukan opsi terbaik dan cocok untuk saya dan itu akan bekerja dengan animasi juga.

Anda dapat menggunakannya indicatorsendiri sebagai latar belakang.

Anda dapat menyetel app:tabIndicatorGravity="stretch"atribut untuk digunakan sebagai latar belakang.

Contoh:

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

Semoga bisa membantu Anda.


Ini mengambil warna aksen secara otomatis. Bagaimana memberi warna berbeda tanpa mengubah warna aksen. terima kasih
MindRoasterMir

1
Anda dapat menggunakan app:tabIndicatorColor@MindRoasterMir
Pratik Butani

1

Anda dapat mengubah latar belakang atau warna riak setiap Tab seperti ini:

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

Setelah beberapa mengotak-atik ini adalah bagaimana saya mendapatkan tampilan yang diinginkan (setidaknya di emulator) dan itu menjaga efek riak.

tata letak tab dengan pemilih tab dengan argumen warna

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

Dan @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: Ini yang ditunjukkan emulator sebelum saya menambahkan colorargumen ke @drawable/tab_selector:

tata letak tab dengan pemilih tab tanpa argumen warna


0

Anda dapat mengubah warna latar belakang tab dengan atribut ini

<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

Salah satu solusi paling sederhana adalah dengan mengubah colorPrimary dari file colors.xml.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.