2011-01-14 11 views
205

ho fatto un pulsante che cambia il drawable sfondo su diversi stati, in questo modo:Pulsante personalizzato Android; cambiando il colore del testo

<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 cercando di cambiare il textColor come faccio con il drawable ma non riesco a farlo. Ho già provato Android: textColor e Android: colore ma il primo non funziona mentre i secondi cambiano il mio background.

Il prossimo codice fa parte del mio layout. Per quanto riguarda il colore del testo funziona solo per il normale colore del testo di stato, quindi non cambiare al bianco uno mentre preme

<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 ottenuto un indizio?

risposta

497

creare un colore stateful per il pulsante, proprio come hai fatto per lo sfondo, ad esempio:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:state_pressed="false" android:color="#ffffff" /> 
    <item android:state_focused="true" android:state_pressed="true" android:color="#000000" /> 
    <item android:state_focused="false" android:state_pressed="true" android:color="#000000" /> 
    <item android:color="#ffffff" /> 
</selector> 

Posizionare il XML in un file alla res/drawable cartella cioè res/drawable/button_text_color.xml. Poi basta impostare il drawable come colore del testo:

android:textColor="@drawable/button_text_color" 
+13

Nota che (per me, almeno) c'è un bug in cui lo stato "normale" ( nella tua risposta) deve essere inserito 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. –

+51

non è un bug. È il modo in cui la selezione dello stato dovrebbe funzionare. Non è una _best match_, invece il primo che si adatta riuscirà a superarlo. – superjos

+0

Come procedere con un valore intero? Sto cercando di fare qualcosa di simile con il padding del testo. – elimirks

14

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à tale colore durante i diversi stati del pulsante (ad esempio premuto). Nella maggior parte degli scenari, quando il colore di sfondo di un pulsante cambia durante uno stato, si desidera anche cambiare anche il colore del testo del pulsante, è qui che la risposta di @Konstantin Burov è utile. –

+0

questo non imposterà colori diversi per ogni stato ... –

+0

Questo non risponde alla domanda originale. La domanda riguarda come definire i colori basati sullo stato in una vista di testo proprio come è possibile impostare i drawable basati sullo stato. – alchemist

1

Cambiare il colore del testo del pulsante

Poiché questo metodo è ormai deprecato

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

Io uso il seguente:

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

ok molto semplice prima andare a 1. res-valuse e colors.xml aperta 2.Copia 1 del testo definito loro ad esempio # FF4081 e cambiare il nome per esempio ho cambiato al bianco e il cambiamento il suo valore, per esempio ho cambiato per #FFFFFF per il valore bianco come questo

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

poi dentro il pulsante aggiungi questa linea

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

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