2012-03-15 15 views
11

sé vista de lista puede establecer barra de desplazamiento en XML como esto Android:scrollbarThumbVertical etc.¿Cómo establecer scrollbar thumb programmatically en Android?

pero yo soy la creación de una instancia de vista de lista en el código Java y tal vez tienen que establecer diferentes barra de desplazamiento. ¿Hay algún método que pueda establecer la barra de desplazamiento pulgar programáticamente?

Respuesta

2

No sabía la respuesta a esto, pero después de investigar un poco, no creo que sea posible sin un montón de problemas.

Este atributo xml es en realidad asociada con un View, no un ListView - En el código fuente de Android Ver, parece que el único lugar que está marcando el dibujable pulgar vertical es el método 'initializeScrollbars'. Ahora, este método no es privado, por lo que podemos extender cualquier elemento secundario de View e invalidar este método, pero el problema es que un componente crucial necesario para establecer el thumb drawable, ScrollabilityCache, es privado sin ningún método getter.

Así que sin reescribir gran parte del código, no creo que haya una manera fácil de hacerlo, lo siento.

+0

Gracias por su investigación :) – dreamtale

21

Puede lograr que a través de la reflexión:

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(); 
} 

El código anterior se ejecuta como:

listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style)); 
+5

Esta debería ser la respuesta aceptada. – Dogcat

+1

Hola, la solución de @ Eng.Fouad arriba no funciona en recyclerview..incluso /*listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style))*/ esta línea no funciona con listview o recyclerview. –

1

he modificado la respuesta para que sea un método 100% mediante programación

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(); 
    } 

}

Cuestiones relacionadas