Добавление цветового фильтра в Drawable изменяет все кнопки с использованием того же Drawable

У меня есть экран, на котором несколько кнопок используют один и тот же фон Drawable. У меня есть многократно используемый код, который я использую в разных проектах, чтобы добавить слушателя OnTouch, который добавляет серый цветной фильтр при нажатии кнопки. Обычно это нормально работает, но в этом случае ВСЕ кнопки окрашиваются, когда нажимается какая-либо из них.

Я вижу объяснение в http://developer.android.com/guide/topics/graphics/2d-graphics.html :

Примечание. Каждый уникальный ресурс в вашем проекте может поддерживать только одно состояние, независимо от того, сколько различных объектов вы можете создать для него. Например, если вы создаете экземпляр двух объектов Drawable из одного и того же ресурса изображения, тогда измените свойство (например, альфа) для одного из Drawables, тогда оно также повлияет на другое.

Предлагаемое решение – использовать TweenAnimation, который, похоже, не работает с цветными фильтрами.

Я также видел Android: Cloning drawable, чтобы сделать StateListDrawable с фильтрами, которые предлагают использовать drawable.getConstantState (). NewDrawable (). Кажется, это не имеет значения. Я предполагаю, что до тех пор, пока используется тот же файл физического изображения, на все Drawables будет влиять изменение на любой другой Drawable с использованием того же ресурса.

Какое решение существует, кроме создания второго фонового изображения для отображения нажатого состояния? Было бы неплохо иметь простое программное решение, которое я могу добавить к своему коду и использовать в каждом проекте.

Пример, который должен сработать для вас:

Drawable buttonBackground = context.getResources().getDrawable(R.drawable.bg); buttonBackground = buttonBackground.mutate(); //Set your filter here 
  • Загрузка большого файла в Android без ошибки outofmemory
  • Коммуникация между fragmentом и активностью - лучшие практики
  • Android Studio 2.0 - плагин слишком стар, обновите его до более новой версии или установите переменную окружения ANDROID_DAILY_OVERRIDE в
  • spannable на android для textView
  • Запрос данных от firebase
  • Доступ к переменной осуществляется внутри внутреннего classа. Нужно быть объявленным окончательным
  • Использование проекта библиотеки Android Деятельность в рамках другого проекта
  • Android - обновить контакт
  • Как автозапуск приложения для Android?
  • Android - обнаружит событие разблокировки телефона, а не экран
  • андроидный диалог прозрачный
  • Interesting Posts
    Давайте будем гением компьютера.