Wie wird ein Knopf ausgegraut?

103

Ich habe eine Schaltfläche wie unten gezeigt definiert. Wenn ich es deaktivieren möchte, verwende ich my_btn.setEnabled(false), aber ich möchte es auch ausgrauen. Wie kann ich das machen?

Vielen Dank

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

style / 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>
jul
quelle
2
Verwenden Sie einen Selektor stackoverflow.com/questions/7335345/button-background-selector
Buda Gavril

Antworten:

57

Sie müssen 3 oder 4 Status in Ihrem btn_defaut.xmlals Selektor angeben.

  1. Gedrückter Zustand
  2. Standardzustand
  3. Fokuszustand
  4. Aktivierter Status (Deaktivierter Status mit falscher Angabe; siehe Kommentare)

Sie werden die Wirkung und den Hintergrund für die Zustände entsprechend bereitstellen.

Hier ist eine ausführliche Diskussion: Standard Android Button mit einer anderen Farbe

Adil Soomro
quelle
Um es auszublenden, muss ich die Farbe des Hintergrunds UND die Farbe des Textes im deaktivierten Zustand ändern. Es gibt keine Möglichkeit, nur einen transparenten Vordergrund hinzuzufügen?
Juli
3
Ja! Was Sie dafür bereitstellen android:state_disable="true", zeigt den Status, wenn die Schaltfläche deaktiviert ist, auf einfache und empfohlene Weise.
Adil Soomro
und wo kann ich die Textfarbe für den deaktivierten Status angeben? Es scheint , dass nur ein Hintergrund spezifiziert werden kann ... fragte ich eine neue Frage für diese: stackoverflow.com/questions/8743584/...
Juli
17
Es gibt keine android:state_disable="true", gibt es? Beziehen Sie sich auf android:state_enabled="false"?
Caw
@MarcoW.: Ja du bist absolut richtig. Entschuldigung für das falsche Attribut.
Adil Soomro
170

Sie können es auch als deaktiviert anzeigen, indem Sie das Alpha einstellen (halbtransparent machen). Dies ist besonders nützlich, wenn Ihr Schaltflächenhintergrund ein Bild ist und Sie keine Status dafür erstellen möchten.

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

Update: Ich habe die obige Lösung vor Kotlin geschrieben und als ich ein Anfänger war. Es ist eher eine "schnelle" Lösung, aber ich empfehle sie nicht in einem professionellen Umfeld.

Wenn ich heute eine generische Lösung wollte, die auf jeder Schaltfläche / Ansicht funktioniert, ohne eine Statusliste erstellen zu müssen, würde ich eine Kotlin-Erweiterung erstellen.

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

In Java können Sie mit einer statischen util-Funktion etwas Ähnliches tun, und Sie müssten lediglich die Ansicht als Variable übergeben. Es ist nicht so sauber, aber es funktioniert.

Siavash
quelle
4
Ich hatte gelesen, dass Aufrufe von setAlpha auf der CPU teuer sind. Kann jemand bestätigen?
Ali Kazi
@AliKazi es hängt von der Art Ihrer View. Aus diesem G + -Post : "Wenn Ihre Ansicht keine überlappenden Zeichenbefehle enthält, setAlpha()wird sie wegoptimiert und wir ändern einfach die Paint-Objekte, um das richtige Alpha anzuwenden. Dies geschieht, wenn View.hasOverlappingRendering()true zurückgegeben wird. ImageViewS und TextViews ohne zeichnbaren Hintergrund sind häufige Kandidaten dafür Optimierung. Wenn Sie sich in dieser Situation befinden, verwenden Sie setAlpha()so viel, wie Sie möchten. "
Sufian
1
@ Sufian Danke. Um jedoch sicherer zu sein, habe ich mich für jede Schaltfläche auf eine einfache StateListDrawable verlassen. Wie ich das gemacht habe, habe ich als neue Antwort gepostet. Ich habe Links eingefügt, in denen ich erfahren habe, dass Alpha schlecht für die Leistung ist.
Ali Kazi
Visuell benutzerunfreundlich
Farid
das deaktiviert tatsächlich visuell die Ansicht. danke @Siavash
Akash Bisariya
54

Die einfachste Lösung besteht darin, den Farbfilter auf das Hintergrundbild einer Schaltfläche einzustellen, wie ich hier gesehen habe

Sie können wie folgt vorgehen:

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

Hoffe ich habe jemandem geholfen ...

Woody
quelle
Dieser Ansatz gefällt mir am besten. Vielen Dank!
Nab
2
Dieser Ansatz hat Potenzial, aber die resultierende Farbe ist nicht immer so, wie Sie es sich vorstellen. Beispielsweise führt eine orangefarbene Schaltfläche mit der multiplizierten grauen Farbe zu einer dunkelroten Farbe - nicht zu einem verblassten Orange.
Jemand irgendwo
4
Vielleicht Mode.SRC_INsollte anstelle der Multiplikation verwendet werden. Siehe stackoverflow.com/a/17112876/550471
Jemand irgendwo
Dies funktioniert, aber zwei Farben, wenn gemischt, verwandeln sich in eine andere Farbe
Shamsul Arefin Sajib
Genial! so sauber.
Milind Chaudhary
21

Alle gegebenen Antworten funktionieren gut, aber ich erinnere mich, dass ich gelernt habe, dass die Verwendung von setAlpha in Bezug auf die Leistung eine schlechte Idee sein kann (weitere Informationen hier ). Das Erstellen einer StateListDrawable ist daher eine bessere Idee, um den deaktivierten Status von Schaltflächen zu verwalten. Hier ist wie:

Erstellen Sie eine XML-Datei btn_blue.xml im Ordner res / drawable:

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

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

Erstellen Sie einen Schaltflächenstil 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>

Wenden Sie dann diesen Stil auf Ihre Schaltfläche an:

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

Wenn Sie jetzt btnBlue.setEnabled(true)ODER aufrufen, btnBlue.setEnabled(false)wechseln die Statusfarben automatisch.

Ali Kazi
quelle
12

Setzen Sie Clickable auf false und ändern Sie die Hintergrundfarbe wie folgt:

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

Sie sollten eine XML-Datei für die deaktivierte Schaltfläche erstellen ( drawable / btn_disable.xml ).

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

Und erstellen Sie einen Selektor für die Schaltfläche ( 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>

Fügen Sie den Selektor zu Ihrer Schaltfläche hinzu

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>
Willy Chen
quelle
2
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);
Leon van Noord
quelle
13
Das beantwortet die Frage nicht.
Qualitätskatalysator
1

Ich habe diesen Code dafür verwendet:

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

Ich habe die oben genannten Lösungen ausprobiert, aber keine davon schien für mich zu funktionieren. Ich habe mich für folgende Option entschieden:

<!-- 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"
                .../>
André Ramon
quelle