2012-03-15 8 views

risposta

2

Non sapevo la risposta a questo, ma dopo un po 'di scavo non penso sia possibile senza un carico di seccature.

Questo attributo XML viene effettivamente associato ad un View, non un ListView - Nel codice View source Android, sembra che l'unico posto che sta impostando il drawable pollice verticale è il metodo 'initializeScrollbars'. Ora questo metodo non è privato, quindi possiamo estendere qualsiasi figlio di View e sovrascrivere questo metodo, ma il problema è che un componente cruciale necessario per impostare il drawable del pollice, lo ScrollabilityCache, è privato senza alcun metodo getter.

Quindi, senza riscrivere gran parte del codice, non penso che ci sia un modo semplice per farlo - scusa!

+0

Grazie per il vostro indagine :) – dreamtale

21

È possibile ottenere che attraverso la riflessione:

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

Il codice di cui sopra viene eseguito come:

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

Questa dovrebbe essere la risposta accettata. – Dogcat

+1

Salve, @ Eng.Fouad sopra la soluzione non funziona in recyclerview..even /*listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style))*/ questa riga non funziona con listview o recyclerview. –

1

Ho modificato la risposta per rendere un metodo al 100% a livello di codice

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

}