我知道listview可以像这样Android:scrollbarThumbVertical
等在XML中设置滚动条缩略图。
但是我在java代码中创建了一个listview实例,我可能需要设置不同的滚动条拇指。有没有一种方法可以通过编程方式设置滚动条?
答案 0 :(得分:23)
你可以通过反思实现这一点:
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));
答案 1 :(得分:3)
我修改了答案,使其成为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();
}
}
答案 2 :(得分:2)
我不知道这个问题的答案,但经过一番挖掘之后,我认为没有麻烦就不可能。
此xml属性实际上与View
相关联,而不是ListView
- 在Android视图源代码中,似乎唯一可以设置垂直缩略图的地方是{{ 3}}方法。现在这个方法不是私有的,所以我们可以扩展View的任何子项并覆盖这个方法,但问题是设置thumb drawable所需的关键组件ScrollabilityCache是私有的,没有任何getter方法。
因此,如果不重写很多代码,我认为没有任何简单的方法可以做到这一点 - 对不起!