2011-06-14 18 views
6

Bir renk değeri kaydederek çalışmak için varolan bir Tercih alt sınıfını almaya çalışıyorum. Dersi yazmamıştım, ama android-7 ve üstü üzerinde çalışıyor olması gerekiyordu (bir android-9 hedefini derledim). Tam kaynak kodu available here. İşte tercihi kaydedilir nerede:Android özel tercih değeri kaydedilmedi

@Override 
public void onColorChanged(int color) { 
    if (isPersistent()) { 
     boolean ret = persistInt(color); 
    } 
    // (update preview box, other stuff) 
} 

kullanarak hata ayıklama çıkışı anlarım isPersistent() getiri true ancak persistInt() getiri false söyledi. Android documentation'a göre, persistInt() tercihi kalıcı olup olmadığını döndürür; bunlar farklı değerleri nasıl iade edebilir? (Not: setPersistent(true) açıkça constructor'dan çağrılır.)

Her durumda, değer kaydedilmez. getPersistedInt(defaultValue) numaralı çağrı, daha sonra sınıfın aynı örneğinde bile varsayılan değeri döndürür. Aşağıdaki kodda, getPersistedInt() her zaman çağrılır ve her zaman mDefaultValue döndürür.

public int getValue() { 
    try { 
     if (isPersistent()) { 
      mValue = getPersistedInt(mDefaultValue); 
     } 
    } catch (ClassCastException e) { 
     mValue = mDefaultValue; 
    } 

    return mValue; 
} 

Bu neden olduğunu ve nasıl tercih kalıcıdır emin olabiliriz?

+0

FWIW, burada aynı zamanda bir 'ColorPreference' olarak paketlenmiş bir' ColorMixer' widget'ı ile benim bir proje, var: https://github.com/commonsguy/cwac-colormixer – CommonsWare

+0

Teşekkür bağlantıdan, Seninkilere baktım ama buna karşı karar verdim, çünkü RGB sürgüleri dokunmatik olmayan telefonlar için kullanışlı olsa da, uygulama yine de bir dokunmatik ekran gerektiriyor ve ben bir çeşit HSL seçiciyi tercih ederim. – tmandry

cevap

8

Umutsuz aramadan sonra, sonunda problemi buldum: tercihlerim XML dosyasındaki basit bir yazım hatası nedeniyle bir anahtar atanmadı. (Ben android:key yerine android.key kullandı.) Android yana

hiçbir anahtara sahip bir tercih inat çalışırken sizi uyarmaz (ama sessizce yerine başarısız) yerine isPersistent() ait shouldPersist() işlevini çağırmalıdır devam denemeden önce Bir değer ve belki de shouldPersist() yanlış döndürdüğünde bir uyarı verir. Örneğin:

@Override 
public void onColorChanged(int color) { 
    mValue = color; 
    if (shouldPersist()) { 
     persistInt(color); 
    } else { 
     if (isPersistent()) 
      Log.w("myapp", "shouldPersist() returned false. Check if this preference has a key."); 
    } 
    // (update preview box, other stuff) 
} 
+0

aynı sorunu saatlerce harcadı – Michal

İlgili konular