2013-05-19 11 views
8

jestem początkujący w rozwoju Android i chociaż kodowania czyni mistrza sence, android motywy IMHO nieAndroid tematy kłopotów wykonawczych najprostszy custom za kolorystyce

mam kłopotów wykonawczych to proste zadanie:

mam (na przykład) kolor o nazwie „bla”

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="blah">#F0F0F0</color> 
<resources> 

który jest stosowany wszędzie w układach XML lub kodu i przez różne complonents zobacz jako „@ kolor/bla”

ja po prostu chcą, aby ta zmiana koloru wartość per-tematu

więc kiedy używać MyTheme1, bla powinno być # F0F0F0 i kiedy używać MyTheme2 bla powinno być # 00FF00

Czytałam o tematach i wciąż nie mogę dowiedzieć się, jak wdrożyć to proste zadanie, ponieważ moja aplikacja nie wymaga specjalnych stylów i tak dalej, tylko kolory tematyczne.

Niż z góry

UPDATE:

Po linku podanego przez Mohamed_AbdAllah, że z powodzeniem udało się stworzyć kilka kolorów niestandardowych, definiując je w attrs.xml i styles.xml:

attrs.xml

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

styles.xml

<style name="AppBaseThemeDark" parent="android:Theme.Black"> 
<item name="color_item_title">@color/White</item>      
</style> 

Ale teraz znacznie bardziej poważny problem powstaje

mogę z powodzeniem używać koloru? Color_item_title w każdym zdaniem więc przyciski i tekst faktycznie dostaje ten kolor.

Ale użycie tego? Color_item_title na niestandardowych rysunkach lub układach listview (TO JEST WIDOKI, KTÓRE ZOSTAŁY NAPISANE W CZASIE RUNTIME) powoduje awarię.

Więc za pomocą color_item_title wewnątrz ListView listitem awarii układu w starcie z komunikatem inflater na tej linii :(

rozbija się również na moje kanału alfa: (błąd inflacji ponownie)

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle" > 

<solid android:color="@color/Black" /> 
<corners 
    android:bottomLeftRadius="8dp" 
    android:bottomRightRadius="8dp" 
    android:topLeftRadius="8dp" 
    android:topRightRadius="8dp" /> 
<stroke android:width="1dp" android:color="?color_item_title" /> 
</shape> 
+3

sprawdź to [pytanie] (http://stackoverflow.com/questions/8630694/theme-dependent-colors-of-selectedwidwids) –

+0

Mimo że Twój link dostarczył pomoc, powstał poważniejszy problem, więc zaktualizowałem swój post –

Odpowiedz

0

Jedynym sposobem osiągnięcia tego, co chcesz, jest zdefiniowanie dwóch różnych kolorów, na przykład blah i blah2 i odniesienie do nich w motywach:

3

Po wyszukaniu i przetestowaniu otrzymałem wskazówkę, że są pewne rzeczy, które możesz zrobić, i niektóre rzeczy, których nie możesz.

Można

a) Określ swoje własne atrybuty attrs

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

b) określenia ich wartości w styles.xml

<style name="AppBaseThemeDark" parent="android:Theme.Black"> 
      <item name="color_gallery_backround">@color/White</item>    
</style> 
<style name="AppBaseThemeWhite" parent="android:Theme.Light"> 
      <item name="color_gallery_backround">@color/Black</item>    
</style> 

c) wykorzystanie ich w jakikolwiek wyświetl jako? color_gallery_backround lub? attr/color_gallery_backround na przykład

android:background="?attr/color_gallery_backround" 

cant

a) nie mogę uzyskać dostęp do tego atrybutu z niestandardowych kanału alfa, ponieważ nie są one ważne podczas inflacji

tak cant użytku w ciekawy/color_gallery_backround tutaj?:

customshape.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle" > 

<solid android:color="**?attr/color_gallery_backround**" /> 
<stroke android:width="2dp" android:color="@color/Black" /> 
</shape> 

b) nie mogę uzyskać dostęp do tego atrybutu w widoku, który będzie się zawyżone w czasie (na przykład) ListView jako widok listitem

więc motyw „wsparcie” dla atrybutów przynajmniej do API 10 ma limitów głębokości.

Solutions

Jak sugeruje, musisz utworzyć dwa oddzielne kanału alfa przy użyciu różnych kolorów i ustawiać atrybuty odwołać te kanału alfa według tematu:

attrs.xml

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

i na każdym motywie, wybierz rzeczywisty program do użycia w stylach.xml:

<resources> 

    <style name="AppBaseThemeDark" parent="android:Theme.Black"> 
      <item name="rounded_background">@drawable/round_rect_shape_dark</item>  
      </style> 

    <style name="AppBaseThemeLight" parent="android:Theme.Light"> 
      <item name="rounded_background">@drawable/round_rect_shape_white</item>  
      </style> 

</resources> 

Teraz możesz odwoływać się do swojego losowania jako? Rounded_background i pozwolić wybranemu motywowi wybrać.

W przypadku zawyżonych widoków w układach listView listitem należy programowo ustawić kolory.

0

To działa dla mnie tak, jak sugerował John S, ale w definicji atrybutów musiałem dodać "color | reference" zamiast tylko "reference". Dlatego mój plik attrs.xml wygląda następująco:

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

Najlepsze regady!