Android: la couleur du bouton désactivé dans le sélecteur ne s'affiche pas?


98

J'essaye de faire un bouton avec un sélecteur mon bouton peut avoir les états suivants:

  • Activé Désactivé
  • Pressé / Non Pressé

Selon les états mentionnés ci-dessus. J'ai besoin de manipuler les boutons:

  • Couleur du texte
  • image de fond

Le bouton commence par être désactivé, il devrait donc avoir le textColor désactivé et l'arrière-plan du bouton désactivé. Mais je peux voir le textColor par défaut (spécifié dans le style) et AUCUNE image d'arrière-plan!

Voici mon sélecteur button_selector.xml

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button" />    

    <item android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/button_pressed"/>

    <item android:state_pressed="true"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button"/>

    <item android:state_pressed="false"
        android:state_enabled="true"
        android:drawable="@drawable/button"/>    

</selector>

Et voici ma déclaration de bouton dans le my layout.xml

    <Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

Et enfin c'est mon style (où mon textColor par défaut est défini)

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

 <resources>

     <style name="buttonStyle">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">#282780</item>
      <item name="android:textSize">18sp</item>
     </style>

</resources>

Veuillez aider!

Réponses:


251

Vous devez également créer ColorStateListdes couleurs de texte pour identifier les différents états.

Procédez comme suit:

  1. Créez un autre fichier XML res\colornommé quelque chose comme text_color.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- disabled state -->
      <item android:state_enabled="false" android:color="#9D9FA2" /> 
      <item android:color="#000"/>
    </selector>
  2. Dans votre style.xml, mettez une référence à ce text_color.xmlfichier comme suit:

    <style name="buttonStyle" parent="@android:style/Widget.Button">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">@color/text_color</item>
      <item name="android:textSize">18sp</item>
    </style>

Cela devrait résoudre votre problème.


1
n'avez-vous pas besoin d'enregistrer votre fichier text_color.xml dans / res / drawable (plutôt que / res / color) si vous y faites référence par @ drawable / text_color?
Erwan

1
@Erwan merci pour la correction. en fait, si vous voyez l'historique des modifications, je l'ai posté en tant que dossier pouvant être dessiné, et un gars sympa l'a édité en couleur mais j'ai oublié de le mettre à jour @colordans buttyStyle. Maintenant c'est mis à jour.
Adil Soomro

4
text_color.xmlne compile pas (pour moi, du moins) sauf si je le place dans le drawabledossier, ce qui nécessite de s'y référer comme@drawable/text_color
Al Lelopath

@mickey oui, vous avez raison, donc si vous voyez l'historique des modifications, il a été initialement suggéré dans drawable, mais quelqu'un l'a mis à jour dans le dossier de couleur, je l'ai maintenant rectifié.
Adil Soomro

1
@ D3LIC1OU5 si vous regardez les commentaires, les deux méthodes fonctionnent. Je viens de consulter la documentation et colorest le dossier correct pour la ressource de liste d'état de couleur Votre modification est la bienvenue.
Adil Soomro du

7

1.Créez un dossier de couleur dans le dossier / res / et dans le dossier de couleur créer sur xml:

text_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- disabled state --> 
<item android:state_enabled="false" android:color="#776678" /> 
 <item android:color="#ffffff"/>
</selector>

2.Maintenant, créez une mise en page XML: -

 <Button

        android:id="@+id/button_search"

        android:layout_width="652dp"

        android:layout_height="48dp"

        android:layout_alignParentLeft="true"

        android:layout_alignParentTop="true"

        android:layout_marginTop="18dp"

        android:background="@android:color/transparent"

        android:text="Hello Bhaskar"

        android:textColor="@color/text_color_selector"/>  

4

La solution la plus simple consiste à définir le filtre de couleur sur l'image d'arrière-plan et le bouton comme je l'ai vu ici

Vous pouvez faire comme suit:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

J'espère que j'ai aidé quelqu'un ...


C'est une bonne façon de le faire de manière dynamique, lorsque vous n'avez pas l'image d'arrière-plan du bouton à l'avance. Mais cela ne prend pas en charge la couleur du texte.
Eran Goldin

-1
<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

Je ne vois pas le diabling de votre bouton dans votre mise en page xml. ajoutez ceci à votre disposition de bouton.

android:enabled="false"

ainsi votre disposition de bouton sera,

<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:enabled="false"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

@ Aqif Hamid Je fais ça par programme button.setEnabled (false) dans ma méthode onCreat ()
Nouran H

-1

Vous pouvez créer une liste de couleurs

emplacement du fichier:

res/color/filename.xml

Le nom de fichier sera utilisé comme ID de ressource.

référence de ressource:

En Java: R.color.filename

En XML: @[package:]color/filename

syntaxe:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

Exemple:

Fichier XML enregistré à res/color/button_text.xml:

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

Ce format XML appliquera la liste de couleurs à une vue:

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

Référez-vous: Référence de la liste de couleurs

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.