如何在Android中以编程方式设置scrollbar thumb?

时间:2012-03-15 04:16:26

标签: android scrollbar

我知道listview可以像这样Android:scrollbarThumbVertical等在XML中设置滚动条缩略图。

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

3 个答案:

答案 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方法。

因此,如果不重写很多代码,我认为没有任何简单的方法可以做到这一点 - 对不起!

相关问题