如何在安卓中以编程方式设置滚动条的滑块?

13

我知道在XML中可以这样设置listview滚动条的滑块:Android:scrollbarThumbVertical 等等。

但是我正在Java代码中创建一个listview实例,可能需要设置不同的滚动条滑块。有没有一种方法可以通过编程的方式来设置滑块?

4个回答

26

您可以通过反射实现:

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
嗨,@Eng.Fouad 上面的解决方案在recyclerview中不起作用..即使是/listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style))/这一行也无法与listview或recyclerview一起使用。 - Mushtakim Ahmed Ansari
在API 29上触发错误:java.lang.NoSuchMethodException: android.widget.ScrollBarDrawable.setVerticalThumbDrawable [class android.graphics.drawable.Drawable] - Prof
对于API 29,我们可以直接调用setVerticalScrollbarThumbDrawable(drawable)。 - Randy Sugianto 'Yuku'

3
我修改了答案,将其完全以编程方式转换为方法。
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
我不知道答案,但经过一番搜索,我认为没有什么简单的方法可以实现这个功能,需要进行大量的麻烦操作。
这个xml属性实际上与View相关,而不是ListView。在Android View源代码中,似乎唯一设置垂直滑块图像的地方是'initializeScrollbars'方法。现在,这个方法不是私有的,所以我们可以扩展View的任何子类并覆盖此方法,但问题在于一个关键组件(ScrollabilityCache)需要设置拇指图像,它是私有的,没有任何getter方法。
因此,如果不重写很多代码,我认为没有简单的方法可以实现这个功能 - 抱歉!

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接