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?

dwbrito
fuente

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"
Konstantin Burov
fuente
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);
Michael Yaworski
fuente
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

Buscando Conocimientos
fuente
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));
Gjoko Bozinov
fuente
0

Usar getColorStateListasí

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

en vez de getColor

setTextColor(resources.getColor(R.color.button_states_color))
Li Jin
fuente