Ini berfungsi untuk saya (membutuhkan 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);
Perhatikan bahwa status "default" perlu ditambahkan terakhir seperti yang ditunjukkan di sini.
Satu-satunya masalah yang saya lihat adalah "ibu jari" dari switch sekarang tampak lebih besar dari latar belakang atau "track" dari switch. Saya pikir itu karena saya masih menggunakan gambar trek default, yang memiliki beberapa ruang kosong di sekitarnya. Namun, ketika saya mencoba untuk menyesuaikan gambar trek menggunakan teknik ini, saklar saya tampaknya memiliki ketinggian 1 piksel dengan hanya sepotong teks yang hidup / mati muncul. Pasti ada solusi untuk itu, tapi saya belum menemukannya ...
Pembaruan untuk Android 5
Di Android 5, kode di atas membuat peralihan menghilang sepenuhnya. Kita harus dapat menggunakan metode setButtonTintList baru , tetapi ini tampaknya diabaikan untuk switch. Tapi ini berhasil:
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);
Pembaruan untuk Android 6-7
Seperti yang dinyatakan Cheruby dalam komentar, kita bisa menggunakan yang baru setThumbTintList
dan itu berfungsi seperti yang diharapkan untuk saya. Kita juga bisa menggunakan setTrackTintList
, tetapi itu menerapkan warna sebagai campuran, dengan hasil yang lebih gelap dari yang diharapkan dalam tema warna gelap dan lebih terang dari yang diharapkan dalam tema warna terang, kadang-kadang sampai tidak terlihat. Di Android 7, saya bisa meminimalkan perubahan itu dengan mengganti mode track tint , tapi saya tidak bisa mendapatkan hasil yang layak dari itu di Android 6. Anda mungkin perlu menentukan warna tambahan yang mengimbangi blending. (Apakah Anda pernah merasa bahwa Google tidak ingin kami menyesuaikan tampilan aplikasi kami?)
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
pemilih kustom ini setelahnya.