2012-06-12 19 views
33

Me gustaría hacer algo simple: Define un dibujo que tiene exactamente el mismo color de fondo que el color de fondo del estado del sistema. lo hago así en res/dibujables/my_drawable.xml:¿Cómo hacer referencia al atributo de color en 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> 

siempre me dan:

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

Alguna pista?

Saludos

Respuesta

43

Es posible que tenga que hacer lo siguiente para solucionar el problema:

1) Definir 2 colores para cada tema en sus colores del archivo:

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

2) Crear archivo res/values ​​/ attrs.xml con contenido:

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

3) Suponiendo que tiene 2 th EME en su styles.xml (Theme.dark y Theme.light) definen:

<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) usar el color en un dibujable:

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

Esperanza Esto debería solucionar su problema.

+7

Por algún motivo me sale un error con este enfoque:' android.view.InflateException: archivo binario XML línea # 2: error inflando la clase ' – Muxa

+2

Recibo el mismo error si pruebo este enfoque. Funciona para Android: colorea en el diseño xml pero no dibuja los xml. Una solución tediosa: 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

Esta solución solo funciona en API 11+. Para API 10 y menor, no puede hacer referencia a un atributo dentro de un archivo xml Drawable. – BladeCoder

7

Basta con crear un nuevo archivo en color.xml /res/values/color.xml y poner un código como el siguiente en él:

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

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

</resources> 
+1

No, porque si me gustaría cambiar el tema, o alguien elegirá un tema diferente en el teléfono, me quedaré con los valores fijos. – Michal

3

Usted está tratando de convertir un atributo en un color. Los atributos son propiedades generalmente asociadas a una vista, que luego se pueden diseñar con un tema.

Necesita referenciar un recurso de color en su xml. Puede hacerlo mediante la creación de su propio recurso:

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

después hacer referencia a ello como esto:

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

O bien, puede hacer referencia a un color disponible en los recursos 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, entiendo tu punto. Tal vez estoy usando una idea equivocada. Déjame decirte lo que me gustaría lograr.Tengo una vista personalizada y me gustaría configurar el color de fondo del estado seleccionado exactamente igual al color real del estado presionado del tema. Creo que no lograré esto usando '@android: color/...'. – Michal

+0

¿Estás usando temas oficiales de Android? luego puedes vincular el color, o simplemente obtener los elementos extraíbles del SDK en $ ANDROID_SDK $/platforms/android-14/data/res. – XGouchet

+0

Sí, estoy de acuerdo, pero cuando me gustaría permitir el cambio de tema en mi aplicación, tendré que manejar el cambio de color de dibujo personalizado por mi cuenta. Pensé que podría hacer esto de alguna manera automáticamente, pegando su color de fondo con valor attr. – Michal

0

intento de esta manera poner color en android: dibujable como debajo

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

¿Has verificado esto? Tengo errores cuando trato de usar: '' – Michal

+0

Solo quiero decir que use su estado si quiere "item android: state_selected "pero use el atributo android: drawable como para establecer el color ...... –

4

no se puede usar ?attr en recursos dibujables xml porque recursos dibujables creados por aapt en tiempo de compilación. Recursos Attr utilizados para la conexión dinámica en tiempo de ejecución

Cuestiones relacionadas