2011-06-14 18 views
6

मैं एक रंगीन मूल्य बचाता है जो काम करने के लिए एक मौजूदा वरीयता subclass प्राप्त करने की कोशिश कर रहा हूँ। मैंने कक्षा नहीं लिखी, लेकिन यह एंड्रॉइड -7 और ऊपर (मैं एक एंड्रॉइड 9 लक्ष्य के लिए संकलित कर रहा हूं) पर काम कर रहा हूं। पूर्ण स्रोत कोड available here है। यहाँ जहां वरीयता सहेजा जाता है है:एंड्रॉइड कस्टम वरीयता मान सहेजा नहीं गया

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

का उपयोग डिबग आउटपुट मैं बता सकता isPersistent() रिटर्न true, लेकिन persistInt() रिटर्न false कि। Android documentation के अनुसार, persistInt() लौटाता है कि वरीयता लगातार है या नहीं; ये अलग-अलग मूल्य कैसे वापस कर सकते हैं? (नोट: setPersistent(true) स्पष्ट रूप से निर्माता से बुलाया जाता है।)

किसी भी मामले में, मान सहेजा नहीं जाता है। getPersistedInt(defaultValue) पर एक कॉल डिफ़ॉल्ट मान देता है, बाद में कक्षा के उसी उदाहरण में भी। नीचे दिए गए कोड में, getPersistedInt() हमेशा कॉल किया जाता है और हमेशा mDefaultValue देता है।

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

    return mValue; 
} 

यह क्यों है, और मैं यह कैसे सुनिश्चित कर सकता हूं कि वरीयता जारी रहेगी?

+0

Fwiw, यहाँ एक 'ColorMixer' विजेट के साथ मेरा एक परियोजना के रूप में भी एक' ColorPreference' पैक है: https://github.com/commonsguy/cwac-colormixer लिंक के लिए – CommonsWare

+0

धन्यवाद, मैंने तुम्हारा ध्यान देखा था लेकिन इसके खिलाफ फैसला किया, क्योंकि आरजीबी स्लाइडर गैर-टचस्क्रीन फोन के लिए उपयोगी हो सकते हैं, मेरे ऐप को टचस्क्रीन की आवश्यकता होती है, और मैं किसी प्रकार का एचएसएल पिकर पसंद करूंगा। – tmandry

उत्तर

8

बहुत निराशाजनक खोज के बाद, मुझे अंततः समस्या मिली: प्राथमिकता मान को मेरी प्राथमिकताओं XML फ़ाइल में एक साधारण टाइपो के कारण एक कुंजी असाइन नहीं किया गया था। (मैं android.keyandroid:key के बजाय इस्तेमाल किया।) जब एक प्राथमिकता कोई कुंजी है कि जारी रहती है की कोशिश कर रहा

एंड्रॉयड के बाद से आपको चेतावनी नहीं करता है (लेकिन चुपचाप बजाय विफल रहता है,) आप isPersistent() के बजाय shouldPersist() समारोह बुलाना चाहिए दृढ़ रहना करने के प्रयास करने से पहले एक मान, और शायद shouldPersist() गलत लौटाता है तो एक चेतावनी लॉग इन करें। उदाहरण के लिए:

@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

उस समस्या पर घंटे बिताए एक ही समस्या थी – Michal

संबंधित मुद्दे