2011-08-31 10 views
17

मैं इस प्रकार एक सरल (नहीं उपयोगकर्ता के संपादन योग्य) संख्यात्मक सेटिंग एक वरीयताओं एक्सएमएल में परिभाषित किया गया है:SharedPreferences.getInt() परिणाम क्लासकास्टएक्सप्शन में - क्यों?

<EditTextPreference 
    android:key="@string/numeric_val" 
    android:defaultValue="0" /> 

और मैं इस सरल कथन का उपयोग यह पढ़ें:

sharedPrefs.getInt(getString(R.string.numeric_val), 3) 

यह काम करता है, लेकिन जब मैं इसे पढ़ने की कोशिश करता हूं, एप्लिकेशन को इंस्टॉल करने के बाद पहली बार, यह ClassCastException उत्पन्न करता है।

documentation कहता है कि getInt()"क्लासकास्ट अपवाद को फेंकता है यदि इस नाम के साथ वरीयता है जो एक int नहीं है।" - और मुझे पता है कि यह वरीयता स्पष्ट रूप से <EditTextPreference> (एक स्ट्रिंग?) के रूप में परिभाषित की गई है, लेकिन अगर यह अपवाद का कारण है, तो मुझे SharedPreferences.getInt() का उपयोग कैसे करना चाहिए?

मुझे पता है कि मैं इसके बजाय SharedPreferences.getString() का उपयोग कर सकता हूं और फिर पार्सिंग/रूपांतरण स्वयं कर सकता हूं, लेकिन फिर SharedPreferences.getInt() का उद्देश्य क्या है?

उत्तर

28

आप वरीयताओं को sharedPreferences.edit().putInt(..).commit() (उदाहरण के रूप में) के रूप में स्टोर कर सकते हैं;

और फिर उन्हें getInt के रूप में प्राप्त करें। लेकिन अगर आप EditTextPreference का उपयोग करते हैं तो यह वरीयता के प्रकार को स्ट्रिंग पर सेट करेगा। इसलिए यदि आप कुछ डेटा स्टोर करने के लिए EditTextPreference का उपयोग करते हैं, तो इसे वापस पाने के लिए Integer.valueOf(getString) का उपयोग करें।

यदि आप इसे मैन्युअल रूप से डालते हैं, तो getInt() का उपयोग करें।

एक वर्कअराउंड के रूप में, आप इस संपादन टेक्स्ट पर onPreferenceChangeListener सेट कर सकते हैं, और जब भी उपयोगकर्ता इसे बदलता है, तो आप इसे मैन्युअल रूप से एक int के रूप में सहेज लेंगे, इसलिए, यह सामान्य रूप से काम करेगा।

+0

यह बहुत ही शिक्षित स्पष्टीकरण के लिए धन्यवाद की एक्सएमएल में एक वास्तविक पूर्णांक घोषित करने के लिए कोई तरीका नहीं है। +1 और स्वीकार कर रहा है। – uTubeFan

4
android:defaultValue="0" 

एक स्ट्रिंग है।

अपने वरीयता

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