Come disattivare un pulsante?


103

Ho un pulsante definito come mostrato di seguito. Quando voglio disabilitarlo lo uso my_btn.setEnabled(false), ma vorrei anche disattivarlo. Come lo posso fare?

Grazie

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

stile / srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

drawable / btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>

Risposte:


57

Devi fornire 3 o 4 stati nel tuo btn_defaut.xmlcome selettore.

  1. Stato premuto
  2. Stato predefinito
  3. Stato di messa a fuoco
  4. Stato abilitato (stato disabilitato con falsa indicazione; vedere commenti)

Fornirai l'effetto e lo sfondo per gli stati di conseguenza.

Ecco una discussione dettagliata: Pulsante Android standard con un colore diverso


Quindi, per disattivarlo, devo cambiare il colore dello sfondo E il colore del testo nello stato disabilitato? Non c'è modo di aggiungere solo un primo piano trasparente?
jul

3
Sì! quello che fornirai android:state_disable="true"mostrerà lo stato quando il Button è disabilitato, il modo semplice e consigliato.
Adil Soomro

e dove posso specificare il colore del testo per lo stato disabilitato? Sembra che solo uno sfondo può essere specificata ... ho fatto una nuova domanda per questo: stackoverflow.com/questions/8743584/...
jul

17
Non c'è android:state_disable="true", vero? Ti riferisci android:state_enabled="false"?
caw

@MarcoW .: sì, hai assolutamente ragione. Mi scuso per l'attributo sbagliato.
Adil Soomro

171

Puoi anche farlo apparire come disabilitato impostando l'alfa (rendendolo semitrasparente). Ciò è particolarmente utile se lo sfondo del pulsante è un'immagine e non desideri creare stati per esso.

button.setAlpha(.5f);
button.setClickable(false);

aggiornamento: ho scritto la soluzione di cui sopra prima di Kotlin e quando ero un principiante. È più una soluzione "rapida e sporca", ma non la consiglio in un ambiente professionale.

Oggi, se volessi una soluzione generica che funzioni su qualsiasi pulsante / vista senza dover creare un elenco di stati, creerei un'estensione Kotlin.

fun View.disable() {
    getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
    setClickable(false)
}

In Java puoi fare qualcosa di simile con una funzione util statica e dovresti solo passare la vista come variabile. Non è così pulito ma funziona.


4
Avevo letto che le chiamate a setAlpha sono costose sulla CPU. Qualcuno può confermare?
Ali Kazi

@AliKazi dipende dal tipo di tuo View. Da questo post di G + : "Se la vista non contiene comandi di disegno sovrapposti, setAlpha()è ottimizzata e noi modifichiamo semplicemente gli oggetti Paint per applicare l'alfa corretto. Ciò accade quando View.hasOverlappingRendering()restituisce true. ImageViewS e TextViews senza sfondo disegnabile sono candidati comuni per questo ottimizzazione. Se ti trovi in ​​questa situazione, setAlpha()usane quanto vuoi. ".
Sufian

1
@Sufian Thanks. Ma per essere più sicuro, ho fatto affidamento su un semplice StateListDrawable per ogni pulsante. Come l'ho fatto, l'ho pubblicato come nuova risposta. Ho incluso collegamenti a dove ho appreso che alpha è dannoso per le prestazioni.
Ali Kazi,

Visivamente ostile agli utenti
Farid

che effettivamente disabilitano visivamente la visualizzazione. grazie @Siavash
Akash Bisariya

54

La soluzione più semplice è impostare il filtro colore sull'immagine di sfondo di un pulsante 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 ...


Mi piace di più questo approccio. Grazie!
prendi il

2
Questo approccio ha del potenziale, ma il colore risultante non è sempre quello che pensi che sarà. Ad esempio, un pulsante arancione con il colore grigio moltiplicato produce un colore rosso scuro, non un arancione sbiadito.
Someone Somewhere

4
forse Mode.SRC_INdovrebbe essere usato al posto di Moltiplica. Vedi stackoverflow.com/a/17112876/550471
Someone Somewhere

Funziona, ma due colori mescolati si trasformano in un altro colore
Shamsul Arefin Sajib

Eccezionale! così pulito.
Milind Chaudhary

21

Tutte le risposte fornite funzionano bene, ma ricordo di aver appreso che l'uso di setAlpha può essere una cattiva idea in termini di prestazioni (maggiori informazioni qui ). Quindi la creazione di uno StateListDrawable è un'idea migliore per gestire lo stato disabilitato dei pulsanti. Ecco come:

Crea un XML btn_blue.xml nella cartella res / drawable:

<!-- Disable background -->
<item android:state_enabled="false"
      android:color="@color/md_blue_200"/>

<!-- Enabled background -->
<item android:color="@color/md_blue_500"/>

Crea uno stile di pulsante in res / values ​​/ styles.xml

<style name="BlueButton" parent="ThemeOverlay.AppCompat">
      <item name="colorButtonNormal">@drawable/btn_blue</item>
      <item name="android:textColor">@color/md_white_1000</item>
</style>

Quindi applica questo stile al tuo pulsante:

<Button
     android:id="@+id/my_disabled_button"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/BlueButton"/>

Ora quando chiami btnBlue.setEnabled(true)OR btnBlue.setEnabled(false)i colori dello stato cambieranno automaticamente.


12

Imposta Clickable come false e cambia il colore dello sfondo come:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));

12

Dovresti creare un file XML per il pulsante disabilitato ( drawable / btn_disable.xml )

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/grey" />
    <corners android:radius="6dp" />
</shape>

E crea un selettore per il pulsante ( drawable / btn_selector.xml )

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

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

</selector>

Aggiungi il selettore al tuo pulsante

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>


1

Ho usato questo codice per questo:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);

0

Ho provato le soluzioni di cui sopra ma nessuna di esse sembrava funzionare per me. Sono andato con la seguente opzione:

<!-- button_color_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_enabled="true"/>
    <item android:color="@color/colorAccentLight" android:state_enabled="false"/>
</selector>
<com.google.android.material.button.MaterialButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:backgroundTint="@color/button_color_selector"
                .../>
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.