2010-07-22 27 views
9

Estoy leyendo algunos datos de una API REST y necesito generar algunos botones basados ​​en la información que recibe la aplicación.Android - Cómo establecer programáticamente color de botón

Como necesito los mismos botones en muchas pantallas de Actividad, he extendido el Botón para hacer un RachelButton y lo configuré en el 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 
     } 
    }); 
} 

A continuación, un ejemplo de recurso que estoy utilizando para generar un botón de color es la siguiente:

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

Como se puede ver en el código estoy fijando el color del texto y estoy seguro de que este color existe como recurso (gracias IntelliJ).

Pero establecer el color del texto de esta manera no tiene ningún efecto, el color del texto en el botón parece ser un tono más oscuro del color de fondo del botón.

Si alguien me puede dar algunos consejos sobre qué probar a continuación, le agradecería mucho.

+0

Usted debe echar un vistazo a los temas y estilos Android. Permiten aplicar el mismo aspecto y tacto a uno, más o todos los elementos de la interfaz de usuario de varios tipos. –

+0

Acabo de comenzar a leer sobre eso. – Rachel

Respuesta

43

que debe hacer:

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

Gracias, eso funciona perfectamente :) – Rachel

+0

Gracias por esto – SaKet

+3

De ** API 23 ** querrá usar '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) –

3

Es mejor si tienes la vista de objetos (findViewById de la clase R) información transformado objeto específico: por ejemplo Button. (La forma estándar - Button b = (Button) fin...(R.id.sdfsdf))

A continuación basta con escribir desde unos pocos andro-colores:

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

o mejor: de RGB

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

Todo está en el ctrl+spaceBar en Eclipse: P


¡Lo siento! Tal vez el b.setTextColor(0xff0000) también funcionaría ...

0

La función getColor() está obsoleta desde el nivel API 23. Consulte este link para obtener más detalles.
A continuación se muestra el código fuente de la biblioteca de soporte:

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