เปลี่ยนสี“ เปิด” ของสวิตช์


156

ฉันกำลังใช้สวิตช์ควบคุมมาตรฐานกับชุดรูปแบบ holo.light ในแอป ICS

ฉันต้องการเปลี่ยนสีที่ไฮไลต์หรือสีสถานะของปุ่มสลับจากสีน้ำเงินมาตรฐานเป็นสีเขียว

นี่ควรจะง่าย แต่ฉันไม่สามารถหาวิธีที่จะทำได้


ฉันไม่เห็นวิธีอื่นนอกจากการคัดลอกทรัพยากรแพลตฟอร์มที่เกี่ยวข้อง (ตัวเลือกและไฟล์ * .png) และแก้ไขสถานะ 'เปิด' อย่าลืมชี้Switchไปที่ตัวเลือกที่กำหนดเองนี้ในภายหลัง
MH

คำตอบ:


100

ณ ตอนนี้มันจะดีกว่าที่จะใช้ SwitchCompat จากไลบรารี AppCompat.v7 จากนั้นคุณสามารถใช้สไตล์ที่เรียบง่ายเพื่อเปลี่ยนสีของส่วนประกอบของคุณ

values/themes.xml:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
    <!-- colorPrimary is used for the default action bar background -->
    <item name="colorPrimary">@color/my_awesome_color</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/my_awesome_darker_color</item>

    <!-- colorAccent is used as the default value for colorControlActivated,
         which is used to tint widgets -->
    <item name="colorAccent">@color/accent</item>

    <!-- You can also set colorControlNormal, colorControlActivated
         colorControlHighlight, and colorSwitchThumbNormal. -->

</style>

อ้างอิง: บล็อกนักพัฒนา Android

แก้ไข :

วิธีที่ควรใช้อย่างถูกต้องคือผ่านandroid:theme="@style/Theme.MyTheme" และยังสามารถใช้กับลักษณะหลักเช่น EditTexts, RadioButtons, Switch, CheckBoxes และ ProgressBars:

<style name="My.Widget.ProgressBar" parent="Widget.AppCompat.ProgressBar">

<style name="My.Widget.Checkbox" parent="Widget.AppCompat.CompoundButton.CheckBox">

1
แม้ว่าจะไม่สามารถใช้ได้ในเวลานี้ควรเป็นคำตอบที่ยอมรับได้!
Andrew Gallasch

เปลี่ยนสิ่งนี้เป็นคำตอบที่ยอมรับได้เนื่องจากดูเหมือนว่า "ทันสมัย" มากขึ้นสำหรับคำถามนี้
JamesSugrue

1
ฉันลองทั้งหมดเหล่านี้และไม่มีใครเปลี่ยนสีของสถานะ "เปิด" สำหรับสวิตช์ของฉัน
Adam Johns

31
'ใน' เป็นcolorAccent'ปิด' colorSwitchThumbNormalคือ หากใช้AppCompatธีมคุณจำเป็นต้องใช้มากกว่าSwitchCompat Switchหากมีการใช้ SDK 23+ คุณสามารถใช้android:thumbTintและมีandroid:thumbTintMode ColorStateList
Tom

1
@Tom plz จะเป็นสิ่งที่ 'android: thumbTint' จะทำงานบนอุปกรณ์ <23
Shirish Herwade

269

มาปาร์ตี้ช้า แต่นี่เป็นวิธีที่ฉันทำ

สไตล์

 <style name="SCBSwitch" parent="Theme.AppCompat.Light">
        <!-- active thumb & track color (30% transparency) -->
        <item name="colorControlActivated">#46bdbf</item>

        <!-- inactive thumb color -->
        <item name="colorSwitchThumbNormal">#f1f1f1
        </item>

        <!-- inactive track color (30% transparency) -->
        <item name="android:colorForeground">#42221f1f
        </item>
    </style>

สี

ป้อนคำอธิบายรูปภาพที่นี่

แบบ

<android.support.v7.widget.SwitchCompat
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:checked="false"
    android:theme="@style/SCBSwitch" />

ผลลัพธ์

ดูการเปลี่ยนสีสำหรับเปิดใช้งานและปิดการใช้งานสวิตช์

ป้อนคำอธิบายรูปภาพที่นี่


14
@MaksimKniazev คุณต้องใช้SwitchCompat;)
Ovi Trif

1
ดียกเว้น colorControlActivated - ไม่ได้ตั้งค่าสีแทร็กเพียงสีเดียว
ตัวชี้ Null

1
นี่คือวิธีแก้ปัญหาสำหรับ Switch และ SwitchCompat: stackoverflow.com/a/47036089/5869630
roghayeh hosseini

แท็ก <style> จำเป็นต้องเขียนภายใต้ res >> values ​​>> styles.xml และในหน้า XML สำหรับ <Switch ... > คุณควรเพิ่มเฉพาะบรรทัดที่เรียกว่า: android: theme = "@ style / SCBSwitch และสีของฉันคือ : colorControlActivated "> # ff0000 และ colorSwitchThumbNormal"> # 00ff00 และ android: colorForeground "> # 00ff00
อ่าว

@OviTrif สุดยอด! มันน่าประทับใจที่การหาข้อมูลแบบง่าย ๆ นั้นยากเพียงใด มีคำตอบมากมายที่ฉันอ่านและไม่มีใครตอบคำถามที่ทำงานได้จนถึงตอนนี้ ที่สุด!
jairhumberto ถึง

49

สิ่งนี้ใช้ได้สำหรับฉัน (ต้องใช้ Android 4.1):

Switch switchInput = new Switch(this);
int colorOn = 0xFF323E46;
int colorOff = 0xFF666666;
int colorDisabled = 0xFF333333;
StateListDrawable thumbStates = new StateListDrawable();
thumbStates.addState(new int[]{android.R.attr.state_checked}, new ColorDrawable(colorOn));
thumbStates.addState(new int[]{-android.R.attr.state_enabled}, new ColorDrawable(colorDisabled));
thumbStates.addState(new int[]{}, new ColorDrawable(colorOff)); // this one has to come last
switchInput.setThumbDrawable(thumbStates);

โปรดทราบว่าจะต้องเพิ่มสถานะ "เริ่มต้น" ครั้งล่าสุดตามที่แสดงที่นี่

ปัญหาเดียวที่ฉันเห็นคือตอนนี้ "thumb" ของสวิตช์นั้นใหญ่กว่า background หรือ "track" ของสวิตช์ ฉันคิดว่าเป็นเพราะฉันยังคงใช้อิมเมจแทร็กเริ่มต้นซึ่งมีพื้นที่ว่างอยู่รอบ ๆ อย่างไรก็ตามเมื่อฉันพยายามปรับแต่งภาพแทร็กโดยใช้เทคนิคนี้สวิตช์ของฉันมีความสูง 1 พิกเซลโดยมีข้อความเปิด / ปิดเพียงเล็กน้อยเท่านั้น ต้องมีวิธีแก้ปัญหาสำหรับสิ่งนั้น แต่ฉันยังไม่พบ ...

อัปเดตสำหรับ Android 5

ใน Android 5 รหัสด้านบนทำให้สวิตช์หายไปอย่างสมบูรณ์ เราควรจะสามารถใช้เมธอดsetButtonTintListใหม่ได้ แต่ดูเหมือนว่าสิ่งนี้จะถูกละเว้นสำหรับสวิตช์ แต่งานนี้:

ColorStateList buttonStates = new ColorStateList(
        new int[][]{
                new int[]{-android.R.attr.state_enabled},
                new int[]{android.R.attr.state_checked},
                new int[]{}
        },
        new int[]{
                Color.BLUE,
                Color.RED,
                Color.GREEN
        }
);
switchInput.getThumbDrawable().setTintList(buttonStates);
switchInput.getTrackDrawable().setTintList(buttonStates);

อัพเดทสำหรับ Android 6-7

ดังที่เครูบระบุไว้ในความคิดเห็นเราสามารถใช้สิ่งใหม่setThumbTintListและทำงานได้ตามที่คาดไว้สำหรับฉัน นอกจากนี้เรายังสามารถใช้setTrackTintListแต่ใช้สีเป็นการผสมผสานด้วยผลลัพธ์ที่มืดกว่าที่คาดในชุดรูปแบบสีเข้มและเบากว่าที่คาดไว้ในชุดรูปแบบสีอ่อนบางครั้งถึงจุดที่มองไม่เห็น ใน Android 7 ฉันสามารถลดการเปลี่ยนแปลงนั้นด้วยการแทนที่โหมดติดตามสีแต่ฉันไม่สามารถรับผลลัพธ์ที่ดีจากใน Android 6 คุณอาจต้องกำหนดสีพิเศษที่ชดเชยการผสม (คุณเคยรู้สึกว่า Google ไม่ต้องการให้เราปรับแต่งรูปลักษณ์ของแอพของเราหรือไม่)

ColorStateList thumbStates = new ColorStateList(
        new int[][]{
                new int[]{-android.R.attr.state_enabled},
                new int[]{android.R.attr.state_checked},
                new int[]{}
        },
        new int[]{
                Color.BLUE,
                Color.RED,
                Color.GREEN
        }
);
switchInput.setThumbTintList(thumbStates);
if (Build.VERSION.SDK_INT >= 24) {
    ColorStateList trackStates = new ColorStateList(
            new int[][]{
                    new int[]{-android.R.attr.state_enabled},
                    new int[]{}
            },
            new int[]{
                    Color.GRAY,
                    Color.LTGRAY
            }
    );
    switchInput.setTrackTintList(trackStates);
    switchInput.setTrackTintMode(PorterDuff.Mode.OVERLAY);
}

ฉันใช้วิธี getThumbDrawable / getTrackDrawable เพื่อสร้างสวิตช์ที่ทั้งสองรัฐมีสีเดียวกัน - กล่าวอีกนัยหนึ่งสวิตช์ไม่เปิดใช้งาน / ปิดใช้งานบางอย่าง แต่ใช้สำหรับตัวเลือกระหว่างสองทางเลือก
Natix

4
มี DrawableCompat.setTintList ที่จะอนุญาตให้ทำงานบนอุปกรณ์ก่อนหน้า ฉันเรียก: DrawableCompat.setTintList (switchCompat.getThumbDrawable (), foregroundState);
Alexey

โปรดแก้ไขคำตอบเพื่อรวมโซลูชัน DrawableCompat มันทำงานได้อย่างสมบูรณ์แบบ!
Dmytro Karataiev

API 23+: ใช้switchInput.setThumbTintList(buttonStates); งานได้กับ Nougat เช่นกัน API 21-22: ใช้ DrawableCompat ตามที่แนะนำโดย @Alexey การใช้งานswitchInput.setButtonTintList(buttonStates);ไม่ได้สำหรับฉันมันไม่ได้ระบายสีสถานะสำหรับสวิตช์ของฉัน API ด้านล่าง 21: สิ่ง switchInput.getThumbDrawable().setColorFilter(someColor, PorterDuff.Mode.SrcIn); เหล่านี้ใช้ได้สำหรับฉัน ฉันทำงานกับ Xamarin ด้วยดังนั้นแปลมันเป็น C # ใน Android renderers ถ้าคุณใช้ Xamarin.Forms
Cheruby

37

ในการเปลี่ยนสไตล์สวิทช์โดยไม่ต้องใช้ style.xml หรือรหัส Java คุณสามารถปรับแต่งสวิทช์เป็น XML รูปแบบ:

<Switch
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:thumbTint="@color/blue"
        android:trackTint="@color/white"
        android:checked="true"
        android:layout_height="wrap_content" />

เป็นคุณลักษณะandroid: thumbTintและandroid: trackTintที่อนุญาตให้คุณปรับแต่งสี

นี่คือผลลัพธ์ที่มองเห็นได้สำหรับ XML นี้:

ป้อนคำอธิบายรูปภาพที่นี่


17
สิ่งนี้จะเปลี่ยนสีของนิ้วโป้งไม่ว่าจะเปิดหรือปิดก็ตาม
นักพัฒนา Android

1
"แอ็ตทริบิวต์ thumbTint ใช้เฉพาะใน API ระดับ 21 และสูงกว่า"
norbDEV

6
@norbDEV ใช้แอพ: thumbTint และ app: trackTint ด้วย SwitchCompat จากไลบรารี AppCompat.v7 สำหรับระดับ API ที่ต่ำกว่า
David Darias

ใช้งานได้ แต่ถ้าคุณต้องการเปลี่ยนสีของนิ้วหัวแม่มือขึ้นอยู่กับว่าเปิดหรือปิดอยู่
TavernSenses

2
หากคุณต้องการใช้thumbTintด้านล่าง 21 การใช้งานapp:thumbTintแทนandroid:thumbTintและเปลี่ยนswitchด้วยSwitchCompat
Kavita_p

33

สร้าง Switch ที่กำหนดเองและแทนที่ setChecked เพื่อเปลี่ยนสี:

  public class SwitchPlus extends Switch {

    public SwitchPlus(Context context) {
        super(context);
    }

    public SwitchPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SwitchPlus(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setChecked(boolean checked) {
        super.setChecked(checked);
        changeColor(checked);
    }

    private void changeColor(boolean isChecked) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            int thumbColor;
            int trackColor;

            if(isChecked) {
                thumbColor = Color.argb(255, 253, 153, 0);
                trackColor = thumbColor;
            } else {
                thumbColor = Color.argb(255, 236, 236, 236);
                trackColor = Color.argb(255, 0, 0, 0);
            }

            try {
                getThumbDrawable().setColorFilter(thumbColor, PorterDuff.Mode.MULTIPLY);
                getTrackDrawable().setColorFilter(trackColor, PorterDuff.Mode.MULTIPLY);
            }
            catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
    }
}

2
โพสต์แรกที่จริง ๆ แล้วช่วยให้ฉันได้สีที่กำหนดเองสำหรับ Material Switch โดยไม่ใช้สไตล์หรือธีม ขอบคุณมาก!
Mackovich

1
ดี ฉันมีสวิตช์แบบกำหนดเองของฉันเองแล้วดังนั้นฉันจึงต้องแทนที่เมธอด setChecked เท่านั้นและทั้งหมดเปลี่ยนสีโดยอัตโนมัติ ขอบคุณจากสเปน
Julio

22

ในขณะที่คำตอบโดย SubChord ถูกต้องไม่ตอบคำถามเกี่ยวกับวิธีการตั้งค่าสี "เป็น" โดยไม่ส่งผลกระทบต่อวิดเจ็ตอื่น ๆ หากต้องการทำสิ่งนี้ให้ใช้ a ThemeOverlayใน styles.xml:

<style name="ToggleSwitchTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/green_bright</item>
</style>

และอ้างอิงในสวิตช์ของคุณ:

<android.support.v7.widget.SwitchCompat
  android:theme="@style/ToggleSwitchTheme" ... />

การทำเช่นนี้จะส่งผลต่อสีของมุมมองที่คุณต้องการใช้เท่านั้น


ด้วยเหตุผลบางอย่างฉันต้องตั้งค่า "colorControlActivated" เป็นค่าเดียวกัน แต่ใน POC มันก็เพียงพอที่จะใช้ "colorAccent" มาทำไม
นักพัฒนา Android

22
<androidx.appcompat.widget.SwitchCompat
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:thumbTint="@color/white"
                app:trackTint="@drawable/checker_track"/>

และภายใน checker_track.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/lightish_blue" android:state_checked="true"/>
    <item android:color="@color/hint" android:state_checked="false"/>
</selector>

thumbTintใช้กับ Android API 21 ขึ้นไปเท่านั้น ถ้าฉันต้องการเปลี่ยนสีบน Android 21 ด้านล่าง
Giovanka Bisano

developer.android.com/reference/android/support/v7/widget/… SwitchCompat สามารถทำงานร่วมกับ API 7 ขึ้นไปได้
wingear

1
มันเป็นปี 2020 ฉันสงสัยจริงๆว่าในโลกที่ผู้คนยังคงใช้ Android 21 และด้านล่าง?
Zeeshan

18

ฉันแก้ไขได้โดยการอัพเดตตัวกรองสีเมื่อสถานะสวิทช์เปลี่ยนไป ...

public void bind(DetailItem item) {
    switchColor(item.toggle);
    listSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                switchColor(b);
        }
    });
}

private void switchColor(boolean checked) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        listSwitch.getThumbDrawable().setColorFilter(checked ? Color.BLACK : Color.WHITE, PorterDuff.Mode.MULTIPLY);
        listSwitch.getTrackDrawable().setColorFilter(!checked ? Color.BLACK : Color.WHITE, PorterDuff.Mode.MULTIPLY);
    }
}

13

อาจช้าไปหน่อย แต่สำหรับปุ่มเปลี่ยนปุ่ม toogle ไม่ใช่คำตอบคุณต้องเปลี่ยน drawable ในพารามิเตอร์ xml ของสวิตช์:

 android:thumb="your drawable here"

9

ทำให้ drawable "newthumb.xml"

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/Green" android:state_checked="true"/>
    <item android:color="@color/Red" android:state_checked="false"/>
</selector>

และทำให้ drawable "newtrack.xml"

<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@color/black" android:state_checked="true"/>
        <item android:color="@color/white" android:state_checked="false"/>
    </selector>

และเพิ่มใน Switch:

<Switch
        android:trackTint="@drawable/newtrack"
        android:thumbTint="@drawable/newthumb"
         />

1
วิธีนี้ใช้ได้ผล แต่ก็ควรจะตั้งข้อสังเกตว่า AndroidStudio จะไม่สามารถที่จะแนะนำทรัพยากร @drawable สำหรับหรือtrackTint thumbTintหนึ่งต้องเขียนด้วยตนเองและใช้งานได้
Benjamin Basmaci

ด้วยเหตุผลบางอย่างนี่เป็นคำตอบเดียวที่ทำงานบน Huawei ได้อย่างน่าเชื่อถือ ขอบคุณ!
einUsername

7

ใน Android Lollipop ขึ้นไปให้นิยามในสไตล์ของคุณ:

<style name="BaseAppTheme" parent="Material.Theme">
    ...
    <item name="android:colorControlActivated">@color/color_switch</item>
</style>

ปัญหาเกี่ยวกับวิธีแก้ไขปัญหานี้คือมันเปลี่ยนสีของ textedits ที่ฉันเลือกซึ่งไม่ใช่สิ่งที่ฉันต้องการ
เขียนโปรแกรม

@codewing แน่นอนมันจะ เพราะสิ่งนี้ถูกตั้งค่าในการกำหนดลักษณะทั่วโลก เพื่อให้บรรลุเป้าหมายของคุณคือการค้นหารหัสมุมมองของมุมมองเป้าหมายของคุณและปรับเปลี่ยนแอตทริบิวต์
emen

ตกลงนั่นคือสำหรับตำแหน่ง "เปิด" สิ่งที่เกี่ยวกับการเปลี่ยนสีนิ้วหัวแม่มือสำหรับตำแหน่ง "ปิด"?
TavernSenses

7

สร้างอิมเมจ 9 แพตช์ของคุณเองและตั้งเป็นพื้นหลังของปุ่มสลับ

http://radleymarx.com/2011/simple-guide-to-9-patch/


2
ใช่สามารถทำได้ แต่แน่นอนว่าต้องมีวิธีที่ง่ายกว่า? อาจจะเลือกเตอร์?
JamesSugrue

ไม่ไม่มีวิธีที่ง่ายกว่า คุณไม่สามารถเปลี่ยนสีของภาพได้อย่างน่าอัศจรรย์ :)
786

จุดดี. ฉันไม่เข้าใจวิธีการทำงานอย่างเต็มที่จนกว่าฉันจะได้มองลึกลงไป
JamesSugrue

@Denizen คุณแน่ใจเหรอ? ถ้าเป็นเช่นนั้นโพสต์คำตอบและฉันจะโหวตให้
you786

@Denizen โปรดลบความคิดเห็นของคุณ Android Switch ส่งคืนค่า null เสมอสำหรับ getBackground () ฉันเสียเวลาลอง 30 นาที
Shirish Herwade

5

วิธีแก้ปัญหาที่แนะนำจาก arlomedia ใช้ได้สำหรับฉัน เกี่ยวกับปัญหาเรื่อง extraspace ของเขาฉันแก้ไขการเอาส่วนขยายทั้งหมดไปที่สวิตช์

แก้ไข

ตามที่ร้องขอนี่คือสิ่งที่ฉันมี

ในไฟล์เลย์เอาต์สวิตช์ของฉันอยู่ภายในเลย์เอาต์แบบเส้นตรงและหลัง TextView

<LinearLayout
        android:id="@+id/myLinearLayout"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_gravity="center_horizontal|center"
        android:gravity="right"
        android:padding="10dp"
        android:layout_marginTop="0dp"
        android:background="@drawable/bkg_myLinearLayout"
        android:layout_marginBottom="0dp">
        <TextView
            android:id="@+id/myTextForTheSwitch"
            android:layout_height="wrap_content"
            android:text="@string/TextForTheSwitch"
            android:textSize="18sp"
            android:layout_centerHorizontal="true"
            android:layout_gravity="center_horizontal|center"
            android:gravity="right"
            android:layout_width="wrap_content"
            android:paddingRight="20dp"
            android:textColor="@color/text_white" />
        <Switch
            android:id="@+id/mySwitch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textOn="@string/On"
            android:textOff="@string/Off"
            android:layout_centerHorizontal="true"
            android:layout_gravity="center_horizontal"
            android:layout_toRightOf="@id/myTextForTheSwitch"
            android:layout_alignBaseline="@id/myTextForTheSwitch"
            android:gravity="right" />
    </LinearLayout>

ตั้งแต่ฉันทำงานกับ Xamarin / Monodroid (ขั้นต่ำ Android 4.1) รหัสของฉันคือ:

Android.Graphics.Color colorOn = Android.Graphics.Color.Green;
Android.Graphics.Color colorOff = Android.Graphics.Color.Gray;
Android.Graphics.Color colorDisabled = Android.Graphics.Color.Green;

StateListDrawable drawable = new StateListDrawable();
drawable.AddState(new int[] { Android.Resource.Attribute.StateChecked }, new ColorDrawable(colorOn));
drawable.AddState(new int[] { -Android.Resource.Attribute.StateEnabled }, new ColorDrawable(colorDisabled));
drawable.AddState(new int[] { }, new ColorDrawable(colorOff));

swtch_EnableEdit.ThumbDrawable = drawable;

ก่อนหน้านี้ swtch_EnableEdit ถูกกำหนดเช่นนี้ (Xamarin):

Switch swtch_EnableEdit = view.FindViewById<Switch>(Resource.Id.mySwitch);

ฉันไม่ได้ตั้งค่าช่องว่างภายในทั้งหมดและฉันไม่เรียก. setPadding (0, 0, 0, 0)


คุณสามารถให้รหัสสำหรับสิ่งนั้นได้หรือไม่? ฉันลอง switchInput.setPadding (0, 0, 0, 0) แต่ไม่มีอะไรเปลี่ยนแปลง
arlomedia

1
ทดสอบใน Xamarin โดยใช้ไลบรารี AppCompat เพื่อกำหนดเป้าหมาย 5.x และสิ่งนี้ทำงานได้ตามที่โฆษณาไว้
Alex.Ritna

4

คุณสามารถสร้างสไตล์ที่กำหนดเองสำหรับวิดเจ็ตสวิตช์ที่ใช้การเน้นสีเป็นค่าเริ่มต้นเมื่อทำสไตล์ที่กำหนดเอง

<style name="switchStyle" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>    <!-- set your color -->
</style>    


1

พยายามที่จะหาคำตอบได้ที่นี่: การเลือกสีพื้นหลังของ TextView คุณควรสร้างรูปร่างใน XML ด้วยคำสองคำจากนั้นกำหนดให้สถานะเป็น "ตรวจสอบ" ในตัวเลือกของคุณ


วิธีแก้ปัญหาที่ดี แต่คุณรู้ไหมว่าเราจะเปลี่ยนสีได้อย่างไร?
inverted_index

คุณเพียงแค่ตั้งค่าตัวเลือกเป็นทรัพยากรพื้นหลัง
Shamm

1

ฉันไม่รู้ว่าจะทำอย่างไรจาก java แต่ถ้าคุณมีสไตล์ที่กำหนดไว้สำหรับแอปของคุณคุณสามารถเพิ่มบรรทัดนี้ในสไตล์ของคุณและคุณจะมีสีที่ต้องการสำหรับฉันฉันได้ใช้ # 3F51B5

<color name="ascentColor">#3F51B5</color>

1

วิธีที่ง่ายที่สุดคือการกำหนดสีติดตามและการตั้งค่าโหมดสีเป็น src_over เพื่อลบความโปร่งใส 30%

android:trackTint="@drawable/toggle_style"
android:trackTintMode="src_over"

toggle_style.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/informationDefault"
        android:state_checked="true"
        />
    <item android:color="@color/textDisabled" android:state_checked="false"/>
</selector>

0

นอกเหนือจากคำตอบที่มีอยู่: คุณสามารถปรับแต่งหัวแม่มือและแทร็กโดยใช้ตัวเลือกใน res/colorโฟลเดอร์ตัวอย่างเช่น:

switch_track_selector

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/lightBlue"
        android:state_checked="true" />
    <item android:color="@color/grey"/>
</selector>

switch_thumb_selector

<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/darkBlue"
        android:state_checked="true" />
    <item android:color="@color/white"/>
</selector>

ใช้ตัวเลือกเหล่านี้เพื่อปรับแต่งสีแทร็กและนิ้วหัวแม่มือ:

<androidx.appcompat.widget.SwitchCompat
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:trackTint="@color/switch_track_selector"
    app:thumbTint="@color/switch_thumb_selector"/>

โปรดทราบว่าหากคุณใช้รูปแบบมาตรฐานSwitchและandroidเนมสเปซสำหรับแอตทริบิวต์เหล่านี้จะใช้งานได้กับ API 23 และใหม่กว่าเท่านั้นดังนั้นใช้SwitchCompatกับappเนมสเปซxmlns:app="http://schemas.android.com/apk/res-auto"เป็นโซลูชันสากล

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


0

ใน xml คุณสามารถเปลี่ยนสีเป็น:

 <androidx.appcompat.widget.SwitchCompat
    android:id="@+id/notificationSwitch"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checked="true"
    app:thumbTint="@color/darkBlue"
    app:trackTint="@color/colorGrey"/>

แบบไดนามิกคุณสามารถเปลี่ยนเป็น:

Switch.thumbDrawable.setColorFilter(ContextCompat.getColor(requireActivity(), R.color.darkBlue), PorterDuff.Mode.MULTIPLY)

-1

โซลูชันสำหรับ Android Studio 3.6:

yourSwitch.setTextColor(getResources().getColor(R.color.yourColor));

เปลี่ยนสีข้อความของ a ในค่าสีไฟล์ XML ที่กำหนด (yourColor)

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