6

У меня есть список состояний вытяжки, и я хочу, чтобы получить конкретную вытяжку из государственного списка 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> 

Я выбираю правильный Drawable состояния для каждого ключа, что-то вроде это:

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

Теперь состояния определяются следующим образом:

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

Теперь мой вопрос как извлечь правильное значение для каждого состояния? Мне нужно получить 9patch padding для drawable, потому что если у государства есть различное дополнение на 9patch, оно получит дополнение только для верхнего drawable, и я хочу настроить заполнение вручную для каждой клавиши (drawable.getPadding (rect)), ,

+0

вас не может получить Drawables, которые формируют StateListDrawable – pskink

+0

я думал, что могу получить их с помощью идентификатора атрибута из stateDrawable [0] u уверен, что это невозможно? :( – Tazz

+0

для чего нужен идентификатор? также я не понимаю, зачем вам нужен конкретный Drawable ... – pskink

ответ

11

Существует no public API, чтобы получить возможность вывести из состояния.

Есть некоторые методы в StateListDrawable но они @hide с комментарием «до API совета».

Вы можете вызвать их отражением ... но это на свой страх и риск !!!. (Это может измениться в будущих версиях)

Эти методы являются:

Вот как продолжить (исключения опущены):

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

работает как шарм. Я буду держать это под наблюдением, чтобы увидеть, изменится ли это в будущем. – Tazz

+0

3 года спустя все еще работает как шарм –

+0

Спасибо, человек, ты гений! Я могу дать вам 100 баллов за этот ответ, если возможно –