Как программно установить полосу прокрутки в Android? - PullRequest
12 голосов
/ 15 марта 2012

Я знаю, что listview может установить большой палец на полосе прокрутки в XML следующим образом Android:scrollbarThumbVertical и т. Д.

Но я создаю экземпляр списка в java-коде, и мне, возможно, нужно установить другой большой палец на полосе прокрутки.Есть ли способ установить прокрутку большого пальца программно?

Ответы [ 3 ]

24 голосов
/ 06 ноября 2013

Вы можете достичь этого с помощью отражения:

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));
3 голосов
/ 13 февраля 2015

Я изменил ответ, чтобы сделать его методом на 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 голосов
/ 08 мая 2012

Я не знал ответа на этот вопрос, но после небольшого количества копаний я не думаю, что это возможно без хлопот.

Этот атрибут xml на самом деле связан с View, а не ListView - В исходном коде Android View кажется, что единственное место, в котором он устанавливает рисование по вертикали большим пальцем, - это метод 'initializeScrollbars' .Теперь этот метод не является частным, поэтому мы можем расширить любой дочерний элемент View и переопределить этот метод, но проблема в том, что критически важный компонент, необходимый для установки рисованного большого пальца, ScrollabilityCache, является закрытым без каких-либо методов получения.1008 * Так что без переписывания большого количества кода я не думаю, что есть какой-то простой способ сделать это - извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...