2012-06-12 13 views
33

Mi piacerebbe fare una cosa semplice: Definire un drawable che abbia esattamente lo stesso colore di sfondo del colore di sfondo premuto dallo stato del sistema. lo faccio come questo in res/drawable/my_drawable.xml:Come fare riferimento all'attributo colore in drawable?

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

ho sempre ottenere:

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

Degli indizi?

saluti

risposta

43

Potrebbe essere necessario effettuare le seguenti operazioni per risolvere il problema:

1) Definire 2 colori per ogni tema con i colori del file:

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

2) creare il file res/values ​​/ attrs.xml con contenuto:

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

3) Supponendo di avere 2 ° EME nel styles.xml (Theme.dark e Theme.light) definiscono:

<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) utilizzare il colore in un disegnabile:

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

Spero che questo dovrebbe risolvere il problema.

+7

Per qualche motivo ottengo un errore con questo approccio:' android.view.InflateException: File XML di file binario n. 2: Errore durante la classe di gonfiaggio ' – Muxa

+2

Sto ottenendo lo stesso errore se provo questo approccio. Funziona per Android: colore in xml di layout ma non xml disegnabili. Una soluzione noiosa: finale TypedValue typedValue = new TypedValue(); getTheme(). ResolveAttribute (R.attr.tx_frq, typedValue, true); COLORE = typedValue.data; Disegnabile d = getResources(). GetDrawable (R.drawable.mydrawable); d.setColorFilter (COLOR, PorterDuff.Mode.MULTIPLY); – Larphoid

+2

Questa soluzione funziona solo su API 11+. Per API 10 e versioni precedenti, non è possibile fare riferimento a un attributo all'interno di un file xml Drawable. – BladeCoder

7

basta creare un nuovo file color.xml in /res/values/color.xml e inserire il codice come il seguente in esso:

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

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

</resources> 
+1

No, perché se desidero cambiare tema o qualcuno sceglierà un tema diverso sul telefono, resterò con valori fissi. – Michal

3

Si sta cercando di convertire un attributo in un colore. Gli attributi sono proprietà solitamente associate a una vista, che possono quindi essere abbinate a un tema.

È necessario fare riferimento a una risorsa di colore nel file xml. Si può fare in modo da creare la propria risorsa:

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

quindi fare riferimento in questo modo:

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

Oppure si può fare riferimento a un colore disponibile nelle risorse 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 ho capito. Forse sto usando un'idea sbagliata. Lascia che ti dica cosa vorrei ottenere.Ho una vista personalizzata e vorrei impostare il colore dello sfondo a stato selezionato esattamente come il vero colore dello stato premuto del tema. Pensa che non lo raggiungerò usando '@android: color/...'. – Michal

+0

Stai usando temi Android ufficiali? quindi puoi collegarti al colore, o semplicemente ottenere i drawable dal sdk in $ ANDROID_SDK $/platforms/android-14/data/res. – XGouchet

+0

Sì, sono d'accordo, ma quando vorrei consentire di cambiare tema nella mia app dovrò gestire il cambiamento di colore del mio disegno personalizzato. Pensavo di poterlo fare in qualche modo automaticamente - attaccando il suo colore di sfondo con il valore attr. – Michal

0

prova in questo modo mettere il colore in Android: disegnabile come sotto

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

o

<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

Hai controllato questo? Ho degli errori quando cerco di usare: '' – Michal

+0

Voglio solo dire che usi il tuo stato se vuoi "oggetto android: state_selected "ma usa l'androide: drawable come attributo per impostare il colore ...... –

4

non è possibile utilizzare ?attr in risorse estraibili xml perché risorse estraibili create da aapt in fase di compilazione. Attr risorse utilizzate per la connessione dinamica in runtime

Problemi correlati