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?
Verwenden Sie einen Selektor stackoverflow.com/questions/7335345/button-background-selector
– Buda Gawril
5. Januar 2012 um 13:19 Uhr
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
Adil Soomro
Sie müssen 3 oder 4 Zustände in Ihrem angeben btn_defaut.xml als Selektor.
Gepresster Zustand
Standardzustand
Fokuszustand
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
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
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:
Verwenden Sie einen Selektor stackoverflow.com/questions/7335345/button-background-selector
– Buda Gawril
5. Januar 2012 um 13:19 Uhr