10

I am reading in some data from a REST api and need to generate some buttons based on the information the app receives.

Because I need the same buttons in many Activity screens I have extended Button to make a RachelButton and I set it up in the constructor.

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
        }
    });
}

Then an example of the resource I am using to generate a colored button is this:

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

As you can see in the code I am setting the text color and I'm sure that this color exists as a resource (thank you IntelliJ).

But setting the text color like this has no effect at all, the text color on the button seems to be a darker shade of the button's background color.

If anyone could give me some advice as to what to try next I would be most appreciative.

Rachel
  • 3,691
  • 5
  • 32
  • 32

3 Answers3

44

You should do:

setTextColor(getContext().getResources().getColor(R.color.info_button_text_color));
pakerfeldt
  • 1,491
  • 1
  • 14
  • 23
  • 3
    From **API 23** you will want to use `ContextCompat.getColor(context, 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) – Simon Featherstone Jul 01 '16 at 11:42
3

Better if you have the View object (findViewById from R class) transformed info specific object: for example Button. ( the standard way - Button b = (Button) fin...(R.id.sdfsdf) )

Next just type from a few andro-colors:

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

or BETTER: FROM RGB

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

Everything is in the ctrl+spaceBar in Eclipse :P


Sorry! Maybe the b.setTextColor(0xff0000) would also works...

duggu
  • 37,851
  • 12
  • 116
  • 113
Volodia
  • 84
  • 1
  • 1
  • 6
0

The getColor() function is deprecated from API level 23. Check this link for more details.
Below is the source code from the support library:

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);
   }
}