6

我有一个状态列表绘制的,我想从状态列表绘制获取特定的绘制:获取从状态列表绘制特定绘制

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

我选择了正确的绘制状态每个键,有点像这样的:

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

现在的问题是如何为每个状态提取正确的drawable?我需要获取可绘制的9patch填充,因为如果状态在9patch上具有不同的填充,它将仅为顶部可绘制填充填充,并且我想为每个键手动设置填充(drawable.getPadding(rect)) 。

+0

你无法获取形成StateListDrawable的Drawables – pskink 2014-11-03 12:07:27

+0

我想我可以让他们使用属性ID从stateDrawable [0]你确定它不可能?:( – Tazz 2014-11-03 12:22:13

+0

你需要什么ID?我也不明白为什么你需要访问特定的Drawable ... – pskink 2014-11-03 12:48:14

回答

11

no public API从国家得到drawable。

有一些方法,但他们是@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 2014-11-03 12:55:01

+0

3年后,仍然像一个魅力 – 2017-03-14 00:47:29

+0

谢谢你,你是天才!如果可能,我可以给你100分这些答案 – 2017-06-14 09:16:55