Установить конкретный экземпляр дублированного цвета значка - PullRequest
0 голосов
/ 10 января 2019

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

tabLayout.getTabAt(i).getIcon().setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.colorInactive), android.graphics.PorterDuff.Mode.MULTIPLY);

и есть много повторяющихся ответов о том, как конкретно это сделать, но они не отвечают на мою проблему.

У меня есть панель инструментов, на которой у человека может быть значок sam дважды (например, у него есть два или более профилей сотрудников, которые он может просматривать), проблема в том, что, получая значок и устанавливая цвет, он меняет цвет для всех значки, а не выбранный значок - вероятно, потому что значок get просто выбирает значок по идентификатору, а не конкретному экземпляру

enter image description here

Если я выберу вкладку с другим значком (например, больше), то они обе будут сброшены.

Есть ли способ нацеливаться только на конкретный экземпляр значка при изменении цвета без создания нового нарисованного значка?

1 Ответ

0 голосов
/ 10 января 2019

Это не видно из кода, но растровые изображения, лежащие в основе значков, являются общими. См. `BitmapDrawable # mutate () о совместном использовании растровых изображений.

Изменяемый BitmapDrawable по-прежнему делится своим Bitmap с любым другим Drawable, полученным из того же ресурса.

Но мы сможем выделить цвет значка, позвонив на него mutate().

Вот краткий метод, показывающий, как отделить одну иконку от двух других, использующих один и тот же нарисованный ресурс:

    private void setupTabIcons() {
        int sharedIcon = R.drawable.ic_tab_favourite;

        Drawable inactiveIcon = getResources().getDrawable(sharedIcon);

        // Separate out the first icon so changes don't propagate to other icons.
        inactiveIcon.mutate();
        inactiveIcon.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.colorInactive),
                                    android.graphics.PorterDuff.Mode.MULTIPLY);
        // We could also do the following for Lollipop+:
//         inactiveIcon.setTint(getResources().getColor(R.color.colorInactive));
        tabLayout.getTabAt(0).setIcon(inactiveIcon);
        tabLayout.getTabAt(1).setIcon(sharedIcon);
        tabLayout.getTabAt(2).setIcon(sharedIcon);
    }

enter image description here

...