6

Mam listę stan rozciągliwej, i chcę, aby uzyskać konkretny rozciągliwej z listy stan rozciągliwej:Szczegółowe rozciągliwej z listy państwowej rozciągliwej

<?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> 

mam wybrać prawidłowy stan rozciągliwej dla każdego klawisza, coś podobnego to:

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

teraz stany są zdefiniowane następująco:

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

teraz moje pytanie brzmi: jak wyodrębnić poprawne losowanie dla każdego stanu? Muszę uzyskać dopełnienie 9-strunowe w losowaniu, ponieważ jeśli stan ma inne wypełnienie na 9-pozycyjnym, otrzyma dopełnienie tylko dla górnego losowania, a ja chcę ręcznie ustawić dopełnienie dla każdego klawisza (drawable.getPadding (rect)) .

+0

cię nie można uzyskać rysunków, które tworzą StateListDrawable – pskink

+0

Myślałem, że mogę uzyskać je przy użyciu identyfikatora atrybutu z stateDrawable [0] na pewno nie jest możliwe? :( – Tazz

+0

do czego potrzebujesz id? również nie rozumiem, dlaczego potrzebujesz dostępu do danego Drawable ... – pskink

Odpowiedz

11

Istnieje no public API, aby pobrać wyciąg z państwa.

Istnieją pewne metody StateListDrawable ale są @hide z komentarzem „pending” API rady.

Możesz przywoływać je przez odbicie ... ale to jest na własne ryzyko !!!. (Może ulec zmianie w przyszłych wydaniach)

Metody te są następujące:

Oto jak postępować (wyjątki pominięta):

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

działa jak na razie urok. Zatrzymam to pod nadzorem, aby sprawdzić, czy to się zmieni w przyszłości. – Tazz

+0

3 lata później wciąż działa jak wdzięk –

+0

Dzięki człowieku jesteś geniuszem !! Mogę dać ci 100 punktów za te odpowiedzi, jeśli to możliwe –

Powiązane problemy