2010-07-22 7 views
9

Je lis dans certaines données d'une API REST et j'ai besoin de générer des boutons basés sur les informations que l'application reçoit. Parce que j'ai besoin des mêmes boutons dans de nombreux écrans d'activité j'ai étendu Button pour faire un RachelButton et je l'ai mis en place dans le constructeur.Android - Comment programmer la couleur des boutons

public RachelButton(Context context, Info info) { 
    super(context); 
    this.info= info; 

    setText(info.getTime()); 
    setTypeface(Typeface.DEFAULT, Typeface.BOLD); 

    int identifier = 0; 

    if(info.isAvailable()){ 
     identifier = getContext().getResources().getIdentifier("drawable/info_button_"+info.getType(), null, getContext().getPackageName()); 
    }else{ 
     identifier = R.drawable.info_button_unavailable; 
    } 

    if(identifier == 0){ 
     Log.e("INFO_BUTTON", "no button for "+info.getType()); 
    } 

    setBackgroundResource(identifier); 
    setTextColor(R.color.info_button_text_color); 

    setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View view) { 
      //do stuff 
     } 
    }); 
} 

Ensuite, un exemple de la ressource que je utilise pour générer un bouton de couleur est la suivante:

<?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/button_pressed" 
      android:endColor="@color/button_pressed" 
      android:angle="270" /> 
     <stroke 
      android:width="3dp" 
      android:color="@color/button_pressed" /> 
     <corners 
      android:radius="3dp" /> 
     <padding 
      android:left="5dp" 
      android:top="5dp" 
      android:right="5dp" 
      android:bottom="5dp" /> 
    </shape> 
</item> 

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

<item> 
    <shape> 
     <gradient 
      android:endColor="@color/info_normal" 
      android:startColor="@color/info_normal" 
      android:angle="270" /> 
     <stroke 
      android:width="3dp" 
      android:color="@color/info_normal" /> 
     <corners 
      android:radius="3dp" /> 
     <padding 
      android:left="5dp" 
      android:top="5dp" 
      android:right="5dp" 
      android:bottom="5dp" /> 
    </shape> 
</item> 
</selector> 

Comme vous pouvez le voir dans le code que je suis en train de la couleur du texte et je suis sûr que cette couleur existe en tant que ressource (merci IntelliJ). Mais le réglage de la couleur du texte n'a aucun effet, la couleur du texte sur le bouton semble être une nuance plus foncée de la couleur d'arrière-plan du bouton.

Si quelqu'un pouvait me donner quelques conseils sur ce qu'il faut essayer, je serais très reconnaissant.

+0

Vous devriez jeter un oeil à thèmes Android et de styles. Ils vous permettent d'appliquer la même apparence à un, plusieurs ou tous les éléments d'interface utilisateur de différents types. –

+0

Je viens de commencer à lire à ce sujet. – Rachel

Répondre

43

Vous devriez faire:

setTextColor(getContext().getResources().getColor(R.color.info_button_text_color)); 
+0

Merci - cela fonctionne parfaitement :) – Rachel

+0

Merci pour ce – SaKet

+3

De ** API 23 ** vous devrez utiliser 'ContextCompat.getColor (contexte, R.color.your_color);' [getcolorint-id-deprecated-on -android-6-0-marshmallow-api-23] (http://stackoverflow.com/questions/31590714/getcolorint-id-deprecated-on-android-6-0-marshmallow-api-23) –

3

mieux si vous avez l'objet View (findViewById de la classe R) info transformé objet spécifique: par exemple Bouton. (La manière standard - Button b = (Button) fin...(R.id.sdfsdf))

Suivant Type seulement de quelques andro-couleurs:

b.setTextColor(Color.parseColor("green")); 

ou mieux: de RGB

b.setTextColor(Color.rgb(0xff, 0x66, 0x33)); 

Tout est dans le ctrl+spaceBar dans Eclipse: P


Désolé! Peut-être que le b.setTextColor(0xff0000) fonctionnerait également ...

0

La fonction getColor() est déconseillée du niveau d'API 23. Cochez cette case link pour plus de détails.
Ci-dessous le code source de la bibliothèque de support:

public static final int getColor(Context context, int id) { 
    final int version = Build.VERSION.SDK_INT; 
    if (version >= 23) { 
     return ContextCompatApi23.getColor(context, id); 
    } else { 
     return context.getResources().getColor(id); 
    } 
} 
Questions connexes