6

Ho una lista di stato disegnabile, e voglio ottenere un drawable specifica dall'elenco Stato drawable:Ottenere drawable specifico dalla lista stato drawable

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:kplus="http://schemas.android.com/apk/res-auto"> 


    <item kplus:key_type_space_alt="true" android:state_pressed="true" android:drawable="@drawable/space_1_pressed" /> 
    <item kplus:key_type_space_alt="true" android:drawable="@drawable/space_1_normal" /> 

    <!-- TopNav keys. --> 

    <item kplus:key_type_topnav="true" android:state_pressed="true" android:drawable="@drawable/tab_down" /> 
    <item kplus:key_type_topnav="true" android:state_selected="true" android:drawable="@drawable/tab_down" /> 
    <item kplus:key_type_topnav="true" android:drawable="@drawable/tab_normal" /> 

    <!-- TopRow keys. --> 

    <item kplus:key_type_toprow="true" android:state_pressed="true" android:drawable="@drawable/numeric_presseed" /> 
    <item kplus:key_type_toprow="true" android:drawable="@drawable/numeric_normal" /> 
</selector> 

seleziono lo stato drawable corretto per ogni tasto, qualcosa di simile questo:

if (keyIsNumbers) { 
    if (KPlusInputMethodService.sNumbersState == 2) { 
     drawableState = mDrawableStatesProvider.KEY_STATE_TOPNAV_CHECKED; 
    } 
} 

Ora gli stati sono definiti in questo modo:

KEY_STATE_TOPNAV_NORMAL = new int[] {keyTypeTopNavAttrId}; 
KEY_STATE_TOPNAV_PRESSED = new int[] {keyTypeTopNavAttrId, android.R.attr.state_pressed}; 
KEY_STATE_TOPNAV_CHECKED = new int[] {keyTypeTopNavAttrId, android.R.attr.state_selected}; 

Ora la mia domanda è come estrarre il drawable corretto per ogni stato? Ho bisogno di ottenere il padding 9patch del drawable, perché se lo stato ha padding diverso su 9patch otterrà il padding solo per il drawable superiore, e voglio impostare il padding manualmente per ogni chiave (drawable.getPadding (rect)) .

+0

voi impossibile ottenere i Drawables che formano StateListDrawable – pskink

+0

Stavo pensando che potrei ottenerli usando l'attributo id da StateDrawable [0] sei sicuro che non sia possibile? :( – Tazz

+0

per cosa hai bisogno di id? anche io non capisco perché hai bisogno di accedere al particolare Drawable ... – pskink

risposta

11

C'è no public API per ottenere il drawable dallo stato.

ci sono alcuni metodi in StateListDrawable ma sono @hide con il commento "in attesa del consiglio API".

È possibile richiamarli per riflessione ... ma è a proprio rischio !!!. (Potrebbe cambiare nelle versioni future)

Tali metodi sono:

Ecco come procedere (eccezioni omesso):

int[] currentState = view.getDrawableState(); 
StateListDrawable stateListDrawable = (StateListDrawable)view.getBackground(); 
Method getStateDrawableIndex = StateListDrawable.class.getMethod("getStateDrawableIndex", int[].class); 
Method getStateDrawable = StateListDrawable.class.getMethod("getStateDrawable", int.class); 
int index = (int) getStateDrawableIndex.invoke(stateListDrawable,currentState); 
Drawable drawable = (Drawable) getStateDrawable.invoke(stateListDrawable,index); 
+0

funziona come un fascino per ora. Terrò questo sotto controllo per vedere se cambierà in futuro. – Tazz

+0

3 anni dopo funziona ancora come un fascino –

+0

Grazie amico che sei un genio !! Posso darti 100 punti per queste risposte, se possibile –