Botón personalizado de Android; cambio de color del texto


251

Hice un botón que cambia el fondo dibujable en diferentes estados, de esta manera:

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

El problema aquí es que también estoy tratando de cambiar el textColor como lo hago con el dibujable, pero no puedo. Ya probé android: textColor y android: color pero el primero no funciona mientras que el segundo cambia mi fondo.

El siguiente código es parte de mi diseño. En cuanto al color del texto, solo funciona para el color de texto de estado normal, por lo tanto, no lo cambia al blanco mientras se presiona

<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"
   />

¿Alguien tiene una pista?

Respuestas:


580

Cree un color con estado para su botón, tal como lo hizo para el fondo, por ejemplo:

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

Coloque el xml en un archivo en la carpeta res / drawable, es decir, res / drawable / button_text_color.xml. Luego solo configura el dibujo como color de texto:

android:textColor="@drawable/button_text_color"

15
Tenga en cuenta que (para mí, al menos) hay un error en el que el estado "normal" (<item android: color = "# ffffff" /> en su respuesta) debe colocarse al final del archivo como en su respuesta. Colocar el estado normal en la parte superior del archivo (por encima de los otros estados) detiene el funcionamiento del selector.
Chris Blunt

58
No es un error. Es la forma en que se supone que funciona la selección de estado. No es el mejor partido , en cambio, el primero que se ajuste lo logrará.
superjos

¿Cómo hacer esto con un valor entero? Estoy tratando de hacer algo similar con el relleno de texto.
Elimirks

Pasé un tiempo intentando esto en vano, luego descubrí que todavía lo había estado configurando en la propiedad de fondo en lugar de la propiedad textcolor. ¡No estoy acostumbrado a ver textcolor tomar un dibujo!
Odaym

20
Es mejor si el selector de color se encuentra en la res/colorcarpeta. Y cuando llame, use:android:textColor="@color/button_text_color"
Justin

16

Otra forma de hacerlo es en tu clase:

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

1
Esto cambiará el color del texto en el botón, pero mantendrá ese color durante los diferentes estados del botón (por ejemplo, presionado). En la mayoría de los escenarios, cuando el color de fondo de un botón cambia durante un estado, también se desea cambiar el color del texto del botón, aquí es donde la respuesta de @Konstantin Burov resulta útil.
Dzhuneyt

1
Esto no responde a la pregunta original. La pregunta es acerca de cómo definir colores basados ​​en estado para una vista de texto al igual que puede establecer elementos dibujables basados ​​en estado.
alquimista

4

ok muy simple primero ve a 1. res-valuse y abre colors.xml 2. copia 1 del texto definido, por ejemplo # FF4081 y cambia el nombre, por ejemplo, cambié a blanco y cambié su valor, por ejemplo, cambié a #FFFFFF para valor blanco como este

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

luego dentro de su botón agregue esta línea

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

ok b3 es el nombre de mi botón, así que cambié el nombre de tu botón, todos los demás serán iguales si usas un color blanco si cambias de color diferente, luego cambia el blanco al nombre de tu color, pero primero debes definir ese color en colores. XML como expliqué en Pont 2


1

Cambiar el color del texto del botón

Porque este método ahora está en desuso

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

Yo uso lo siguiente:

button.setTextColor(ContextCompat.getColor(mContext, R.color.your_color));

0

Usar getColorStateListasí

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

en vez de getColor

setTextColor(resources.getColor(R.color.button_states_color))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.