SORU
2 Aralık 2010, PERŞEMBE


Özel bir düğme Ekle durumu nasıl Android:

Örneğin, varsayılan düğme devletler ve arka plan görüntüleri arasında aşağıdaki bağımlılıkları vardır:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_window_focused="false" android:state_enabled="false"
        android:drawable="@drawable/btn_default_normal_disable" />
    <item android:state_pressed="true" 
        android:drawable="@drawable/btn_default_pressed" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/btn_default_selected" />
    <item android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_focused="true"
        android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item
        android:drawable="@drawable/btn_default_normal_disable" />
</selector>

Nasıl kendi özel durumu (android:state_custom gibi bir şey anımsatıyor) tanımlamak, o zaman dinamik olarak kullanabileceğimi benim düğme görünümünü değiştirebilir miyim?

CEVAP
27 NİSAN 2011, ÇARŞAMBA


Çözümünü tarafından @(Ted Hopp) çalışır, ama küçük bir düzeltme: seçici, maddenin Birleşik Devletleri gereken bir "uygulama:" öneki, aksi takdirde inflater olmaz tanımak ad düzgün ve sessizce başarısız olur; en azından bu bana ne oluyor.

Beni burada tam çözümü biraz daha detaylı rapor izin verin

İlk olarak,"": . res/values/attrs.xml dosyası oluştur

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="food">
        <attr name="state_fried" format="boolean" />
        <attr name="state_baked" format="boolean" />
    </declare-styleable>
</resources>

O zaman kendi özel bir sınıf tanımlayın. Örneğin, bir sınıf olabilir"", türetilmiş sınıf,"". Düğmesi FoodButton Bir kurucu uygulamak; bir inflater tarafından kullanılacak gibi görünüyor ki bu, uygulamak gerekir:

public FoodButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

Türetilmiş sınıf: üstünde

private static final int[] STATE_FRIED = {R.attr.state_fried};
private static final int[] STATE_BAKED = {R.attr.state_baked};

Ayrıca, durum değişkenleri:

private boolean mIsFried = false;
private boolean mIsBaked = false;

Ve belirleyiciler birkaç:

public void setFried(boolean isFried) {mIsFried = isFried;}
public void setBaked(boolean isBaked) {mIsBaked = isBaked;}

O zaman işlevi geçersiz kılar "": . onCreateDrawableState

@Override
protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace   2);
    if (mIsFried) {
        mergeDrawableStates(drawableState, STATE_FRIED);
    }
    if (mIsBaked) {
        mergeDrawableStates(drawableState, STATE_BAKED);
    }
    return drawableState;
}

Son olarak, bu en hassas parça sizin widget için bir arka plan olarak kullanacağınız; seçici StateListDrawable tanımlama bulmaca. Bu dosya".": . res/drawable/food_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.mydomain.mypackage">
<item
    app:state_baked="true"
    app:state_fried="false"
    android:drawable="@drawable/item_baked" />
<item
    app:state_baked="false"
    app:state_fried="true"
    android:drawable="@drawable/item_fried" />
<item
    app:state_baked="true"
    app:state_fried="true"
    android:drawable="@drawable/item_overcooked" />
<item
    app:state_baked="false"
    app:state_fried="false"
    android:drawable="@drawable/item_raw" />
</selector>

"Uygulama:" öneki, standart android Devletleri ile ise önek kullanırdın "android:". fark bu XML ad alanı inflater ile doğru bir yorumlama için çok önemlidir ve hangi nitelikleri eklediğiniz proje türüne bağlıdır. Eğer bir uygulama ise, değiştirincom.alanim.mypackageuygulama (uygulama adı hariç) gerçek paket adı ile. Eğer kullanmalısınız kitaplık "" (ve R17 veya üzeri Araçlar kullanarak) veya çalışma zamanı hataları alırsınız. http://schemas.android.com/apk/res-auto

Birkaç not:

  • "RefreshDrawableState" işlevi, en azından çözüm de çalışıyor, benim durumumda . aramaya gerek yok gibi görünüyor

  • Layout xml dosyası içinde özel bir sınıf kullanmak için, tam adı (örn: com.belirtmeniz gerekir alanim.mypackage.FoodButton)

  • Daha karmaşık devlet kombinasyonları temsil etmek için karışıklık standart Birleşik Devletleri (ör:android:basıldığında, android:etkin, android: seçili) özel durumları olan şey, senin gibi

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jana Williams

    Jana William

    17 AĞUSTOS 2011
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006