Cách thay đổi màu sắc và chiều cao của chỉ báo TabLayout mới


123

Tôi đã chơi xung quanh với cái mới android.support.design.widget.TabLayoutvà thấy một vấn đề, trong định nghĩa lớp, không có phương pháp nào để thay đổi màu chỉ báo và chiều cao mặc định.

Thực hiện một số nghiên cứu, nhận thấy rằng màu chỉ báo mặc định được lấy từ AppTheme. Cụ thể từ đây:

<item name="colorAccent">#FF4081</item>

Bây giờ, trong trường hợp của tôi, nếu tôi thay đổi colorAccent, nó sẽ ảnh hưởng đến tất cả các chế độ xem khác sử dụng giá trị này làm màu nền, ví dụ như ProgressBar

Bây giờ có cách nào để thay đổi chỉ số Màu sang thứ khác ngoài colorAccent?

Câu trả lời:


250

Có vấn đề là TabLayout mới sử dụng màu chỉ báo từ giá trị colorAccent, tôi quyết định đào sâu vào android.support.design.widget.TabLayouttriển khai, thấy rằng không có phương thức công khai nào để tùy chỉnh điều này. Tuy nhiên tôi đã tìm thấy đặc tả kiểu này của TabLayout:

<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
    <item name="tabMaxWidth">@dimen/tab_max_width</item>
    <item name="tabIndicatorColor">?attr/colorAccent</item>
    <item name="tabIndicatorHeight">2dp</item>
    <item name="tabPaddingStart">12dp</item>
    <item name="tabPaddingEnd">12dp</item>
    <item name="tabBackground">?attr/selectableItemBackground</item>
    <item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
    <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>

Có đặc điểm kỹ thuật kiểu này, bây giờ chúng ta có thể tùy chỉnh TabLayout như thế này:

<android.support.design.widget.TabLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@id/pages_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:tabIndicatorColor="@android:color/white"
    app:tabIndicatorHeight="4dp"/>

Và vấn đề đã được giải quyết, cả màu sắc và chiều cao của chỉ báo tab có thể được thay đổi từ các giá trị mặc định của chúng.


5
có cách nào thay đổi 'tabSelectedTextColor' (Không phải màu hoặc chiều cao của tabindicator) thông qua mã java.
Prakash

2
ứng dụng: thuộc tính tabTheicatorColor trong tiện ích tabLayout xml là thay đổi duy nhất tôi cần thực hiện để khắc phục sự cố này. Cảm ơn!
Braden Holt

Tôi đã thực hiện điều này theo kiểu cha mẹ:parent="@style/Base.Widget.Design.TabLayout"
Ultimo_m

Giải pháp này được coi là hợp pháp
Nikhil

100

Với thư viện hỗ trợ thiết kế, giờ đây bạn có thể thay đổi chúng trong xml:

Để thay đổi màu của chỉ báo TabLayout:

app:tabIndicatorColor="@color/color"

Để thay đổi chiều cao của chỉ báo TabLayout:

app:tabIndicatorHeight="4dp"

4
Tôi đặt dòng này, nhưng màu vẫn là màu nhấn
Mahdi

@Kenji bạn có chắc chắn rằng dòng này đã được đặt trong TabLayout chứ không phải trong bit Thanh công cụ của xml không? Dễ dàng đặt sai vị trí :)
Wes Winn

Giải pháp hoàn hảo cho chiều cao. Nó hoạt động tốt. Cảm ơn Malek.
Hardik Joshi

1
Nếu tôi muốn áp dụng một màu gradient thay thế thì sao?
hamza khan

35

Vì tôi không thể đăng bình luận tiếp theo cho nhà phát triển Android , đây là câu trả lời được cập nhật cho bất kỳ ai khác cần lập trình màu chỉ báo tab đã chọn:

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));

Tương tự, đối với chiều cao:

tabLayout.setSelectedTabIndicatorHeight((int) (2 * getResources().getDisplayMetrics().density));

Các phương thức này chỉ mới được thêm vào phiên bản 23.0.0 của Thư viện hỗ trợ , đó là lý do tại sao câu trả lời của Soheil Setayeshi sử dụng sự phản chiếu.


2
setSelectedTabTheicatorHeight hiện không được dùng nữa, có ý tưởng gì để sử dụng bây giờ không?
Michalsx


13

Với thư viện hỗ trợ desing v23, bạn có thể thiết lập chương trình màu sắc và chiều cao.

Chỉ sử dụng cho chiều cao:

TabLayout.setSelectedTabIndicatorHeight(int height)

Đây là javadoc chính thức .

Chỉ sử dụng cho màu sắc:

TabLayout.setSelectedTabIndicatorColor(int color)

Đây là javadoc chính thức .

Tại đây bạn có thể tìm thấy thông tin trong Google Tracker .


Những số nguyên nào chúng ta nên sử dụng cho màu sắc?
the_prole

Bạn có thể sử dụng lớp Màu chẳng hạn như Color.RED
Soumya

setSelectedTabTheicatorHeight hiện không được chấp nhận
APP

9

Để thay đổi màu chỉ báo và chiều cao theo chương trình, bạn có thể sử dụng sự phản chiếu. ví dụ mã màu sử dụng dưới đây:

        try {
            Field field = TabLayout.class.getDeclaredField("mTabStrip");
            field.setAccessible(true);
            Object ob = field.get(tabLayout);
            Class<?> c = Class.forName("android.support.design.widget.TabLayout$SlidingTabStrip");
            Method method = c.getDeclaredMethod("setSelectedIndicatorColor", int.class);
            method.setAccessible(true);
            method.invoke(ob, Color.RED);//now its ok
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

và để thay đổi chiều cao chỉ báo, hãy sử dụng "setSelectedTheicatorHeight" thay vì "setSelectedTheicatorColor" sau đó gọi nó theo chiều cao mong muốn của bạn


1
Cảm ơn bạn! Điều này giúp tôi! Tôi đoán Google đã quên cung cấp phương pháp cho việc này trong thư viện hỗ trợ của họ.
Shinta S

1
Tại sao sử dụng sự phản chiếu, nếu nó đã có sẵn như là các chức năng công cộng? developer.android.com/reference/android/support/design/widget/ từ
Android

@SoheilSetayeshi ơi, ok. Cảm ơn bạn. Có lẽ bạn nên cập nhật câu trả lời rồi.
nhà phát triển Android

1
Nhưng đây là một giải pháp hoàn hảo cho các API bên dưới thư viện hỗ trợ 23.0.0. Ý tôi là Whaao! Câu trả lời chính xác!
sud007

6

Chỉ báo Foto sử dụng điều này:

 tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.colorWhite));//put your color

6

từ xml:

app:tabIndicatorColor="#fff"

từ java:

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));
tabLayout.setSelectedTabIndicatorHeight((int) (2 * getResources().getDisplayMetrics().density));


0

Chỉ cần đặt dòng này trong mã của bạn. Nếu bạn thay đổi màu thì thay đổi giá trị màu trong ngoặc đơn.

tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));

0

Android làm cho nó dễ dàng.

public void setTabTextColors(int normalColor, int selectedColor) {
    setTabTextColors(createColorStateList(normalColor, selectedColor));
}

Vì vậy, chúng tôi chỉ nói

mycooltablayout.setTabTextColors(Color.parseColor("#1464f4"), Color.parseColor("#880088"));

Điều đó sẽ cho chúng ta một màu xanh bình thường và màu tím được chọn.

Bây giờ chúng ta đặt chiều cao

public void setSelectedTabIndicatorHeight(int height) {
    mTabStrip.setSelectedIndicatorHeight(height);
}

Và đối với chiều cao, chúng ta nói

mycooltablayout.setSelectedIndicatorHeight(6);
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.