Note: Sử dụng Thư viện hỗ trợ Android v22.1.0 và nhắm mục tiêu cấp độ API 11 trở lên? Cuộn xuống bản cập nhật cuối cùng.
phong cách ứng dụng của tôi được thiết lập để Theme.Holo đó là tối và tôi sẽ như các hộp kiểm vào xem danh sách của tôi là có phong cách Theme.Holo.Light. Tôi không cố gắng tạo kiểu tùy chỉnh. Mã bên dưới dường như không có vẻ là , không có gì xảy ra cả.
Lúc đầu, có thể không rõ lý do tại sao hệ thống thể hiện hành vi này, nhưng khi bạn thực sự xem xét cơ học, bạn có thể dễ dàng suy ra. Hãy để tôi đưa bạn qua từng bước.
Trước tiên, hãy xem định nghĩa của kiểu dáng Widget.Holo.Light.CompoundButton.CheckBox
. Để làm cho mọi thứ rõ ràng hơn, tôi cũng đã thêm định nghĩa kiểu 'thông thường' (không phải ánh sáng).
<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
Như bạn có thể thấy, cả hai đều là khai báo trống chỉ cần bọc Widget.CompoundButton.CheckBox
bằng một tên khác. Vì vậy, hãy nhìn vào phong cách cha mẹ đó.
<style name="Widget.CompoundButton.CheckBox">
<item name="android:background">@android:drawable/btn_check_label_background</item>
<item name="android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>
Kiểu này tham chiếu cả nền và nút có thể kéo. btn_check_label_background
chỉ đơn giản là một bản vá 9 và do đó không phải là rất thú vị đối với vấn đề này. Tuy nhiên, ?android:attr/listChoiceIndicatorMultiple
cho biết rằng một số thuộc tính dựa trên chủ đề hiện tại hiện tại (điều này rất quan trọng để nhận ra) sẽ xác định giao diện thực tế của CheckBox
.
Vì listChoiceIndicatorMultiple
là thuộc tính chủ đề, bạn sẽ tìm thấy nhiều khai báo cho nó - một cho mỗi chủ đề (hoặc không nếu nó được kế thừa từ một chủ đề gốc).Điều này sẽ trông như sau (với các thuộc tính khác bỏ qua cho rõ ràng):
<style name="Theme">
<item name="listChoiceIndicatorMultiple">@android:drawable/btn_check</item>
...
</style>
<style name="Theme.Holo">
<item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_dark</item>
...
</style>
<style name="Theme.Holo.Light" parent="Theme.Light">
<item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_light</item>
...
</style>
Vì vậy, đây nơi kỳ diệu thực sự xảy ra: dựa trên thuộc tính của chủ đề listChoiceIndicatorMultiple
, sự xuất hiện thực tế của CheckBox
được xác định. Hiện tượng bạn đang thấy giờ đây được giải thích một cách dễ dàng: vì hình thức dựa trên chủ đề (và không phải là dựa trên phong cách, vì đó chỉ là định nghĩa trống) và bạn đang kế thừa từ Theme.Holo
, bạn sẽ luôn nhận được sự xuất hiện của CheckBox
phù hợp với chủ đề.
Bây giờ, nếu bạn muốn thay đổi hình thức của phiên bản Holo.Light, bạn cần phải sao chép các tài nguyên đó, thêm chúng vào nội dung địa phương của bạn và sử dụng kiểu tùy chỉnh để áp dụng chúng.
Đối với câu hỏi thứ hai của bạn:
Ngoài ra bạn có thể thiết lập phong cách cho các widget cá nhân nếu bạn thiết lập một phong cách để ứng dụng?
Tuyệt đối và chúng sẽ ghi đè mọi kiểu hoạt động hoặc ứng dụng.
Có cách nào để đặt chủ đề (kiểu có hình ảnh) vào hộp kiểm tiện ích hay không. (...) Có cách nào để sử dụng công cụ chọn này: link?
Cập nhật:
Hãy để tôi bắt đầu với nói lại rằng bạn không phải dựa vào nội lực của Android. Có một lý do bạn không thể chỉ truy cập vào không gian tên nội bộ như bạn vui lòng.
Tuy nhiên, cách truy cập tài nguyên hệ thống sau cùng là thực hiện tra cứu id theo tên. Xem xét đoạn mã sau:
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);
Dòng đầu tiên sẽ thực sự trả về id tài nguyên của tài nguyên có thể kéo btn_check_holo_light
. Vì chúng tôi đã thiết lập trước đó rằng đây là nút chọn để xác định giao diện của CheckBox
, chúng tôi có thể đặt nó làm 'nút có thể vẽ' trên tiện ích. Kết quả là CheckBox
với sự xuất hiện của phiên bản Holo.Light
, bất kể chủ đề/kiểu bạn đặt trên ứng dụng, hoạt động hoặc tiện ích trong xml. Vì điều này chỉ đặt nút có thể kéo được, bạn sẽ cần thay đổi kiểu dáng theo cách thủ công; ví dụ. đối với giao diện văn bản.
Bên dưới ảnh chụp màn hình hiển thị kết quả. Hộp kiểm trên cùng sử dụng phương pháp được mô tả ở trên (tôi đặt màu văn bản thành màu đen theo xml) theo cách thủ công, trong khi thứ hai sử dụng kiểu dáng Holo
dựa trên chủ đề mặc định (không phải ánh sáng, tức là).

Update2:
Với the introduction of Support Library v22.1.0, mọi thứ đã vừa nhận được dễ dàng hơn rất nhiều!Trích dẫn từ ghi chú phát hành (nhấn mạnh của tôi):
Lollipop thêm khả năng ghi đè lên chủ đề ở chế độ xem theo cấp chế độ xem bằng cách sử dụng thuộc tính XML android:theme
- cực kỳ hữu ích cho những thứ như thanh tác vụ tối. . Giờ đây, AppCompat cho phép bạn sử dụng android:theme
cho Thanh công cụ (không sử dụng app:theme
được sử dụng trước đó) và, thậm chí còn tốt hơn, mang lại hỗ trợ android:theme
cho tất cả chế độ xem trên thiết bị API 11+.
Nói cách khác: bây giờ bạn có thể áp dụng một chủ đề trên per-view cơ sở, mà làm cho việc giải quyết các vấn đề ban đầu dễ dàng hơn nhiều: chỉ cần xác định chủ đề bạn muốn áp dụng cho quan điểm liên quan . I E. trong bối cảnh của câu hỏi ban đầu, so sánh kết quả của dưới đây:
<CheckBox
...
android:theme="@android:style/Theme.Holo" />
<CheckBox
...
android:theme="@android:style/Theme.Holo.Light" />
Đầu tiên CheckBox
được theo kiểu như nếu sử dụng trong một chủ đề tối, thứ hai là nếu trong một chủ đề ánh sáng, không phụ thuộc vào chủ đề thực tế thiết lập để hoạt động hoặc ứng dụng của bạn.
Tất nhiên bạn không còn nên sử dụng chủ đề Holo nữa, nhưng thay vào đó hãy sử dụng Material.
Cảm ơn bạn đã dành thời gian trả lời. Tôi thấy vấn đề ở đây và tôi vẫn tự hỏi nếu điều này có thể được thực hiện với tôi phải làm rất nhiều công việc. Có cách nào để đặt chủ đề (kiểu với hình ảnh) vào tiện ích hộp kiểm hay không. Tôi biết rằng tôi có thể tìm thấy những hình ảnh và bao gồm chúng trong dự án của tôi nhưng nó có vẻ như hơn giết. Có cách nào để sử dụng công cụ chọn này không: https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_check_holo_light.xml – user1330739
@ user1330739: Có và không. Bạn không phải dựa vào tài nguyên nội bộ vì Google có thể quyết định thay đổi chúng trong các bản phát hành trong tương lai. Bao gồm một bản sao của các drawables trong các nguồn lực địa phương của bạn thực sự là lựa chọn tốt nhất của bạn. Điều đó đang được nói, có một giải pháp (xấu xí) mà tôi biết, nhưng nó chỉ hoạt động trong thời gian chạy (nghĩa là bạn không thể tham chiếu nó trong các tệp xml của bạn). Vui lòng xem phần chỉnh sửa cho câu trả lời của tôi ở trên. –
@MH. làm tốt. –