To działa dla mnie (wymaga Androida 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);
Zauważ, że stan „domyślny” należy dodać jako ostatni, jak pokazano tutaj.
Jedynym problemem, jaki widzę, jest to, że „kciuk” przełącznika wydaje się teraz większy niż tło lub „ścieżka” przełącznika. Myślę, że to dlatego, że nadal używam domyślnego obrazu ścieżki, który ma wokół niego puste miejsce. Jednak gdy próbowałem dostosować obraz ścieżki za pomocą tej techniki, mój przełącznik wydawał się mieć wysokość 1 piksela z pojawianiem się tylko kawałka tekstu włączania / wyłączania. Musi być na to rozwiązanie, ale jeszcze go nie znalazłem ...
Aktualizacja dla Androida 5
W systemie Android 5 powyższy kod powoduje całkowite zniknięcie przełącznika. Powinniśmy móc użyć nowej metody setButtonTintList , ale wydaje się, że jest to ignorowane w przypadku przełączników. Ale to działa:
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);
Aktualizacja dla Androida 6-7
Jak stwierdził Cheruby w komentarzach, możemy użyć nowego setThumbTintList
i działało zgodnie z oczekiwaniami. Możemy również użyć setTrackTintList
, ale to powoduje, że kolor jest mieszanką, w wyniku czego jest ciemniejszy niż oczekiwano w motywach o ciemnych kolorach i jaśniejszy niż oczekiwano w motywach o jasnych kolorach, czasem do tego stopnia, że jest niewidoczny. W systemie Android 7 udało mi się zminimalizować tę zmianę, zastępując tryb odcień ścieżki , ale nie mogłem uzyskać przyzwoitych wyników w Androidzie 6. Być może będziesz musiał zdefiniować dodatkowe kolory, które kompensują mieszanie. (Czy kiedykolwiek miałeś wrażenie, że Google nie chce, abyśmy dostosowywali wygląd naszych aplikacji?)
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);
}
Switch
później wskazać tego selektora niestandardowego.