2012-06-12 11 views
33

Chciałbym zrobić prostą rzecz: Definiowanie losowania, które ma dokładnie ten sam kolor tła, co kolor tła wciśnięty przez system. zrobić to jak to w res/kanału alfa/my_drawable.xml:Jak odwoływać się do atrybutu koloru w losowaniu?

<?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_selected="true"> 
     <color android:color="?android:attr/colorPressedHighlight"/> 
    </item> 
    <item android:state_selected="false"> 
     <color android:color="@color/section_list_background"/> 
    </item>  
    </selector> 

zawsze dotrzesz:

java.lang.UnsupportedOperationException: Cant convert to color: type=0x2 

żadnych wskazówek?

Pozdrowienia

Odpowiedz

43

Być może trzeba wykonać następujące czynności, aby rozwiązać swój problem:

1) Zdefiniuj 2 kolory dla każdego tematu w swoich barwach pliku:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="my_color_dark">#ff33B5E5</color> 
    <color name="my_color_light">#ff355689</color> 
</resources> 

2) Utwórz plik res/values ​​/ attrs.xml z zawartością:

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

3) Zakładając, że masz 2 EMES twojej styles.xml (Theme.dark i Theme.light) określają:

<style name="Theme.dark" parent="@style/Theme.Sherlock"> 
    <item name="my_color">@color/my_color_dark</item> 
</style> 

<style name="Theme.light" parent="@style/Theme.Sherlock.Light"> 
    <item name="my_color">@color/my_color_light</item> 
</style> 

4) Użyj koloru w odkształcalne:

<color android:color="?attr/my_color"/> 

Nadzieja to powinno rozwiązać problem.

+7

Z jakiegoś powodu otrzymuję komunikat o błędzie z tym podejściem:' android.view.InflateException: Binarna linia plików XML nr 2: Błąd pompowania klasy ' – Muxa

+2

Otrzymuję ten sam błąd, jeśli próbuję tego podejścia. Działa dla Androida: kolor w układzie xml, ale nie w formacie xml. Nużące obejście: final TypedValue typedValue = new TypedValue(); getTheme(). ResolveAttribute (R.attr.tx_frq, typedValue, true); COLOR = typedValue.data; Drawable d = getResources(). GetDrawable (R.drawable.mydrawable); d.setColorFilter (COLOR, PorterDuff.Mode.MULTIPLY); – Larphoid

+2

To rozwiązanie działa tylko w interfejsie API 11+. W przypadku interfejsu API 10 i niższych nie można odwoływać się do atrybutu wewnątrz pliku szuflady xml. – BladeCoder

7

Wystarczy utworzyć nowy plik color.xml w /res/values/color.xml i umieścić kod jak poniżej w nim:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <color name="editcolor">#ff99ffff</color> 
    <color name="transparent">#00000000 </color> 

</resources> 
+1

Nie, bo jeśli chciałbym zmienić motyw, lub ktoś wybierze inny motyw na telefonie, pozostanę przy stałych wartościach. – Michal

3

Starasz przekonwertować atrybut do koloru. Atrybuty to właściwości zwykle dołączane do widoku, które można następnie stylizować za pomocą motywu.

Musisz odwoływać się do zasobu kolorów w twoim xml. Można to zrobić poprzez stworzenie własnego zasobu:

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

następnie odwołać go tak:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_selected="true"> 
     <color android:color="@color/colorPressedHighlight"/> 
    </item> 
    <item android:state_selected="false"> 
     <color android:color="@color/section_list_background"/> 
    </item>  
</selector> 

Albo można odwoływać kolor dostępny w zasobach Android:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_selected="true"> 
     <color android:color="@android:color/holo_orange_light"/> 
    </item> 
    <item android:state_selected="false"> 
     <color android:color="@android:color/holo_blue_dark"/> 
    </item> 
</selector> 
+0

OK Dostałem twój punkt. Może używam niewłaściwego pomysłu. Powiem ci, co chciałbym osiągnąć.Mam niestandardowy widok i chciałbym ustawić kolor tła wybranego stanu tak samo, jak kolor rzeczywisty w stanie wciśniętym. Myślę, że nie osiągnę tego przy użyciu '@android: color/...'. – Michal

+0

Czy używasz oficjalnych tematów systemu Android? następnie możesz połączyć się z kolorem lub po prostu pobrać rysunki z sdk w $ ANDROID_SDK $/platforms/android-14/data/res. – XGouchet

+0

Tak, zgadzam się, ale kiedy chciałbym zezwolić na zmianę tematu w mojej aplikacji, będę musiał sam poradzić sobie ze zmianą koloru niestandardowego losowania. Pomyślałem, że mogę to zrobić w jakiś sposób automatycznie - przyklejając kolor tła do wartości atr. – Michal

0

spróbować w ten sposób umieścić kolor w Androidzie: przeciągany poniżej:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="?android:attr/colorPressedHighlight"/> <!-- pressed --> 
    <item android:state_focused="true" android:drawable="@color/blue"/> <!-- focused --> 
    <item android:drawable="@color/section_list_background"/> <!-- default --> 
</selector> 

lub

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:color="?android:attr/colorPressedHighlight"/> 
    <item android:state_enabled="false" android:color="@color/section_list_background" /> 
    <item android:color="@color/testcolor5"/> 
</selector> 
+0

http://developer.android.com/guide/topics/resources/drawable-resource.html –

+0

Czy to sprawdziłeś? Mam błędy przy próbie użycia: '' – Michal

+0

Chcę tylko powiedzieć, że używaj swojego stanu, jeśli chcesz "item android: state_selected "ale użyj androida: losowania jako atrybutu, aby ustawić kolor ...... –

4

Nie można używać ?attr w zasobach do rysowania xml, ponieważ zasoby drawable tworzone przez aapt w czasie kompilacji. Zasoby Attr użyte do dynamicznego połączenia w środowisku wykonawczym

Powiązane problemy