在 Oreo 上,SeekBar 拇指上的 setColorFilter() 会更改所有拇指

On Oreo, setColorFilter() on a SeekBar thumb changes all thumbs

我有一个classpublic class LevelSeekBar extends AppCompatSeekBar。在那个 class 中,我有这个方法:

@Override
public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);
    int color = getResources().getColor(getColorForState(enabled));
    getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}

此 LevelSeekBar 在自定义列表中使用,使用 RecyclerView 实现。刷新时,每个 LevelSeekBar.setEnabled() 一个接一个地被调用。

在 < Android 8.0 (Oreo) 的设备上,这完全符合预期。

但是,在 Android 8.0 中,所有 的缩略图都是根据列表中最后设置的颜色设置的。换句话说,假设我有一个包含 2 个项目的列表——第一个是 'disabled',第二个是 'enabled'——两个项目都将显示为已启用。

我已经在调试器中确认 'enabled' 变量和返回的相应颜色是正确的并且符合预期,并且我已经确认在这种情况下正在刷新完整的 recyclerview。

似乎是奥利奥的问题。有没有其他人看到过这个,或者对如何解决有任何想法?

您需要在 getThumb() 返回的 Drawable 上调用 .mutate()

https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()