在 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()
我有一个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()