2012-02-27 23 views
13

Tengo un botón con el fondo definido en xml. Me gustaría teñir el botón según el estado actual en el que está, es decir, presionado, enfocado, normal.Cambiar el tinte de dibujable en el selector xml

Aquí está mi archivo xml a continuación. Además, mi colored_tint_dark y colored_tint son colores translúcidos que intento dibujar sobre la imagen dibujable que llamo desde la carpeta de recursos. Aquí está el problema Cuando la IU se carga por primera vez, la imagen tiene el matiz apropiado, pero después de presionarla, el estado presionado no muestra ningún matiz, luego el estado normal no mostrará ningún matiz.

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

<item android:state_pressed="true" android:drawable="@drawable/rounded_grayscale_pinstripe_button"> 
    <shape> 
     <gradient 
      android:endColor="@color/colored_tint" 
      android:startColor="@color/colored_tint" 
      android:angle="270" /> 
     <stroke 
      android:width="0dp" 
      android:color="@color/colored_tint" /> 
     <corners 
      android:radius="0dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
</item> 

<item android:state_focused="true" android:drawable="@drawable/rounded_grayscale_pinstripe_button"> 
    <shape> 
     <gradient 
      android:endColor="@color/colored_tint" 
      android:startColor="@color/colored_tint" 
      android:angle="270" /> 
     <stroke 
      android:width="0dp" 
      android:color="@color/colored_tint" /> 
     <corners 
      android:radius="0dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
</item> 

<item android:drawable="@drawable/rounded_grayscale_pinstripe_button">   
    <shape> 
     <gradient 
      android:endColor="@color/colored_tint_dark" 
      android:startColor="@color/colored_tint_dark" 
      android:angle="270" /> 
     <stroke 
      android:width="0dp" 
      android:color="@color/colored_tint_dark" /> 
     <corners 
      android:radius="0dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
</item> 

Sé que hay soluciones a este en java, pero estoy buscando específicamente para una solución en XML. Gracias.

Respuesta

12

Crear un selector de tint_menu_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="@color/white" android:state_pressed="true" /> 
    <item android:color="@color/white" android:state_activated="true" /> 
    <item android:color="@color/green" /> 
</selector> 

(En mi ejemplo, la imagen es de color blanco cuando se selecciona, y verde cuando no seleccionado)

Entonces en su xml, puede agregar el atributo de tinte a ImageView:

<ImageView 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:tint="@color/tint_menu_item" 
    android:src="@drawable/ic_menu_home" /> 

También puede utilizar este selector en una TextView usando textColor attibute:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="@color/tint_menu_item" /> 
+0

Hola, tengo problema con selector de tinte sobre el sistema API 18 e inferior [link] (http://stackoverflow.com/questions/38673196/crash -during-inflating-view-with-vector-drawable-tint-color-selector) ¿Tiene alguna sugerencia de cuál puede ser el problema? – Alex

+0

android: atributo de tinte no funciona en todas las API. Para resolver esto, puede crear su archivo .png con el color correcto directamente y luego eliminar el atributo android: tint de su ImageView –

+0

¿Dónde coloco tint_menu_item.xml? – rraallvv

Cuestiones relacionadas