2010-09-17 17 views
34

Quiero cambiar el color de fondo de un botón utilizando un selector-xml-file. Mi enfoque es básicamente la del ejemplo en la parte inferior de esta página: http://developer.android.com/guide/topics/resources/color-list-resource.htmlBotón Android con diferentes colores de fondo

tengo una res/color/button_text.xml que se parece a esto:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
      android:color="#ffff0000"/> <!-- pressed --> 
    <item android:state_focused="true" 
      android:color="#ff0000ff"/> <!-- focused --> 
    <item android:color="#ff000000"/> <!-- default --> 
</selector> 

y mi diseño contiene el siguiente código:

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/button_text" 
    **android:background="@color/button_text"** /> 

(** está allí sólo para mostrar que yo uso androide: fondo en lugar de Android: TextColor)

este código se bloquea. dice "La etiqueta de la línea 4 del archivo XML binario requiere un atributo 'dibujable' o una etiqueta hija que define dibujable. Pero si lo intento con android: textColor como se describe en el enlace anterior, funciona bien. Por lo tanto, tiene que ser el problema de fondo. no quieren crear un 9patch-png si no es necesario (básicamente sólo necesito un rectángulo "hacer clic" lo que el uso de un botón con un fondo de color)

+0

respuesta de Konstantin tiene un error tipográfico - la línea 'androide material: color =" @ color/black "' .......... Propongo que debería leer el ítem android: drawable = "@ color/black" ........... –

+0

http: // stackoverflow. com/a/15880688/1352919 – Faakhir

Respuesta

77

a medida que sus estados de error, tiene que definir dibujable attibute para los elementos (por alguna razón se requiere cuando se trata de las definiciones de fondo), por lo que:

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

también tenga en cuenta que dibujable att ribute no acepta valores de color sin procesar, por lo que debe definir los colores como recursos. Crear colors.xml archivo en res/valores carpeta:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="black">#000</color> 
    <color name="blue">#00f</color> 
    <color name="red">#f00</color> 
</resources> 
+5

ítem android: color = "@ color/negro" elemento s/b android: drawable = "@ color/black" – Noah

+0

@Noah thx, arreglado eso. –

+0

Si esto resolvió su problema, ¿lo acepta como respuesta? –

4

Tienes que poner el archivo en la carpeta selector.xml drwable. Luego escriba: android:background="@drawable/selector". Esto se ocupa de los estados presionados y enfocados.

27

En la URL que ha señalado, se usa el button_text.xml para establecer el atributo textColor. Es por eso que tenían el button_text.xml en la carpeta res/color y por lo tanto usaron @ color/button_text.xml

Pero está intentando usarlo como atributo de fondo. El atributo de fondo busca algo en la carpeta res/dibujable.

cheque esto me dieron este botón selector de encargo de la internet.I no tiene el link.but Doy las gracias al cartel para this.It ayudó me.have esto en la carpeta dibujable

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
     <shape> 
      <gradient 
       android:startColor="@color/yellow1" 
       android:endColor="@color/yellow2" 
       android:angle="270" /> 
      <stroke 
       android:width="3dp" 
       android:color="@color/grey05" /> 
      <corners 
       android:radius="3dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 

    <item android:state_focused="true" > 
     <shape> 
      <gradient 
       android:endColor="@color/orange4" 
       android:startColor="@color/orange5" 
       android:angle="270" /> 
      <stroke 
       android:width="3dp" 
       android:color="@color/grey05" /> 
      <corners 
       android:radius="3dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 

    <item>   
     <shape> 
      <gradient 
       android:endColor="@color/white1" 
       android:startColor="@color/white2" 
       android:angle="270" /> 
      <stroke 
       android:width="3dp" 
       android:color="@color/grey05" /> 
      <corners 
       android:radius="3dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 

</selector> 

y solía en mi diseño main.xml como este

<Button android:id="@+id/button1" 
      android:layout_alignParentLeft="true" 
      android:layout_marginTop="150dip" 
      android:layout_marginLeft="45dip" 
      android:textSize="7pt" 
      android:layout_height="wrap_content" 
      android:layout_width="230dip" 
      android:text="@string/welcomebtntitle1" 
      android:background="@drawable/custombutton"/> 

Espero que esto ayude. Vik está en lo correcto.

EDIT: Aquí es el colors.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="yellow1">#F9E60E</color> 
    <color name="yellow2">#F9F89D</color> 
    <color name="orange4">#F7BE45</color> 
    <color name="orange5">#F7D896</color> 
    <color name="blue2">#19FCDA</color> 
    <color name="blue25">#D9F7F2</color> 
    <color name="grey05">#ACA899</color> 
    <color name="white1">#FFFFFF</color> 
    <color name="white2">#DDDDDD</color> 
</resources> 
+0

¿tiene el archivo color.xml para ir junto con esto? – electrichead

+0

@electrichead - Sí, lo tengo. Estoy editando mi respuesta. por favor mira. – Sreeram

+0

La primera vez que vi esta respuesta fue cuando comencé a trabajar con Android y la cantidad de código XML me intimidó, pero dos meses después volví a encontrarlo y es una gran respuesta al problema general de crear colores de botones personalizados. sin usar una imagen –

2

en Mono Android puede utilizar filtro de la siguiente manera:

your_button.Background.SetColorFilter(new Android.Graphics.PorterDuffColorFilter(Android.Graphics.Color.Red, Android.Graphics.PorterDuff.Mode.Multiply)); 
+0

El fondo debería leer getbackground(). Otra opción es usar un filtro como ese: myButton.getBackground(). SetColorFilter (nuevo LightingColorFilter (multiplicador, bckgrd_color)); – hornetbzz

Cuestiones relacionadas