Dies funktioniert für mich (erfordert 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);
Beachten Sie, dass der Status "Standard" zuletzt hinzugefügt werden muss, wie hier gezeigt.
Das einzige Problem, das ich sehe, ist, dass der "Daumen" des Schalters jetzt größer erscheint als der Hintergrund oder die "Spur" des Schalters. Ich denke, das liegt daran, dass ich immer noch das Standard-Track-Image verwende, um das herum etwas Leerraum ist. Als ich jedoch versuchte, das Titelbild mit dieser Technik anzupassen, schien mein Schalter eine Höhe von 1 Pixel zu haben, wobei nur ein Streifen des Ein / Aus-Textes angezeigt wurde. Es muss eine Lösung dafür geben, aber ich habe sie noch nicht gefunden ...
Update für Android 5
In Android 5 lässt der obige Code den Schalter vollständig verschwinden. Wir sollten in der Lage sein, die neue setButtonTintList- Methode zu verwenden, aber dies scheint für Schalter ignoriert zu werden. Aber das funktioniert:
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);
Update für Android 6-7
Wie Cheruby in den Kommentaren feststellte, können wir das Neue verwenden setThumbTintList
und das hat wie erwartet für mich funktioniert. Wir können auch verwenden setTrackTintList
, aber das wendet die Farbe als Mischung an, mit einem Ergebnis, das bei dunklen Farbthemen dunkler als erwartet und bei hellen Farbthemen heller als erwartet ist, manchmal bis zur Unsichtbarkeit. In Android 7 konnte ich diese Änderung minimieren, indem ich den Track- Tint-Modus überschrieb. In Android 6 konnte ich jedoch keine anständigen Ergebnisse erzielen. Möglicherweise müssen Sie zusätzliche Farben definieren, die die Überblendung kompensieren. (Haben Sie jemals das Gefühl, dass Google nicht möchte, dass wir das Erscheinungsbild unserer Apps anpassen?)
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
auf diesen benutzerdefinierten Selektor zu verweisen .