Wie kann ich eine Schaltfläche ausgrauen?

Lesezeit: 7 Minuten

Ich habe eine Schaltfläche wie unten gezeigt definiert. Wenn ich es deaktivieren möchte, verwende ich my_btn.setEnabled(false), aber ich würde es auch gerne 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>

  • Verwenden Sie einen Selektor stackoverflow.com/questions/7335345/button-background-selector

    – Buda Gawril

    5. Januar 2012 um 13:19 Uhr

Benutzer-Avatar
Siavasch

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

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

aktualisieren: Ich habe die obige Lösung vor Kotlin geschrieben und als ich ein Anfänger war. Es ist eher eine “Quick’n’dirty”-Lösung, die ich aber im professionellen Umfeld nicht empfehle.

Wenn ich heute eine generische Lösung haben 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 nur die Ansicht als Variable übergeben. Es ist nicht so sauber, aber es funktioniert.

  • Ich hatte gelesen, dass Aufrufe von setAlpha CPU-intensiv sind. Kann jemand bestätigen?

    – Ali Kasi

    15. Juni 2016 um 7:37 Uhr

  • @AliKazi es hängt von der Art Ihres ab View. Aus diesen Google+ Beitrag: “Wenn Ihre Ansicht keine überlappenden Zeichenbefehle enthält, setAlpha() wird wegoptimiert und wir ändern einfach die Paint-Objekte, um das richtige Alpha anzuwenden. Das passiert wann View.hasOverlappingRendering() gibt wahr zurück. ImageViews und TextViews ohne darstellbaren Hintergrund sind häufige Kandidaten für diese Optimierung. Wenn Sie sich in dieser Situation befinden, verwenden Sie setAlpha() so viel du willst.”.

    – Sufian

    24. Juni 2016 um 9:43 Uhr


  • @Sufian Danke. Aber um auf der sicheren Seite zu sein, habe ich mich auf ein einfaches StateListDrawable für jede Schaltfläche verlassen. Wie ich das gemacht habe, habe ich als neue Antwort gepostet. Ich habe Links eingefügt, wo ich gelernt habe, dass Alpha schlecht für die Leistung ist.

    – Ali Kasi

    27. Juni 2016 um 1:27 Uhr

  • Optisch benutzerunfreundlich

    – Farid

    24. August 2018 um 14:31 Uhr

  • die die Sicht tatsächlich visuell deaktivieren. Danke @Siavash

    – Akash Bisariya

    31. Januar 2019 um 10:18 Uhr

Benutzer-Avatar
Adil Soomro

Sie müssen 3 oder 4 Zustände in Ihrem angeben btn_defaut.xml als Selektor.

  1. Gepresster Zustand
  2. Standardzustand
  3. Fokuszustand
  4. Aktivierter Zustand (Deaktivierter Zustand mit falscher Anzeige; siehe Kommentare)

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

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

  • Um es auszugrauen, muss ich also die Farbe des Hintergrunds UND die Farbe des Textes im deaktivierten Zustand ändern? Es gibt keine Möglichkeit, einfach einen transparenten Vordergrund hinzuzufügen?

    – Juli

    5. Januar 2012 um 13:22 Uhr


  • Ja! wofür du sorgen wirst android:state_disable="true" Es zeigt den Zustand an, wenn der Button deaktiviert ist, der einfache und empfohlene Weg.

    – Adil Soomro

    5. Januar 2012 um 13:25 Uhr


  • und wo kann ich die Textfarbe für den deaktivierten Zustand angeben? Es scheint, dass nur ein Hintergrund angegeben werden kann … Ich habe dafür eine neue Frage gestellt: stackoverflow.com/questions/8743584/…

    – Juli

    5. Januar 2012 um 13:49 Uhr

  • Es gibt kein android:state_disable="true", Gibt es? Beziehst du dich auf android:state_enabled="false"?

    – kräh

    12. Juli 2013 um 16:08 Uhr

  • @MarcoW.: ja du hast vollkommen recht. Entschuldigung für das falsche Attribut.

    – Adil Soomro

    15. Juli 2013 um 5:34 Uhr

Benutzer-Avatar
Holzig

Die einfachste Lösung besteht darin, einen Farbfilter auf das Hintergrundbild einer Schaltfläche zu setzen, 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…

  • Diese Vorgehensweise gefällt mir am besten. Vielen Dank!

    – edhnb

    6. Januar 2014 um 1:12 Uhr

  • Dieser Ansatz hat Potenzial, aber die resultierende Farbe ist nicht immer so, wie Sie es sich vorstellen. Beispielsweise ergibt eine orangefarbene Schaltfläche mit der Farbe Grau multipliziert eine dunkelrote Farbe – kein verblasstes Orange.

    – Irgendwer irgendwo

    11. März 2015 um 21:52 Uhr

  • kann sein Mode.SRC_IN sollte anstelle von Multiply verwendet werden. Siehe stackoverflow.com/a/17112876/550471

    – Irgendwer irgendwo

    11. März 2015 um 22:36 Uhr

  • Das funktioniert, aber zwei Farben werden beim Mischen zu einer anderen Farbe

    – Schamsul Arefin

    17. April 2018 um 7:08 Uhr

  • Genial! so sauber.

    – Milind Chaudhary

    14. November 2019 um 6:30 Uhr

Benutzer-Avatar
Ali Kasi

Alle gegebenen Antworten funktionieren gut, aber ich erinnere mich, dass ich gelernt habe, dass die Verwendung von setAlpha a sein kann schlechte Idee leistungsmäßig (mehr info hier). Erstellen Sie also eine StateListDrawable ist eine bessere Idee, um den deaktivierten Status von Schaltflächen zu verwalten. Hier ist wie:

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Disable background -->
    <item android:state_enabled="false"
          android:color="@color/md_blue_200"/>
    
    <!-- Enabled background -->
    <item android:color="@color/md_blue_500"/>
</selector>

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

Jetzt, wenn Sie anrufen btnBlue.setEnabled(true) ODER btnBlue.setEnabled(false) Die Zustandsfarben wechseln automatisch.

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>

Benutzer-Avatar
Satt

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

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

Benutzer-Avatar
Andre Ramón

Ich habe die oben genannten Lösungen ausprobiert, aber keine davon schien für mich zu funktionieren. Ich ging mit der folgenden Option:

<!-- 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"
                .../>

1334360cookie-checkWie kann ich eine Schaltfläche ausgrauen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy