web-dev-qa-db-fra.com

Android bouton avec différentes couleurs d'arrière-plan

je veux changer la couleur de fond d'un bouton en utilisant un fichier sélecteur-xml. Mon approche est fondamentalement celle de l'exemple en bas de cette page: http://developer.Android.com/guide/topics/resources/color-list-resource.html

j'ai un res/color/button_text.xml qui ressemble à ceci:

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

et ma mise en page contient le code suivant:

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

(** est uniquement là pour vous montrer que j'utilise Android: background au lieu d'Android: textcolor)

ce code plante. il dit "La balise de la ligne n ° 4 du fichier XML binaire nécessite un attribut 'drawable' ou une balise enfant définissant drawable. Mais si je l'essaie avec Android: textColor comme décrit dans le lien ci-dessus, cela fonctionne très bien. je ne veux pas créer un 9patch-png si ce n'est pas nécessaire (en gros j'ai juste besoin d'un rectangle "cliquable" donc j'utilise un bouton avec un fond coloré)

35
Daniel

Comme l'indique votre erreur, vous devez définir drawable attibute pour les éléments (pour une raison quelconque, il est requis en ce qui concerne les définitions d'arrière-plan), donc:

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

Notez également que l'attribut drawable n'accepte pas les valeurs de couleur brutes, vous devez donc définir les couleurs en tant que ressources. Créez le fichier colors.xml dans le dossier res/values:

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

Dans l'URL que vous avez pointée, le button_text.xml est utilisé pour définir l'attribut textColor. C'est la raison pour laquelle ils avaient le button_text.xml dans le dossier res/color et ils ont donc utilisé @ color/button_text.xml

Mais vous essayez de l'utiliser pour l'attribut d'arrière-plan. L'attribut background recherche quelque chose dans le dossier res/drawable.

vérifiez cela, j'ai obtenu ce bouton personnalisé de sélection sur Internet.Je n'ai pas le lien.Mais je remercie l'affiche pour cela.Il m'a aidé.Avoir cela dans le dossier dessinable

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

Et j'ai utilisé dans ma disposition main.xml comme ceci

<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"/>

J'espère que cela t'aides. Vik a raison.

EDIT: Voici le 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>
28
Sreeram

Vous devez placer le fichier selector.xml dans le dossier dessinable. Ensuite, écrivez: Android:background="@drawable/selector". Cela prend en charge les états pressés et focalisés.

4
Vik

en Mono Android vous pouvez utiliser un filtre comme celui-ci:

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