设置重复图标颜色的特定实例

Set specific instance of duplicated icon colour

在继续阅读之前,我知道要更改特定选项卡图标的颜色,我可以使用

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

关于如何具体执行此操作有很多重复的答案 - 但它们没有回答我的问题。

我有一个工具栏,其中一个人可能有两次 sam 图标(例如,他们有两个或更多他们可以查看的员工个人资料),问题是通过获取图标并设置颜色,它会更改颜色所有图标,而不是 selected 图标 - 大概是因为获取图标只是 select 通过 id 而不是特定实例

的图标

如果我 select 一个带有不同图标(例如更多)的选项卡,那么它们都会重置。

有没有办法在不创建新的可绘制图标的情况下仅针对图标的特定实例更改颜色?

从代码中看不出来,但图标下的位图是共享的。请参阅 `BitmapDrawable#mutate() 关于位图的共享。

A mutable BitmapDrawable still shares its Bitmap with any other Drawable that comes from the same resource.

但我们可以通过调用 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);
    }