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

Joel Lara
sumber

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>
Tako
sumber
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>
如果 我 是 DJ
sumber
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>
Hai Rom
sumber
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.

sorifiend
sumber
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"/>
XurajB
sumber
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.

Pratik Butani
sumber
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));
            }
        }
    }
José Maurício
sumber
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

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

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

Ahmad Sadiq
sumber