【发布时间】:2022-02-20 05:22:27
【问题描述】:
我知道 listview 可以像这样Android:scrollbarThumbVertical 等在 XML 中设置滚动条缩略图。
但我在 java 代码中创建了一个 listview 实例,我可能需要设置不同的滚动条拇指。有没有一种方法可以通过编程设置滚动条拇指?
【问题讨论】:
我知道 listview 可以像这样Android:scrollbarThumbVertical 等在 XML 中设置滚动条缩略图。
但我在 java 代码中创建了一个 listview 实例,我可能需要设置不同的滚动条拇指。有没有一种方法可以通过编程设置滚动条拇指?
【问题讨论】:
您可以通过反射来实现:
try
{
Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
mScrollCacheField.setAccessible(true);
Object mScrollCache = mScrollCacheField.get(listview);
Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar");
scrollBarField.setAccessible(true);
Object scrollBar = scrollBarField.get(mScrollCache);
Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class);
method.setAccessible(true);
method.invoke(scrollBar, getResources().getDrawable(R.drawable.scrollbar_style));
}
catch(Exception e)
{
e.printStackTrace();
}
以上代码执行为:
listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style));
【讨论】:
java.lang.NoSuchMethodException: android.widget.ScrollBarDrawable.setVerticalThumbDrawable [class android.graphics.drawable.Drawable]
我修改了答案,使其成为 100% 以编程方式实现的方法
public static void ChangeColorScrollBar(View Scroll, int Color, Context cxt){
try
{
Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
mScrollCacheField.setAccessible(true);
Object mScrollCache = mScrollCacheField.get(Scroll);
Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar");
scrollBarField.setAccessible(true);
Object scrollBar = scrollBarField.get(mScrollCache);
Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class);
method.setAccessible(true);
Drawable[] layers = new Drawable[1];
ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
sd1.getPaint().setColor(cxt.getResources().getColor(Color));
sd1.setIntrinsicWidth(Math.round(cxt.getResources().getDimension(R.dimen.dp_3)));
layers[0] = sd1;
method.invoke(scrollBar, layers);
}
catch(Exception e)
{
e.printStackTrace();
}
}
【讨论】:
我不知道这个问题的答案,但经过一番挖掘后,我认为这不可能没有很多麻烦。
这个 xml 属性实际上与 View 相关联,而不是 ListView - 在 Android View 源代码中,设置垂直拇指可绘制对象的唯一位置似乎是 'initializeScrollbars' 方法。现在这个方法不是私有的,所以我们可以扩展 View 的任何子节点并覆盖这个方法,但问题是设置拇指可绘制对象所需的关键组件 ScrollabilityCache 是私有的,没有任何 getter 方法。
因此,如果不重写大量代码,我认为没有任何简单的方法可以做到这一点 - 抱歉!
【讨论】:
从 Android Q(API 级别 29)开始,您可以使用setVerticalScrollbarThumbDrawable() & setHorizontalScrollbarThumbDrawable():
scrollView.verticalScrollbarThumbDrawable =
ResourcesCompat.getDrawable(resources,
R.drawable.scrollview_thumb, null)
【讨论】: