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>
Antworten:
Sie müssen 3 oder 4 Status in Ihrem
btn_defaut.xml
als Selektor angeben.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
quelle
android:state_disable="true"
, zeigt den Status, wenn die Schaltfläche deaktiviert ist, auf einfache und empfohlene Weise.android:state_disable="true"
, gibt es? Beziehen Sie sich aufandroid:state_enabled="false"
?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.
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.
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.
quelle
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, wennView.hasOverlappingRendering()
true zurückgegeben wird.ImageView
S undTextView
s ohne zeichnbaren Hintergrund sind häufige Kandidaten dafür Optimierung. Wenn Sie sich in dieser Situation befinden, verwenden SiesetAlpha()
so viel, wie Sie möchten. "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:
Hoffe ich habe jemandem geholfen ...
quelle
Mode.SRC_IN
sollte anstelle der Multiplikation verwendet werden. Siehe stackoverflow.com/a/17112876/550471Alle 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:
Erstellen Sie einen Schaltflächenstil in res / values / styles.xml
Wenden Sie dann diesen Stil auf Ihre Schaltfläche an:
Wenn Sie jetzt
btnBlue.setEnabled(true)
ODER aufrufen,btnBlue.setEnabled(false)
wechseln die Statusfarben automatisch.quelle
Setzen Sie Clickable auf false und ändern Sie die Hintergrundfarbe wie folgt:
quelle
Sie sollten eine XML-Datei für die deaktivierte Schaltfläche erstellen ( drawable / btn_disable.xml ).
Und erstellen Sie einen Selektor für die Schaltfläche ( drawable / btn_selector.xml )
Fügen Sie den Selektor zu Ihrer Schaltfläche hinzu
quelle
quelle
Ich habe diesen Code dafür verwendet:
quelle
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:
quelle