Làm cách nào để thay đổi màu nền tab khi sử dụng TabLayout?


119

Đây là mã của tôi trong hoạt động chính

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



  }
}

Và đây là mã của tôi trong 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>

Tôi muốn thay đổi màu nền của một tab khi nó được chọn

Câu trả lời:


285

Những gì cuối cùng đã làm việc cho tôi tương tự như những gì @ 如果 我 是 DJ đã đề xuất, nhưng tabBackgroundphải có trong layouttệp chứ không phải bên trong style, vì vậy nó giống như:

res/layout/somefile.xml:

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

và bộ chọn 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
Bạn cũng có thể thêm một giá trị màu cho thuộc tính: ví dụ: ứng dụng: tabBackground: @ màu / colorAccent
Val Martinez

Cảm ơn bạn cho giải pháp. Tuy nhiên, tôi đã mất hiệu ứng gợn sóng mặc định với nó.
Ken Ratanachai S.

4
Làm thế nào tôi có thể làm điều này theo chương trình?
TSR

1
@TSR, nếu bạn không cần các màu khác nhau cho mỗi tab, bạn có thể làm tabLayout.setBackgroundColor(colorInt). Nếu bạn cần nó cho mỗi tab, bạn có thể trích xuất các trẻ em từ TabLayout của bạn
karl

1
để cải thiện giao diện, tôi nghĩ chúng ta cũng nên thêm state_pressed : <item android: drawable = "@ color / tab_background_selected" android: state_pressed = "true" />
Nghĩ hai lần Mã một lần

21

Bạn có thể thử điều này:

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

Trong tệp xml nền của bạn:

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

và làm thế nào để thực hiện điều này?
TSR

13

Thêm thuộc tính trong xml:

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

Và tạo trong thư mục có thể vẽ, 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

Bạn đã thử kiểm tra API chưa chưa?

Bạn sẽ cần tạo trình lắng nghe cho OnTabSelectedListenersự kiện, sau đó khi người dùng chọn bất kỳ tab nào, bạn nên kiểm tra xem tab đó có đúng không, sau đó thay đổi màu nền bằng cách sử dụng tabLayout.setBackgroundColor(int color)hoặc nếu đó không phải là tab chính xác, hãy đảm bảo rằng bạn thay đổi trở lại màu bình thường trở lại với cùng một phương pháp.


Có, tôi đã thử điều đó, nhưng tabLayout thay đổi màu tiện ích tab đầy đủ và tôi không thể tìm thấy phương pháp trên tabLayout.Tab chỉ thay đổi màu tab và các tab khác vẫn có cùng màu.
Joel Lara

Tôi không chắc chắn 100% những gì bạn đang theo đuổi. Nếu bạn chỉ muốn tô màu phần thân của một tab thì bạn có thể thêm vùng chứa / chế độ xem bên trong tab đó, sau đó bạn có thể đặt màu nền vùng chứa / chế độ xem trong XML như bình thường, ví dụ như phần sau sẽ đặt nền sang màu đỏandroid:background=FF0000
sorifiend

Những câu hỏi / câu trả lời khác có thể giúp ích cho bạn: stackoverflow.com/questions/30904138/…stackoverflow.com/a/30755351/1270000
sorifiend

3

Bạn có thể có nó trong 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

Như tôi đã tìm thấy tùy chọn tốt nhất và phù hợp với tôi và nó cũng sẽ hoạt động với hoạt ảnh.

Bạn có thể dùng indicator tự nó làm nền.

Bạn có thể đặt app:tabIndicatorGravity="stretch" thuộc tính để sử dụng làm nền.

Thí dụ:

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

Hy vọng nó sẽ giúp ích cho bạn.


Điều này sẽ tự động lấy màu nhấn. Làm thế nào để cung cấp cho nó màu sắc khác nhau mà không thay đổi màu nhấn. cảm ơn
MindRoasterMir

1
Bạn có thể sử dụng app:tabIndicatorColor@MindRoasterMir
Pratik Butani

1

Bạn có thể thay đổi màu nền hoặc màu gợn sóng của từng Tab như sau:

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

Sau một số lần lộn xộn, đây là cách tôi có được giao diện mong muốn (ít nhất là trong trình giả lập) và nó vẫn giữ hiệu ứng gợn sóng.

bố cục tab với bộ chọn tab với đối số màu

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

@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: Đây là những gì trình giả lập hiển thị trước khi tôi thêm colorđối số vào @drawable/tab_selector:

bố cục tab với bộ chọn tab không có đối số màu


0

Bạn có thể thay đổi màu nền của tab theo thuộc tính này

<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

Một trong những giải pháp đơn giản nhất là thay đổi colorPrimary từ tệp Colors.xml.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.