Botão personalizado para Android; mudando a cor do texto

251

Eu criei um botão que altera o fundo do drawable em diferentes estados, da seguinte maneira:

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

O problema aqui é que também estou tentando alterar o textColor como faço com o drawable, mas não estou conseguindo. Eu já tentei android: textColor e android: color, mas o primeiro não funciona enquanto os segundos mudam meu plano de fundo.

O próximo código faz parte do meu layout. Em relação à cor do texto, ele funciona apenas para a cor de texto em estado normal, não alterando-a para a cor branca enquanto pressionada

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

Alguém tem uma pista?

dwbrito
fonte

Respostas:

579

Crie uma cor com estado para o seu botão, assim como você fez no segundo plano, por exemplo:

<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 o xml em um arquivo na pasta res / drawable, ou seja, res / drawable / button_text_color.xml. Em seguida, basta definir o desenho como cor do texto:

android:textColor="@drawable/button_text_color"
Konstantin Burov
fonte
15
Observe que (pelo menos para mim) existe um erro em que o estado "normal" (<item android: color = "# ffffff" /> na sua resposta) deve ser colocado no final do arquivo, como na sua resposta. A colocação do estado normal na parte superior do arquivo (acima dos outros estados) impede o seletor de funcionar.
22811 Chris Blunt
58
não é um bug. É assim que a seleção de estados deve funcionar. Não é a melhor partida , mas a primeira que se encaixa fará com que ela continue.
Super11 de
Você como fazer isso com um valor inteiro? Estou tentando fazer algo semelhante com o preenchimento de texto.
28514 elimirks
passei algum tempo tentando isso sem sucesso, depois descobri que eu ainda estava configurando a propriedade background em vez da propriedade textcolor. Não está acostumado a ver textcolor pegar um drawable!
Odaym 27/08/14
20
É melhor se o seletor de cores estiver localizado na res/colorpasta. E quando ligar, use:android:textColor="@color/button_text_color"
Justin
16

Outra maneira de fazer isso é na sua turma:

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
fonte
1
Isso mudará a cor do texto no botão, mas permanecerá nessa cor durante os diferentes estados do botão (por exemplo, pressionado). Na maioria dos cenários, quando a cor de fundo de um botão muda durante um estado, também é desejável alterar a cor do texto do botão, é aqui que a resposta de @Konstantin Burov se torna útil.
Dzhuneyt 19/09/09
1
Isso não responde à pergunta original. A questão é sobre como definir cores baseadas em estado para uma exibição de texto, assim como você pode definir drawables baseados em estado.
alquimista
4

ok muito simples primeiro vá para 1. res-valuse e abra colors.xml 2. copie 1 do texto definido, por exemplo, # FF4081 e mude o nome, por exemplo, mudei para branco e alterei seu valor, por exemplo, mudei para #FFFFFF para valor branco como este

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

então dentro do seu botão adicione esta linha

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

ok b3 é o nome do meu botão; assim, o nome do botão é alterado. Todos os outros serão iguais se você usar a cor branca, se você alterar a cor diferente, depois mudar o branco para o nome da sua cor, mas primeiro você definirá essa cor em cores. xml como eu expliquei no pont 2

Buscando conhecimento
fonte
1

Alterando a cor do texto do botão

Como esse método agora está obsoleto

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

Eu uso o seguinte:

button.setTextColor(ContextCompat.getColor(mContext, R.color.your_color));
Gjoko Bozinov
fonte
0

Use getColorStateListassim

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

ao invés de getColor

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