วิธีเปลี่ยนสีและความสูงของตัวบ่งชี้ TabLayout ใหม่


124

ฉันกำลังเล่นกับสิ่งใหม่android.support.design.widget.TabLayoutและพบปัญหาในการกำหนดคลาสไม่มีวิธีใดในการเปลี่ยนสีตัวบ่งชี้และความสูงเริ่มต้น

จากการวิจัยพบว่าสีตัวบ่งชี้เริ่มต้นถูกนำมาจาก AppTheme โดยเฉพาะจากที่นี่:

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

ตอนนี้ในกรณีของฉันถ้าฉันเปลี่ยนcolorAccentมันจะส่งผลต่อมุมมองอื่น ๆ ทั้งหมดที่ใช้ค่านี้เป็นสีพื้นหลังเช่น ProgressBar

ตอนนี้มีวิธีใดในการเปลี่ยน indicatorColor เป็นอย่างอื่นนอกเหนือจาก the colorAccent?

คำตอบ:


250

มีปัญหาที่ TabLayout ใหม่ใช้สีตัวบ่งชี้จากค่าcolorAccentฉันตัดสินใจเจาะลึกการandroid.support.design.widget.TabLayoutใช้งานโดยพบว่าไม่มีวิธีสาธารณะในการปรับแต่งสิ่งนี้ อย่างไรก็ตามฉันพบข้อกำหนดลักษณะนี้ของ 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>

เมื่อมีข้อกำหนดลักษณะนี้ตอนนี้เราสามารถปรับแต่ง TabLayout ได้ดังนี้:

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

และแก้ไขปัญหาได้ทั้งสีและความสูงของตัวบ่งชี้แท็บสามารถเปลี่ยนได้จากค่าเริ่มต้น


5
มีวิธีเปลี่ยน 'tabSelectedTextColor' (ไม่ใช่สีหรือความสูงของ tabindicator) ผ่านรหัสจาวาหรือไม่
Prakash

2
แอป: แอตทริบิวต์ tabIndicatorColor ในวิดเจ็ต tabLayout xml เป็นการเปลี่ยนแปลงเดียวที่ฉันต้องการเพื่อแก้ไขปัญหานี้ ขอบคุณ!
Braden Holt

ฉันทำให้สิ่งนี้เป็นสไตล์ผู้ปกครอง:parent="@style/Base.Widget.Design.TabLayout"
Ultimo_m

โซลูชันนี้พบว่าถูกต้อง
Nikhil

101

ด้วยไลบรารีสนับสนุนการออกแบบคุณสามารถเปลี่ยนได้ใน xml:

ในการเปลี่ยนสีของตัวบ่งชี้ TabLayout:

app:tabIndicatorColor="@color/color"

ในการเปลี่ยนความสูงของตัวบ่งชี้ TabLayout:

app:tabIndicatorHeight="4dp"

4
ฉันใส่บรรทัดนี้ แต่สียังคงเป็นสีที่เน้น
Mahdi

@ Kenji คุณแน่ใจหรือไม่ว่าบรรทัดนี้ถูกวางไว้ใน TabLayout และไม่ได้อยู่ในบิต Toolbar ของ xml วางผิดตำแหน่งได้ง่าย :)
Wes Winn

โซลูชั่นที่สมบูรณ์แบบสำหรับความสูง มันทำงานได้ดี ขอบคุณ Malek
Hardik Joshi

1
จะทำอย่างไรหากต้องการใช้สีไล่ระดับแทน
hamza khan

35

เนื่องจากฉันไม่สามารถโพสต์ติดตามความคิดเห็นของนักพัฒนา Android ได้นี่คือคำตอบที่อัปเดตสำหรับคนอื่น ๆ ที่ต้องการตั้งค่าสีตัวบ่งชี้แท็บที่เลือกโดยใช้โปรแกรม:

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

ในทำนองเดียวกันสำหรับความสูง:

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

วิธีการเหล่านี้เพิ่งถูกเพิ่มเข้าไปในการแก้ไข 23.0.0 ของไลบรารี Supportซึ่งเป็นเหตุผลว่าทำไมคำตอบของ Soheil Setayeshi จึงใช้การสะท้อนกลับ


2
setSelectedTabIndicatorHeight เลิกใช้แล้วตอนนี้คิดว่าจะใช้อะไรดี
Michalsx


13

ด้วยไลบรารีการสนับสนุน desing v23คุณสามารถตั้งค่าสีและความสูงโดยทางโปรแกรมได้

ใช้สำหรับความสูง:

TabLayout.setSelectedTabIndicatorHeight(int height)

นี่Javadoc อย่างเป็นทางการ

เพียงใช้สำหรับสี:

TabLayout.setSelectedTabIndicatorColor(int color)

นี่Javadoc อย่างเป็นทางการ

คุณจะพบข้อมูลในGoogle Trackerได้ที่นี่


เราควรใช้เลขจำนวนเต็มสีอะไร?
the_prole

คุณสามารถใช้คลาสสีเช่น Color.RED
Soumya

setSelectedTabIndicatorHeight เลิกใช้แล้ว
APP

9

ในการเปลี่ยนสีและความสูงของตัวบ่งชี้โดยใช้โปรแกรมคุณสามารถใช้การสะท้อน ตัวอย่างเช่นรหัสสีตัวบ่งชี้ใช้ด้านล่าง:

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

และหากต้องการเปลี่ยนความสูงของตัวบ่งชี้ให้ใช้ "setSelectedIndicatorHeight" แทน "setSelectedIndicatorColor" จากนั้นเรียกใช้ตามความสูงที่คุณต้องการ


1
ขอบคุณ! สิ่งนี้ช่วยฉันได้! ฉันเดาว่า Google ลืมระบุวิธีการนี้ในห้องสมุดสนับสนุน
Shinta S

1
เหตุใดจึงต้องใช้การสะท้อนหากมีอยู่แล้วเป็นฟังก์ชันสาธารณะ developer.android.com/reference/android/support/design/widget/…
android

@SoheilSetayeshi โอ้โอเค ขอบคุณ. บางทีคุณควรอัปเดตคำตอบแล้ว
นักพัฒนา Android

1
แต่นี่เป็นโซลูชันที่สมบูรณ์แบบสำหรับ API ด้านล่างสนับสนุนไลบรารี 23.0.0 ฉันหมายถึง Whaao! คำตอบที่ดี!
sud007

6

Foto indicator ใช้สิ่งนี้:

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

6

จาก xml:

app:tabIndicatorColor="#fff"

จาก java:

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


0

เพียงใส่บรรทัดนี้ในรหัสของคุณ หากคุณเปลี่ยนสีให้เปลี่ยนค่าสีในวงเล็บ

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

0

Android ทำให้เป็นเรื่องง่าย

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

ดังนั้นเราก็พูด

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

นั่นจะทำให้เรามีสีฟ้าปกติและสีม่วงที่เลือก

ตอนนี้เราตั้งค่าความสูง

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

และสำหรับความสูงเราว่า

mycooltablayout.setSelectedIndicatorHeight(6);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.