Kolory zależne od motywu wybranych widżetów

Jestem prawie pewien, że na to pytanie już gdzieś odpowiedziano. To wydaje się zbyt powszechne. Ale nie mogę znaleźć odpowiedzi. Nie mogę też znaleźć rozwiązania.

Oto problem:

Chcę, żeby jeden z moich Tablerów miał inny kolor tła. To proste, muszę tylko dodać
android:background="#123456" 

W deklaracji XML Tablerowa. Ale chcę również, aby moja aplikacja miała dwa tematy. W innym temacie TableRow powinien mieć inny kolor tła. Po prostu nie mogę znajdź sposób na zdefiniowanie wartości koloru wewnątrz motywu i użyj jej. Chciałbym napisać coś takiego:

<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>

I w deklaracji Tablerowa:

android:background="@color/my_cool_color"

Więc, kiedy zmieniam temat, zmienia się również kolor tła tego jednego tabletu. Próbowałem na wiele sposobów przez wiele godzin i nie udało mi się... Jedną rzeczą, której nie próbowałem, było stworzenie własnego widgetu na podstawie TableRow i deklarowanie osobnego stylu dla niego - myślę, że to powinno działać, ale to po prostu zbyt ciężkie rozwiązanie dla tak prosty problem.

Author: user1234567, 2011-12-25

1 answers

Możesz to zrobić używając atrybutów. Najpierw zdefiniuj swój atrybut w attrs.xml (plik ten znajduje się w folderze 'values'):

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

Następnie w Twoim styles.xml zdefiniuj myCoolColor dla każdego tematu:

<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>

Teraz określ myCoolColor jako tło widoku:

android:background="?myCoolColor"

Możesz pójść dalej i użyć odniesienia do koloru, aby zachować kolory zdefiniowane w jednym miejscu. Zmienić atrybut, aby zawierał odniesienie (zauważ, że możemy użyć koloru lub odniesienie):

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

Zmień swój styles.xml, aby odwoływać się do koloru dla każdego motywu:

<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>

Wreszcie zdefiniuj kolory w swoim colors.xml:

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

To jest to!

 51
Author: aromero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-25 23:10:03