8

Ich verwende setColorFilter, um den Farbfilter von einem meiner Taste zu setzen. Dies funktioniert bis zum Android 5.0 Lollipop Update perfekt. Jetzt scheint der Farbfilter auf meine anderen Schaltflächen zu treffen, selbst wenn ich die Aktivität schließe und erneut öffne (sie wird zurückgesetzt, wenn ich die App schließe und erneut öffne).Android 5.0 Lollipop: setColorFilter "leckt" auf andere Tasten

Mein styles.xml (v21): (wie bei älteren außer hier ihre Mutter ist Material, bevor es Holo war)

<style name="Theme.FullScreen" parent="@android:style/Theme.Material.Light.NoActionBar.Fullscreen"> 
    <item name="android:buttonStyle">@style/StandardButton</item> 
    <item name="android:windowTranslucentStatus">true</item> 
</style> 

Mein styles.xml (für alle Versionen):

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

My Button:

<Button 
    android:id="@+id/mainMenuButton"    
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="mainMenu" 
    android:text="@string/button_mainMenu" 
    android:visibility="gone" /> 

Mein Code:

Button mainMenuButton = (Button) findViewById(R.id.mainMenuButton); 
mainMenuButton.getBackground().setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY)); 
mainMenuButton.setVisibility(View.VISIBLE); 

Die Farbe:

<color name="light_green">#5CD65C</color> 

Das Ergebnis:

ich die App öffnen, dann die Spielaktivität und alle Tasten sind korrekt angezeigt werden. Ich drücke den Knopf, um den Farbfilter einzustellen, gehe zurück zum Hauptmenü und öffne die Spielaktivität und nun sind alle Knöpfe grün.

Irgendwelche Ideen?

Antwort

1

hier OP. Vielen Dank für Ihre Vorschläge. Mit dem folgenden Code wurde das Problem behoben.

Einstellung der Filter

Drawable background = getResources().getDrawable(android.R.drawable.btn_default); 
background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY)); 
mainMenuButton.setBackground(background); // Use setBackgroundDrawable for API<16 
mainMenuButton.setVisibility(View.VISIBLE); 

Die anderen Tasten werden nicht grün.

den Filter löschen

Was als nächstes passierte, war, dass es schien, dass Android (teilweise) meinen Anruf ignoriert den Farbfilter zu löschen (die später im Code passiert). „Teilweise“, weil es grün war, aber als ich ihn gedrückt, es wurde gelb (das btn_default Verhalten ist wie mit dem Filter bis dunkelgrün gegen). Um dies zu beheben, musste ich meine Funktion aufrufen, um die folgende ändern:

mainMenuButton.setVisibility(View.VISIBLE) 
mainMenuButton.getBackground().clearColorFilter(); 
mainMenuButton.invalidate(); 

HINWEIS: Dieses inversed jedoch das Verhalten der Taste. Wenn ich auf die Taste drücke (und halte), scheint es immer noch das grüne Farbfilterverhalten zu haben und wird dunkelgrün. Wenn ich es loslasse, wird es gemäß btn_default wieder grau. Irgendwelche Vorschläge dazu?

Ich hoffe, dass dies zumindest jemand anderen mit diesem seltsamen Problem hilft, das für mich nur auf Android 5.0 Lollipop API Level 21 aufgetreten ist. (Ich habe API 8, 9, 12, 13, 16, 17, 18 und getestet 19, wo dieses Problem nicht auftreten. auch scheint es nicht ART mit seiner AOT Kompilation zu sein, wie ich erwartet hatte, da ART auf einem Android-4.4.4-Gerät ermöglicht, hat dieses Problem nicht verursachen.) Merkwürdigerweise weise~~POS=HEADCOMP mutate() auch nicht funktioniert, wie ich es erwartet hätte.

1

Die Instanz des Zeichenelements wird über alle Ihre Schaltflächen verteilt. Wenn Sie also einen Farbfilter festlegen, werden alle geändert (Sie sehen die Änderungen nicht sofort, da die Schaltflächen nicht sofort ungültig werden).

Versuchen Sie, den Zeichensatz manuell zu laden (BitmapFactory.decodeResource(getResources(), android.R.drawable.btn_default, null)) und legen Sie ihn als Hintergrund für die Schaltfläche fest.

19

Das Problem ist, dass der Hintergrund Drawable über viele Ansichten wiederverwendet wird. Um sicherzustellen, dass die Drawable nicht für mehrere Ansichten verwendet wird, sollten Sie die Methode mutate verwenden.

Siehe: mutate()

Beispielcode:

Drawable background = mainMenuButton.getBackground(); 
background.mutate(); 
background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY)); 
mainMenuButton.setBackground(background); 
+0

Wenn ich Ihre Antwort, die ich vor Freude sprang lesen, da es so einfach und intuitiv schien (ich hatte nie 'vor dem' mutieren() zu hören). Ich eilte zu meinem Projekt und implementierte Ihre Lösung und leider funktioniert es nicht. Alle meine Tasten werden immer noch grün. Ich habe sogar versucht: 'background = background.mutate();' und dann die Filter auf das, aber die Tasten noch grün. Ich weiß nicht, was anderes zu versuchen (außer zu nennen 'Clear()' auf allen anderen Tasten, die funktionieren, aber sind wirklich Code-hässlich). – Johis

Verwandte Themen