Schimbarea culorii „pornit” a unui comutator (Programare, Android, Togglebutton)

JamesSugrue a intrebat.

Folosesc un control Switch standard cu tema holo.light într-o aplicație ICS.

Vreau să schimb culoarea evidențiată sau a stării „on” a butonului Toggle de la albastru deschis standard la verde.

Acest lucru ar trebui să fie ușor, dar nu reușesc să aflu cum să o fac.

Comentarii

  • Nu prea văd altă cale decât să copiez resursele relevante ale platformei (selector și fișiere *.png) și să modific drawable-ul de stare „on”. Nu uitați să indicați Switch către acest selector personalizat după aceea. –  > Por MH..
23 răspunsuri
SubChord

Deocamdată este mai bine să folosiți SwitchCompat din biblioteca AppCompat.v7. Puteți folosi apoi un stil simplu pentru a schimba culoarea componentelor.

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>

ref: Android Developers Blog

EDITARE:

Modul în care ar trebui să fie aplicat corect este prin android:theme="@style/Theme.MyTheme" și, de asemenea, acest lucru poate fi aplicat la stilurile părintești, cum ar fi EditTexts, RadioButtons, Switches, CheckBoxes și ProgressBars:

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

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

Comentarii

  • Deși nu se aplică în acest moment, acesta ar trebui să fie răspunsul acceptat! –  > Por Andrew Gallasch.
  • Am schimbat acest răspuns în răspuns acceptat, deoarece pare a fi o abordare mai „modernă” a acestei întrebări. –  > Por JamesSugrue.
  • Am încercat toate acestea și niciuna dintre ele nu a schimbat culoarea stării „pornit” pentru întrerupătorul meu. –  > Por Adam Johns.
  • 36

  • „pornit” este colorAccent, , „oprit” este colorSwitchThumbNormal. Dacă se utilizează AppCompat trebuie să utilizați SwitchCompat în loc de Switch. Dacă utilizați SDK 23+, puteți utiliza android:thumbTint și android:thumbTintMode cu un ColorStateList. –  > Por Tom.
  • @Tom plz răspundeți-mi dacă aceste lucruri ‘android:thumbTint’ vor funcționa pe dispozitive < 23 –  > Por Shirish Herwade.
Hitesh Sahu

Târziu la petrecere, dar acesta este modul în care am făcut

Stilul

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

Culori

Layout

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

Rezultat

A se vedea schimbarea culorilor pentru comutatorul activat și dezactivat

Comentarii

    15

  • @MaksimKniazev Trebuie să utilizați SwitchCompat 😉 –  > Por Ovi Trif.
  • Bun, cu excepția lui colorControlActivated – nu setează culoarea pistei, ci doar culoarea degetului mare. –  > Por Pointer Null.
  • aici este soluția pentru Switch și SwitchCompat: stackoverflow.com/a/47036089/5869630 –  > Por roghayeh hosseini.
  • <style> etichetele trebuiau să fie scrise sub res>>values>>styles.xml și pe pagina XML pentru <Switch …> ar trebui să adăugați doar linia numită: android_theme=”@style/SCBSwitch și culorile mele sunt: colorControlActivated”>#ff0000 și colorSwitchThumbNormal”>#00ff00 și android:colorForeground”>#00ff00 –  > Por Bay.
  • @OviTrif Minunat! Este impresionant cât de greu este să găsești o informație simplă ca aceasta. Multe și multe răspunsuri am citit și nimeni, nu a dat un răspuns funcțional până acum. În sfârșit! –  > Por jairhumberto.
arlomedia

Acest lucru este de lucru pentru mine (necesită 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);

Rețineți că starea „implicită” trebuie să fie adăugată ultima, așa cum se arată aici.

Singura problemă pe care o văd este că „degetul mare” al comutatorului apare acum mai mare decât fundalul sau „pista” comutatorului. Cred că acest lucru se datorează faptului că încă folosesc imaginea implicită a pistei, care are un spațiu gol în jurul ei. Cu toate acestea, când am încercat să personalizez imaginea pistei folosind această tehnică, comutatorul meu părea să aibă o înălțime de 1 pixel, apărând doar o fărâmă din textul pornit/oprit. Trebuie să existe o soluție pentru asta, dar nu am găsit-o încă…

Actualizare pentru Android 5

În Android 5, codul de mai sus face ca întrerupătorul să dispară complet. Ar trebui să putem folosi noul setButtonTintList dar aceasta pare să fie ignorată pentru comutatoare. Dar acest lucru funcționează:

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

Actualizare pentru Android 6-7

După cum a afirmat Cheruby în comentarii, putem folosi noua metodă setThumbTintList și asta a funcționat așa cum era de așteptat pentru mine. De asemenea, putem utiliza setTrackTintList, , dar care aplică culoarea ca un amestec, cu un rezultat care este mai întunecat decât era de așteptat în temele de culoare închisă și mai deschis decât era de așteptat în temele de culoare deschisă, uneori până la punctul de a fi invizibil. În Android 7, am reușit să minimizez această modificare care prin suprascrierea pistei tint mode, , dar nu am putut obține rezultate decente din acest lucru în Android 6. S-ar putea să fie nevoie să definiți culori suplimentare care să compenseze amestecul. (Aveți vreodată sentimentul că Google nu dorește să personalizăm aspectul aplicațiilor noastre?).

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

Comentarii

  • Eu folosesc abordarea getThumbDrawable/getTrackDrawable pentru a crea un comutator în care ambele stări au aceeași culoare – cu alte cuvinte, comutatorul nu activează/dezactivează ceva, ci este folosit pentru o alegere între două alternative. –  > Por Natix.
  • Am înțeles că DrawableCompat.setTintList va permite ca acesta să funcționeze pe dispozitivele anterioare. Eu sun: DrawableCompat.setTintList(switchCompat.getThumbDrawable(), foregroundState); –  > Por Alexey.
  • Vă rugăm să editați răspunsul pentru a include soluția DrawableCompat. Funcționează perfect! –  > Por Dmytro Karataiev.
  • API 23+: switchInput.setThumbTintList(buttonStates); funcționează și pentru Nougat. API 21-22: Utilizați DrawableCompat, așa cum a sugerat @Alexey. Site-ul switchInput.setButtonTintList(buttonStates); nu a funcționat pentru mine, nu a colorat stările pentru Switch-ul meu. API sub 21: switchInput.getThumbDrawable().setColorFilter(someColor, PorterDuff.Mode.SrcIn); Acestea au funcționat pentru mine. Am lucrat și cu Xamarin, așa că, dacă folosiți Xamarin.Forms, traduceți-le în C# în randările Android. –  > Por Tiffany.
Kevin ABRIOUX

Pentru a schimba stilul Switch fără a utiliza style.xml sau codul Java, puteți personaliza Switch în layout 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" />

Este un atribut android:thumbTint și android:trackTint care vă permit să personalizați culoarea

Acesta este rezultatul vizual pentru acest XML:

Comentarii

    22

  • Acest lucru schimbă culoarea degetului mare, indiferent dacă este activat sau dezactivat. –  > Por dezvoltator android.
  • „Atributul thumbTint este utilizat numai la nivelul API 21 și mai sus” – –  > Por norbDEV.
  • @norbDEV folosiți app:thumbTint și app:trackTint cu SwitchCompat din biblioteca AppCompat.v7 pentru un nivel API mai mic. –  > Por David Darias.
  • Asta funcționează, dar ce se întâmplă dacă doriți să schimbați culoarea pentru degetul mare, în funcție de faptul că este activat sau dezactivat? –  > Por TavernSenses.
  • Dacă doriți să utilizați thumbTint mai jos 21 utilizarea app:thumbTint în loc de android:thumbTint și se modifică switch cu SwitchCompat –  > Por Kavita_p.
francisco_ssb

Creați un Switch personalizat și suprascrieți setChecked pentru a schimba culoarea:

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

Comentarii

  • Prima postare care m-a ajutat de fapt să obțin o culoare personalizată pentru Material Switch fără a folosi stilul sau temele. Mulțumesc ! –  > Por Mackovich.
  • Frumos. Aveam deja propriul Switch personalizat, așa că a trebuit doar să suprascriu metoda setChecked și toate și-au schimbat automat culorile. Mulțumesc din Spania. –  > Por Julio.
  • Ușor și curat 🙂 –  > Por ErShakirAnsari.
wingear
<androidx.appcompat.widget.SwitchCompat
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                app_thumbTint="@color/white"
                app_trackTint="@drawable/checker_track"/>

Și în interiorul 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>

Comentarii

  • thumbTint se aplică numai pe Android API 21 și mai sus. Cum dacă vreau să schimb culoarea pe mai jos de Android 21? –  > Por Giovanka Bisano.
  • developer.android.com/reference/android/support/v7/widget/… SwitchCompat este retrocompatibil cu API 7 și mai sus –  > Por wingear.
  • Este 2020. Chiar mă întreb unde în lume oamenii încă mai folosesc Android 21 și mai jos? –  > Por zeeshan.
Greg Ennis

În timp ce răspunsul lui SubChord este corect, nu răspunde cu adevărat la întrebarea cum să setați culoarea „on” fără a afecta și alte widget-uri. Pentru a face acest lucru, utilizați un ThemeOverlay în styles.xml:

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

Și faceți referire la acesta în comutatorul dvs:

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

În acest fel, va afecta NUMAI culoarea vizualizărilor la care doriți să o aplicați.

Comentarii

  • Dintr-un motiv oarecare, a trebuit să setez și „colorControlActivated” la aceeași valoare, totuși, pe POC, a fost suficient să folosesc „colorAccent”. Cum se face? –  > Por dezvoltator android.
remain4life

Ca o completare la răspunsurile existente: puteți personaliza degetul mare și pista folosind selectori în res/color dosar, de exemplu:

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>

Utilizați acești selectori pentru a personaliza nuanțele track și thumb:

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

Rețineți că, dacă utilizați standart Switch și android namespace pentru aceste atribute, va funcționa numai pentru API 23 și ulterior, așa că utilizați SwitchCompat cu app namespace xmlns:app="http://schemas.android.com/apk/res-auto" ca soluție universală.

Rezultat:

Comentarii

  • Meritați o medalie –  > Por Kishan Solanki.
  • Bravo, vă mulțumesc. –  > Por Vish.
  • Tu, prietene, ești un erou! Mulțumesc! –  > Por Michel Fernandes.
MCR

Am rezolvat-o prin actualizarea Filtrului de culoare atunci când a fost schimbată starea Comutatorului…

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

Golgorz

Poate că este un pic cam târziu, dar pentru butoanele de comutare, butonul toogle nu este răspunsul, trebuie să schimbați drawable în parametrul xml al comutatorului:

 android_thumb="your drawable here"

مهند عطية

faceți 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>

și faceți 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>

și adăugați-le în Switch :

<Switch
        android_trackTint="@drawable/newtrack"
        android_thumbTint="@drawable/newthumb"
         />

Comentarii

  • Acest lucru funcționează. Cu toate acestea, trebuie remarcat faptul că AndroidStudio nu va putea sugera resurse @drawable pentru trackTint sau thumbTint. Trebuie să o scrieți manual și funcționează. –  > Por Benjamin Basmaci.
  • Din anumite motive, acesta este singurul răspuns care funcționează în mod fiabil pe Huawei-ul meu. Mulțumesc! –  > Por einUsername.
emen

În Android Lollipop și mai sus, definiți-l în stilul temei dvs:

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

Comentarii

  • Problema cu această soluție este că modifică și culorile textelor mele selectate, ceea ce nu este ceea ce vreau. –  > Por codewing.
  • @codewing Bineînțeles că da. Pentru că acest lucru este setat în preferințele stilului global. Pentru a vă atinge obiectivul, este de a găsi ID-ul de vizualizare al vizualizării țintă și de a modifica atributele acesteia. –  > Por emen.
  • OK, asta e pentru poziția „On”. Ce ziceți de modificarea culorii degetului mare pentru poziția „Off”? –  > Por TavernSenses.
you786

Creează-ți propria imagine cu 9 patch-uri și setează-o ca fundal al butonului de comutare.

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

Comentarii

  • Da, aș putea face asta, dar cu siguranță TREBUIE să existe o modalitate mai ușoară? Selectori poate? –  > Por JamesSugrue.
  • Nu, nu există o modalitate mai ușoară. Nu poți schimba în mod magic culoarea unei imagini 🙂 –  > Por you786.
  • Bună observație. Nu am înțeles pe deplin cum funcționează până când nu m-am uitat mai atent. –  > Por JamesSugrue.
  • @Denizen, Sunteți sigur? Dacă da, postează un răspuns și îl voi vota. –  > Por you786.
  • @Denizen Te rog să elimini comentariul tău. Android Switch returnează întotdeauna null pentru getBackground(), am pierdut 30 de minute încercând acest lucru. –  > Por Shirish Herwade.
Daniele D.

Soluția sugerată de arlomedia a funcționat pentru mine. în legătură cu problema lui de extraspace am rezolvat îndepărtând toate padding-urile la switch.

EDITARE

Așa cum am cerut, iată ce am.

În fișierul de layout, comutatorul meu se află în interiorul unui layout liniar și după un 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>

Deoarece lucrez cu Xamarin / Monodroid (min. Android 4.1) codul meu este:

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 este definit anterior astfel (Xamarin):

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

Nu setez deloc padding-urile și nu chem .setPadding(0, 0, 0, 0, 0, 0).

Comentarii

  • Puteți furniza codul pentru asta? Am încercat switchInput.setPadding(0, 0, 0, 0, 0, 0), dar nu s-a schimbat nimic. –  > Por arlomedia.
  • Testat în Xamarin folosind biblioteca AppCompat pentru a viza 5.x și a funcționat așa cum a fost anunțat. –  > Por Alex.Ritna.
Ege Kuzubasioglu

Cea mai ușoară modalitate este definirea track tint și setarea modului tint la src_over pentru a elimina transparența de 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>

yousef

puteți face un stil personalizat pentru widgetul de comutare care utilizează accentul de culoare în mod implicit atunci când faceți un stil personalizat pentru acesta

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

Mike Yang

Puteți încerca această librărie, ușor de schimbat culoarea pentru butonul de comutare.
https://github.com/kyleduo/SwitchButton

Sourav Rana

Acest lucru a funcționat pentru mine -:

1.code in values/styles.xml -:

 <style name="SwitchTheme" parent="Theme.AppCompat.Light">
    <item name="android:colorControlActivated">#148E13</item>
</style>

2.adăugați următoarea linie de cod în switch în layout fișier -:

android:theme="@style/SwitchTheme"

Shamm

Încercați să găsiți răspunsul corect aici: Selector pe culoarea de fundal a TextView.În două cuvinte, ar trebui să creați Shape în XML cu culoarea și apoi să o atribuiți la starea „checked” în selector.

Comentarii

  • Frumoasă soluție, dar știți cum putem schimba culoarea în mod dinamic? –  > Por inverted_index.
  • Trebuie doar să setați selectorul ca resursă de fundal –  > Por Shamm.
erluxman

Nu știu cum să o fac din java, dar dacă aveți un stil definit pentru aplicația dvs. puteți adăuga această linie în stilul dvs. și veți avea culoarea dorită pentru mine am folosit #3F51B5

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

ROHIT LIEN

În xml , puteți schimba culoarea ca :

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

În mod dinamic, puteți schimba ca :

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

Francislainy Campos

Pe baza unei combinații a câtorva răspunsuri de aici, iată ce a funcționat pentru mine.

<Switch
    android_trackTintMode="src_over"
    android_thumbTint="@color/white"
    android_trackTint="@color/shadow"
    android_checked="true"
    android_layout_width="wrap_content"
    android_layout_height="wrap_content"/>

ChristianYami

Soluție pentru Android Studio 3.6:

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

Schimbă culoarea textului de a în fișierul XML de culoare valoarea definită (yourColor).