Bouton personnalisé Android; modification de la couleur du texte

251

J'ai fait un bouton qui change l'arrière-plan dessinable sur différents états, de cette façon:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_pressed="true" android:drawable="@drawable/btn_location_pressed" /> <!-- pressed -->
 <item android:state_focused="true" android:drawable="@drawable/btn_location_pressed"/> <!-- focused -->
 <item android:drawable="@drawable/btn_location"/> <!-- default -->

Le problème ici est que j'essaie également de changer le textColor comme je le fais avec le dessinable, mais je ne suis pas en mesure de le faire. J'ai déjà essayé android: textColor et android: color mais le premier ne fonctionne pas tandis que les secondes changent mon arrière-plan.

Le code suivant fait partie de ma mise en page. En ce qui concerne la couleur du texte, cela ne fonctionne que pour la couleur du texte à l'état normal, donc ne pas la changer en blanc tout en appuyant

<Button android:id="@+id/location_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:background="@drawable/location"          
        android:textSize="15sp"
        android:textColor="@color/location_color"
        android:textColorHighlight="#FFFFFF"
   />

Quelqu'un a-t-il une idée?

dwbrito
la source

Réponses:

580

Créez une couleur dynamique pour votre bouton, comme vous l'avez fait pour le fond, par exemple:

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

    <!-- Focused and not pressed -->
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:color="#ffffff" />

    <!-- Focused and pressed -->
    <item android:state_focused="true" 
          android:state_pressed="true" 
          android:color="#000000" />

    <!-- Unfocused and pressed -->
    <item android:state_focused="false" 
          android:state_pressed="true" 
          android:color="#000000" />

    <!-- Default color -->
    <item android:color="#ffffff" />

</selector>

Placez le xml dans un fichier dans le dossier res / drawable, c'est-à-dire res / drawable / button_text_color.xml. Ensuite, définissez simplement le dessin comme couleur de texte:

android:textColor="@drawable/button_text_color"
Konstantin Burov
la source
15
Notez que (pour moi, au moins) il y a un bug où l'état "normal" (<item android: color = "# ffffff" /> dans votre réponse) doit être placé à la fin du fichier comme dans votre réponse. Placer l'état normal en haut du fichier (au-dessus des autres états) arrête le sélecteur de fonctionner.
Chris Blunt
58
ce n'est pas un bug. C'est ainsi que la sélection d'état est censée fonctionner. Ce n'est pas le meilleur match , mais le premier qui correspond le fera.
superjos
Savez-vous comment faire cela avec une valeur entière? J'essaie de faire quelque chose de similaire avec le remplissage de texte.
elimirks
a passé un certain temps à essayer cela en vain, puis a découvert que je l'avais toujours défini sur la propriété background au lieu de la propriété textcolor. Pas habitué à voir textcolor prendre un dessinable!
Odaym
20
Il beter si le sélecteur de couleur se trouve dans le res/colordossier. Et lorsque vous appelez, utilisez:android:textColor="@color/button_text_color"
Justin
16

Une autre façon de le faire est dans votre classe:

import android.graphics.Color; // add to top of class  

Button btn = (Button)findViewById(R.id.btn);

// set button text colour to be blue
btn.setTextColor(Color.parseColor("blue"));

// set button text colour to be red
btn.setTextColor(Color.parseColor("#FF0000"));

// set button text color to be a color from your resources (could be strings.xml)
btn.setTextColor(getResources().getColor(R.color.yourColor));

// set button background colour to be green
btn.setBackgroundColor(Color.GREEN);
Michael Yaworski
la source
1
Cela changera la couleur du texte sur le bouton, mais restera cette couleur pendant les différents états du bouton (par exemple pressé). Dans la plupart des scénarios, lorsque la couleur d'arrière-plan d'un bouton change pendant un état, il est également souhaitable de modifier la couleur du texte du bouton, c'est là que la réponse de @Konstantin Burov est utile.
Dzhuneyt
1
Cela ne répond pas à la question d'origine. La question est de savoir comment définir des couleurs basées sur un état dans une vue de texte, tout comme vous pouvez définir des dessinables basés sur un état.
alchimiste
4

ok très simple, allez d'abord à 1. res-valuse et ouvrez colours.xml 2. copiez 1 du texte défini par exemple # FF4081 et changez le nom par exemple j'ai changé en blanc et changez sa valeur par exemple j'ai changé en #FFFFFF pour valeur blanche comme celle-ci

<color name="White">#FFFFFF</color>

puis à l'intérieur de votre bouton ajoutez cette ligne

 b3.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.White));

ok b3 est le nom de mon bouton, donc le nom de votre bouton a changé, tous les autres seront les mêmes si vous utilisez la couleur blanche si vous changez de couleur différente, puis changez le blanc en nom de votre couleur mais d'abord vous avez défini cette couleur en couleurs. xml comme je l'ai expliqué dans le pont 2

SeekKleowleges
la source
1

Modification de la couleur du texte du bouton

Parce que cette méthode est désormais obsolète

button.setTextColor(getResources().getColor(R.color.your_color));

J'utilise ce qui suit:

button.setTextColor(ContextCompat.getColor(mContext, R.color.your_color));
Gjoko Bozinov
la source
0

Utilisez getColorStateListcomme ça

setTextColor(resources.getColorStateList(R.color.button_states_color))

au lieu de getColor

setTextColor(resources.getColor(R.color.button_states_color))
Li Jin
la source