Android: textColor del pulsante disabilitato nel selettore non visualizzato?


98

Sto cercando di creare un pulsante con un selettore, il mio pulsante può avere i seguenti stati:

  • Abilitato disabilitato
  • Premuto / Non premuto

Secondo gli stati sopra menzionati. Devo manipolare i pulsanti:

  • Colore del testo
  • immagine di sfondo

Il pulsante avvia il mio essere disabilitato quindi dovrebbe avere il textColor disabilitato e lo sfondo del pulsante disabilitato. Ma posso vedere il textColor predefinito (specificato nello stile) e NESSUNA immagine di sfondo!

Ecco il mio selettore 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>

Ed ecco la mia dichiarazione di pulsante nel mio 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 questo è il mio stile (dove è impostato il mio textColor predefinito)

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

Per favore aiuto!

Risposte:


251

È inoltre necessario creare un ColorStateListcolore per il testo che identifichi stati diversi.

Eseguire le seguenti operazioni:

  1. Crea un altro file XML in res\colorqualcosa di simile 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. Nel tuo style.xml, inserisci un riferimento a quel text_color.xmlfile come segue:

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

Questo dovrebbe risolvere il tuo problema.


1
non hai bisogno di salvare il tuo file text_color.xml in / res / drawable (invece che / res / color) se ti riferisci ad esso tramite @ drawable / text_color?
Erwan

1
@Erwan, grazie per la correzione. in realtà, se vedi la cronologia delle modifiche, l'ho pubblicata come cartella disegnabile, e un bravo ragazzo l'ha modificata per colorare ma si è dimenticato di aggiornarla @colorin buttyStyle. Ora è aggiornato.
Adil Soomro

4
text_color.xmlnon compila (almeno per me) a meno che non lo metta nella drawablecartella, che richiede di riferirsi ad esso come@drawable/text_color
Al Lelopath

@mickey sì, hai ragione, quindi se vedi la cronologia delle modifiche, inizialmente era stata suggerita in drawable, ma qualcuno l'ha aggiornata nella cartella dei colori, ora l'ho corretta.
Adil Soomro

1
@ D3LIC1OU5 se guardi i commenti, è stato detto che entrambi i modi funzionano. Ho appena consultato la documentazione ed colorè la cartella corretta per Risorsa Elenco stato colore La tua modifica è benvenuta.
Adil Soomro

7

1.Crea una cartella colori in / res / cartella e nella cartella colori crea su 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.Ora crea un 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"/>  

4

La soluzione più semplice è impostare il filtro del colore sull'immagine di sfondo del pulsante e come ho visto qui

Puoi fare come segue:

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

Spero di aver aiutato qualcuno ...


Questo è un bel modo per farlo in modo dinamico, quando non hai l'immagine di sfondo del pulsante in anticipo. Ma questo non si prende cura del colore del testo.
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" />

Non riesco a vedere il blocco del tuo pulsante nel tuo layout xml. aggiungilo al layout dei pulsanti.

android:enabled="false"

quindi il layout del tuo pulsante sarà,

<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 Lo faccio programmaticamente button.setEnabled (false) nel mio metodo onCreat ()
Nouran H,

-1

Puoi creare un elenco di colori

posizione del file:

res/color/filename.xml

Il nome del file verrà utilizzato come ID risorsa.

riferimento risorsa:

In Java: R.color.filename

In XML: @[package:]color/filename

sintassi:

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

Esempio:

File XML salvato in 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>

Questo XML di layout applicherà l'elenco dei colori a una vista:

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

Fare riferimento a: Riferimento elenco colori

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.