Android 5.0 Lollipop: setColorFilter «утечки» на другие кнопки

Я использую setColorFilter для установки цветового фильтра ONE из моей кнопки. Это прекрасно работает до обновления Android 5.0 Lollipop. Теперь цветной фильтр, кажется, течет на мои другие кнопки, даже когда я закрываю активность и снова открываю (он сбрасывается, если я закрываю приложение и снова открываю).

Мои styles.xml (v21): (так же, как и старше, кроме этого, его родителем является Material, прежде чем он был Holo)

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

Мои styles.xml (для всех версий):

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

Моя кнопка:

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

Мой код:

 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); 

Цвет:

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

Результат:

Я открываю приложение, затем игровая активность и все кнопки отображаются правильно. Я нажимаю кнопку, чтобы установить цветной фильтр, вернитесь в главное меню и снова запустите игру, и теперь все кнопки зеленые.

Есть идеи?

Solutions Collecting From Web of "Android 5.0 Lollipop: setColorFilter «утечки» на другие кнопки"

Проблема в том, что фоновый Drawable повторно используется во многих представлениях. Чтобы гарантировать, что Drawable не используется совместно несколькими представлениями, вы должны использовать метод mutate .

См .: mutate ()

Пример кода:

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

Здесь. Спасибо вам за ваши предложения. С помощью следующего кода исправлена ​​проблема.

Настройка фильтра

 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); 

Другие кнопки не стали зелеными.

Очистка фильтра

Что произошло дальше, было похоже, что Android (частично) проигнорировал мой звонок, чтобы очистить цветной фильтр (что происходит позже в коде). «Частично», потому что он был зеленым, но когда я его нажал, он стал желтым (это поведение btn_default, а не темно-зеленое с фильтром). Чтобы исправить это, мне пришлось изменить порядок вызова функций следующим образом:

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

ПРИМЕЧАНИЕ. Это, однако, изменило поведение кнопки. Когда я нажимаю (и удерживаю) на кнопке, у нее все еще есть поведение зеленого цвета фильтра и становится темно-зеленым. Когда я отпускаю его, он становится серым, как btn_default. Любые предложения по этому поводу?

Надеюсь, это по крайней мере каким-то образом поможет кому-то еще с этой странной проблемой, которая для меня произошла только на уровне API Lollipop API версии 5.0 для Android 5.0 (я тестировал API 8, 9, 12, 13, 16, 17, 18 и 19, где эта проблема Так как это не похоже на ART с его компиляцией AOT, как я ожидал, поскольку включение ART на устройстве Android 4.4.4 не вызывало этой проблемы.) Странно, mutate() тоже не работает, поскольку я Как и ожидалось.

Экземпляр drawable распространяется по всем вашим кнопкам, поэтому настройка colorfilter меняет их все (вы не видите изменения немедленно, потому что кнопки не являются недействительными немедленно).

Попробуйте загрузить чертеж вручную ( BitmapFactory.decodeResource(getResources(), android.R.drawable.btn_default, null) ), а затем установите его как фон кнопки.