Android: textColor do botão desativado no seletor não é mostrado?

97

Estou tentando fazer um botão com um seletor, meu botão pode ter os seguintes estados:

  • Ativado desativado
  • Pressionado / Não Pressionado

De acordo com os estados mencionados acima. Eu preciso manipular o botão:

  • Cor do texto
  • imagem de fundo

O botão começa quando eu estou desabilitado, então ele deve ter o textColor desabilitado e o fundo do botão desabilitado. Mas posso ver o textColor padrão (especificado no estilo) e NENHUMA imagem de fundo!

Aqui está meu seletor button_selector.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button" />    

    <item android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/button_pressed"/>

    <item android:state_pressed="true"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button"/>

    <item android:state_pressed="false"
        android:state_enabled="true"
        android:drawable="@drawable/button"/>    

</selector>

E aqui está minha declaração de botão no meu layout.xml

    <Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

E, finalmente, este é o meu estilo (onde meu textColor padrão é definido)

<?xml version="1.0" encoding="utf-8"?>

 <resources>

     <style name="buttonStyle">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">#282780</item>
      <item name="android:textSize">18sp</item>
     </style>

</resources>

Por favor ajude!

Nouran H
fonte

Respostas:

249

Você também precisa criar um ColorStateListpara cores de texto identificando diferentes estados.

Faça o seguinte:

  1. Crie outro arquivo XML com um res\colornome semelhante text_color.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- disabled state -->
      <item android:state_enabled="false" android:color="#9D9FA2" /> 
      <item android:color="#000"/>
    </selector>
  2. Em seu style.xml, coloque uma referência a esse text_color.xmlarquivo da seguinte maneira:

    <style name="buttonStyle" parent="@android:style/Widget.Button">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">@color/text_color</item>
      <item name="android:textSize">18sp</item>
    </style>

Isso deve resolver seu problema.

Adil Soomro
fonte
1
você não precisa salvar seu arquivo text_color.xml em / res / drawable (ao invés de / res / color) se você se referir a ele por @ drawable / text_color?
Erwan
1
@Erwan obrigado pela correção. na verdade, se você ver o histórico de edição, eu postei como uma pasta de desenho, e um cara legal editou para colorir, mas se esqueceu de atualizá-lo para @colorbuttyStyle. Agora está atualizado.
Adil Soomro
4
text_color.xmlnão compila (para mim, pelo menos) a menos que eu o coloque na drawablepasta, o que exige que se refira a ele como@drawable/text_color
Al Lelopath
@mickey sim, você está correto, então se você ver o histórico de edição, inicialmente foi sugerido no drawable, mas alguém o atualizou para a pasta color, agora eu retifiquei.
Adil Soomro,
1
@ D3LIC1OU5 se você olhar os comentários, ambas as formas foram informadas para funcionar. Acabei de consultar a documentação e colora pasta está correta para o Recurso da Lista de Estados de Cores. Sua edição é bem-vinda.
Adil Soomro
7

1. Crie uma pasta de cores em / res / pasta e na pasta de cores crie em xml:

text_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- disabled state --> 
<item android:state_enabled="false" android:color="#776678" /> 
 <item android:color="#ffffff"/>
</selector>

2. Agora, crie um layout xml: -

 <Button

        android:id="@+id/button_search"

        android:layout_width="652dp"

        android:layout_height="48dp"

        android:layout_alignParentLeft="true"

        android:layout_alignParentTop="true"

        android:layout_marginTop="18dp"

        android:background="@android:color/transparent"

        android:text="Hello Bhaskar"

        android:textColor="@color/text_color_selector"/>  
Bhaskar Kumar Singh
fonte
4

A solução mais fácil é definir o filtro de cor para a imagem de fundo do botão e como vi aqui

Você pode fazer o seguinte:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

Espero ter ajudado alguém ...

Woody
fonte
Esta é uma boa maneira de fazer isso dinamicamente, quando você não tem a imagem de fundo do botão com antecedência. Mas isso não se preocupa com a cor do texto.
Eran Goldin
-1
<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

Não consigo ver o diabling do seu botão no seu layout xml. adicione isso ao layout do botão.

android:enabled="false"

então o layout do botão será,

<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:enabled="false"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />
Aqif Hamid
fonte
@ Aqif Hamid, faço isso programaticamente button.setEnabled (false) em meu método onCreat ()
Nouran H
-1

Você pode criar uma lista de cores

localização de arquivo:

res/color/filename.xml

O nome do arquivo será usado como o ID do recurso.

referência de recurso:

Em Java: R.color.filename

Em XML: @[package:]color/filename

sintaxe:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

Exemplo:

Arquivo XML salvo em res/color/button_text.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#ffff0000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#ff0000ff"/> <!-- focused -->
    <item android:color="#ff000000"/> <!-- default -->
</selector>

Este XML de layout aplicará a lista de cores a uma Visualização:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/button_text"
    android:textColor="@color/button_text" />

Consulte: Referência da lista de cores

Lal Krishna
fonte