Điều này phù hợp với tôi (yêu cầu 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);
Lưu ý rằng trạng thái "mặc định" cần được thêm vào cuối cùng như được hiển thị ở đây.
Vấn đề duy nhất tôi thấy là "ngón tay cái" của công tắc hiện có vẻ lớn hơn nền hoặc "rãnh" của công tắc. Tôi nghĩ đó là bởi vì tôi vẫn đang sử dụng hình ảnh theo dõi mặc định, có một số khoảng trống xung quanh nó. Tuy nhiên, khi tôi cố gắng tùy chỉnh hình ảnh theo dõi bằng kỹ thuật này, công tắc của tôi dường như có chiều cao 1 pixel chỉ với một đoạn văn bản bật / tắt xuất hiện. Phải có một giải pháp cho điều đó, nhưng tôi chưa tìm thấy nó ...
Cập nhật cho Android 5
Trong Android 5, đoạn mã trên khiến công tắc biến mất hoàn toàn. Chúng ta có thể sử dụng phương thức setButtonTintList mới , nhưng điều này dường như bị bỏ qua cho các công tắc. Nhưng điều này hoạt động:
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);
Cập nhật cho Android 6-7
Như Cheruby đã nêu trong các bình luận, chúng tôi có thể sử dụng cái mới setThumbTintList
và nó hoạt động như mong đợi đối với tôi. Chúng ta cũng có thể sử dụng setTrackTintList
, nhưng điều đó áp dụng màu sắc như một sự pha trộn, với kết quả là tối hơn mong đợi trong các chủ đề màu tối và sáng hơn mong đợi trong các chủ đề màu sáng, đôi khi đến mức vô hình. Trong Android 7, tôi đã có thể giảm thiểu sự thay đổi đó bằng cách ghi đè chế độ theo dõi , nhưng tôi không thể nhận được kết quả tốt từ đó trong Android 6. Bạn có thể cần xác định các màu bổ sung bù cho pha trộn. (Bạn có bao giờ có cảm giác rằng Google không muốn chúng tôi tùy chỉnh giao diện của ứng dụng của mình không?)
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
đến bộ chọn tùy chỉnh này sau đó.