6

Bir devlet liste çizilebilir var ve ben devlet liste çekilebilir belirli bir çekilebilir almak istiyorum: Ben, her anahtar için böyle bir şey doğru çekilebilir durumunu seçmekçekilebilir devlet listesinden belirli çekilebilir alın

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

Bu:

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

Şimdi devletler böyle tanımlanmıştır:

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

Şimdi benim sorum Her devlet için doğru çizilebilir nasıl çıkarılır? Ben devlet sadece üst çekilebilir için dolgu alacak 9patch farklı dolgu varsa, çünkü çekilebilir ait 9patch dolguyu almak gerekiyor ve ben her anahtar için elle dolgu ayarlamak istediğiniz (drawable.getPadding (rect)) .

+0

seni StateListDrawable – pskink

+0

formunu oluşturan Drawables alamıyor i stateDrawable dan [0] u emin onun değil mümkün? :( – Tazz

+0

ne için kimliği gerekiyor nitelik kimliği kullanarak bunları alabilir düşünüyordum? Ayrıca ben i ben75 çözüm kullanarak çözüldü özellikle çekilebilir ... – pskink

cevap

11

durumundan çekilebilir almak için no public API yoktur.

StateListDrawable bazı yöntemler vardır ancak bunlar "API konseyi bekleyen" comment ile @hide bulunmaktadır.

Sen yansıması onları çağırabilir ... ama kendi sorumluluğunuzdadır var !!!.

nasıl devam etmek (istisnalar atlanmıştır) olduğu:

olanlar yöntemlerdir (gelecekteki sürümlerde değişebilir)

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

şimdilik bir çekicilik gibi çalışır. Gelecekte değişip değişmeyeceğini görmek için bunu gözetim altında tutacağım. – Tazz

+0

3 yıl sonra hala –

+0

teşekkürler deha olan adam bir cazibe gibi çalışır !! Mümkünse bu cevap için size 100 puan verebilirim –