Pulsante personalizzato Android; cambiando colore del testo


251

Ho creato un pulsante che modifica lo sfondo disegnabile in diversi stati, in questo modo:

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

Il problema qui è che sto anche provando a cambiare textColor come faccio con il disegno ma non ci riesco. Ho già provato Android: textColor e Android: color ma il primo non funziona mentre i secondi cambiano il mio sfondo.

Il prossimo codice fa parte del mio layout. Per quanto riguarda il colore del testo, funziona solo con il colore del testo normale, quindi non cambia in quello bianco mentre è premuto

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

Qualcuno ha avuto un indizio?

Risposte:


580

Crea un colore con stato per il tuo pulsante, proprio come hai fatto per lo sfondo, ad esempio:

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

Posizionare il file XML in un file nella cartella res / drawable, ovvero res / drawable / button_text_color.xml. Quindi imposta il disegno come colore del testo:

android:textColor="@drawable/button_text_color"

15
Nota che (almeno per me) c'è un bug in cui lo stato "normale" (<item android: color = "# ffffff" /> nella tua risposta) deve essere posizionato alla fine del file come nella tua risposta. Posizionare lo stato normale nella parte superiore del file (sopra gli altri stati) impedisce al selettore di funzionare.
Chris Blunt,

58
non è un bug. È il modo in cui la selezione dello stato dovrebbe funzionare. Non è una partita migliore , invece il primo che si adatta ce la farà.
Superjos,

Come fare con un valore intero? Sto cercando di fare qualcosa di simile con l'imbottitura di testo.
elimirks,

ho trascorso un po 'di tempo a provare questo inutilmente, poi ho scoperto che lo stavo ancora impostando sulla proprietà background invece della proprietà textcolor. Non abituato a vedere textcolor prendere un disegno!
Odaym,

20
È migliore se il selettore dei colori si trova nella res/colorcartella. E quando chiama, usa:android:textColor="@color/button_text_color"
Giustino il

16

Un altro modo per farlo è nella tua classe:

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
Questo cambierà il colore del testo sul pulsante, ma rimarrà quel colore durante i diversi stati del pulsante (ad es. Premuto). Nella maggior parte degli scenari, quando il colore di sfondo di un pulsante cambia durante uno stato, si desidera anche cambiare il colore del testo del pulsante, qui è utile la risposta di @Konstantin Burov.
Dzhuneyt,

1
Questo non risponde alla domanda originale. La domanda è su come definire i colori basati sullo stato in una vista di testo proprio come è possibile impostare disegnabili basati sullo stato.
alchimista,

4

ok molto semplice prima vai a 1. res-valuse e apri colors.xml 2.copia 1 del testo definito loro ad esempio # FF4081 e cambia nome per esempio sono cambiato in bianco e cambio il suo valore per esempio ho cambiato in #FFFFFF per valore bianco come questo

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

quindi all'interno del tuo pulsante aggiungi questa riga

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

ok b3 è il nome del mio pulsante, quindi cambia il nome del tuo pulsante tutti gli altri saranno uguali se usi il colore bianco se cambi colore diverso, poi cambi bianco con il nome del tuo colore ma prima hai definito quel colore nei colori. XML come ho spiegato in Pont 2


1

Modifica del colore del testo del pulsante

Perché questo metodo è ora obsoleto

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

Io uso il seguente:

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

0

Usa getColorStateListcosì

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

invece di getColor

setTextColor(resources.getColor(R.color.button_states_color))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.