2011-12-25 31 views
18

Tôi chắc chắn rằng câu hỏi này đã được trả lời ở đâu đó. Nó có vẻ quá phổ biến. Nhưng tôi không thể tìm ra câu trả lời. Tôi cũng không thể tìm ra giải pháp.Màu sắc phụ thuộc chủ đề của các vật dụng được chọn

Đây là vấn đề:

Tôi muốn một trong những TableRow của tôi có màu nền khác nhau. Thật đơn giản, tôi chỉ cần thêm

android:background="#123456" 

Trong tuyên bố XML của TableRow. Nhưng, tôi cũng muốn ứng dụng của tôi có hai chủ đề. Trong chủ đề khác, TableRow nên có màu nền khác nhau. Tôi không thể tìm được cách xác định giá trị màu bên trong một chủ đề và sử dụng nó. Tôi muốn gõ một cái gì đó như thế này:

<style name="Theme.MyApp" parent="@style/Theme.Light"> 
    <color "my_cool_color">#123456</color> 
</style> 

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark"> 
    <color "my_cool_color">#654321</color> 
</style> 

Và trong khai TableRow của:

android:background="@color/my_cool_color" 

nên, khi thay đổi chủ đề, màu sắc của nền mà một TableRow cũng biến đổi. Tôi đã cố gắng theo nhiều cách trong nhiều giờ và không thành công ... Một điều tôi đã không thử, là tạo ra widget của riêng tôi dựa trên TableRow và tuyên bố một phong cách riêng cho nó - tôi nghĩ điều này sẽ hiệu quả, nhưng chỉ là giải pháp quá nặng cho vấn đề đơn giản như vậy.

Trả lời

51

Bạn có thể thực hiện việc này bằng các thuộc tính. Đầu tiên xác định thuộc tính của bạn trong attrs.xml (file này đi trong thư mục 'giá trị'):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="myCoolColor" format="color" /> 
</resources> 

Sau đó, trong styles.xml của bạn, xác định myCoolColor cho từng chủ đề:

<style name="Theme.MyApp" parent="@style/Theme.Light"> 
    <item name="myCoolColor">#123456</item> 
</style> 

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark"> 
    <item name="myCoolColor">#654321</item> 
</style> 

Bây giờ, chỉ định myCoolColor như nền trong chế độ xem của bạn:

android:background="?myCoolColor" 

Bạn có thể tiếp tục và sử dụng tham chiếu đến màu để bạn có thể giữ màu được xác định n một nơi. Thay đổi thuộc tính bao gồm một tài liệu tham khảo (lưu ý rằng chúng ta có thể sử dụng một màu HOẶC một tài liệu tham khảo):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="myCoolColor" format="color|reference" /> 
</resources> 

thay đổi styles.xml của bạn để tham khảo một màu cho từng chủ đề:

<style name="Theme.MyApp" parent="@style/Theme.Light"> 
    <item name="myCoolColor">@color/blue</item> 
</style> 

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark"> 
    <item name="myCoolColor">@color/green</item> 
</style> 

Cuối cùng xác định màu sắc trong của bạn colors.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="blue">#0000FF</color> 
    <color name="green">#00FF00</color> 
</resources> 

Vậy đó!

+0

Cảm ơn! Tôi tìm thấy một cái gì đó về attr.xml, nhưng không thể tìm thấy một ví dụ phù hợp. Ngược lại, câu trả lời của bạn không thể hoàn chỉnh hơn! – user1234567

+0

Tôi thấy câu trả lời của bạn rất hữu ích và cũng giải quyết được vấn đề của tôi. +1. Nhưng tôi vẫn có một vấn đề, tôi muốn sử dụng các màu được xác định trong mã. Làm thế nào tôi có thể làm điều đó, làm thế nào để sử dụng các màu sắc từ attrs trong mã (không phải xml)? – Sandra

+0

Có, nhưng nếu tôi sử dụng chủ đề tối, tôi muốn màu xanh lam và màu xanh lá cây khác. Nhưng làm thế nào tôi có thể nhận được đúng màu trong mã? – Sandra

Các vấn đề liên quan