Android: ¿no se muestra el color del botón deshabilitado en el selector?

97

Estoy tratando de hacer un botón con un selector, mi botón puede tener los siguientes estados:

  • Habilitado Deshabilitado
  • Presionado / No presionado

Según los estados mencionados anteriormente. Necesito manipular el botón:

  • Color de texto
  • imagen de fondo

El botón comienza a estar deshabilitado, por lo que debería tener el color de texto deshabilitado y el fondo del botón deshabilitado. ¡Pero puedo ver el color de texto predeterminado (especificado en el estilo) y SIN imagen de fondo!

Aquí está mi selector 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>

Y aquí está mi declaración de botón en my 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" />

Y finalmente este es mi estilo (donde se establece mi color de texto predeterminado)

<?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 ayuda!

Nouran H
fuente

Respuestas:

250

También debe crear un ColorStateListcolor para texto que identifique diferentes estados.

Haz lo siguiente:

  1. Cree otro archivo XML con un res\colornombre similar 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. En su style.xml, ponga una referencia a ese text_color.xmlarchivo de la siguiente manera:

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

Esto debería resolver su problema.

Adil Soomro
fuente
1
¿No necesita guardar su archivo text_color.xml en / res / drawable (en lugar de / res / color) si se refiere a él mediante @ drawable / text_color?
Erwan
1
@Erwan gracias por la corrección. en realidad, si ve el historial de edición, lo publiqué como carpeta dibujable y un buen tipo lo editó para colorear, pero se olvidó de actualizarlo @coloren buttyStyle. Ahora está actualizado.
Adil Soomro
4
text_color.xmlno se compila (para mí, al menos) a menos que lo coloque en la drawablecarpeta, que requiere referirse a él como@drawable/text_color
Al Lelopath
@mickey sí, está en lo correcto, así que si ve el historial de edición, inicialmente se sugirió como dibujable, pero alguien lo actualizó a la carpeta de colores, ahora lo rectifiqué.
Adil Soomro
1
@ D3LIC1OU5 si miras los comentarios, se les ha dicho que funcionen en ambos sentidos. Acabo de consultar la documentación y colores la carpeta correcta para el recurso de lista de estado de color. Su edición es bienvenida.
Adil Soomro
7

1.Cree una carpeta de color en la carpeta / res / y en la carpeta de color cree en 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.Ahora crea un diseño 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
fuente
4

La solución más fácil es configurar el filtro de color en la imagen de fondo y el botón como vi aquí

Puedes hacer lo siguiente:

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

Espero haber ayudado a alguien ...

Leñoso
fuente
Esta es una buena manera de hacer esto de forma dinámica, cuando no tiene la imagen de fondo del botón de antemano. Pero esto no se ocupa del color del 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" />

No puedo ver la marcación de su botón en su diseño xml. agregue esto al diseño de su botón.

android:enabled="false"

por lo que el diseño de su botón 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
fuente
@ Aqif Hamid hago eso programáticamente button.setEnabled (false) en mi método onCreat ()
Nouran H
-1

Puedes crear una lista de colores

ubicación del archivo:

res/color/filename.xml

El nombre de archivo se utilizará como ID de recurso.

referencia de recurso:

En Java: R.color.filename

En XML: @[package:]color/filename

sintaxis:

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

Ejemplo:

Archivo XML guardado en 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 diseño aplicará la lista de colores a una vista:

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

Consulte: Referencia de lista de colores

Lal Krishna
fuente