2012-07-05 14 views
56

काम नहीं कर रहे हैं। मैं एक list.xml फ़ाइल सूची सूची में उपयोग कर रहा हूं। मैं उपयोगकर्ता को चुनने के लिए 3 विकल्पों की एक सूची दिखाना चाहता हूं। यहाँListPreference: एंट्री और पूर्णांक-सरणी के रूप में स्ट्रिंग-सरणी का उपयोग करें क्योंकि प्रवेश मान

<ListPreference 
    android:entries="@array/date_alignement" 
    android:entryValues="@array/date_alignement_values" 
    android:key="settings_date_alignement" 
    android:summary="@string/settings_date_alignement_summary" 
    android:title="@string/settings_date_alignement_title" /> 

और सरणियों मैं प्रविष्टियों को पॉप्युलेट करने के लिए उपयोग कर रहे हैं:

java.lang.NullPointerException 
    at android.preference.ListPreference.onDialogClosed(ListPreference.java:264) 
    at android.preference.DialogPreference.onDismiss(DialogPreference.java:381) 
    at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1228) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4424) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 

यह ListPreference का कोड है: उपयोगकर्ता सेटिंग्स में से कोई एक विकल्प चुनता है, मैं इस त्रुटि मिलती है :

<string-array name="date_alignement"> 
    <item>"Top"</item> 
    <item>"Center"</item> 
    <item>"Bottom"</item> 
</string-array> 
<integer-array name="date_alignement_values"> 
    <item >0</item> 
    <item >1</item> 
    <item >2</item> 
</integer-array> 

मेरी onSharedPreferenceChanged मैं इस तरह से उन मूल्यों का उपयोग में:

@Override 
public void onSharedPreferenceChanged(
      SharedPreferences sharedPreferences, String key) {   

     //Text 
     mAlignment = mPrefs.getInt(PREF_ALIGNMENT, 1); 
     switch (mAlignment) { 
     case 0: 
      offsetY = mHeight/3.0f; 
      break; 

     case 2: 
      offsetY = mHeight*2.0f/3.0f; 
      break; 

     default: 
      offsetY = mHeight/2.0f; 
      break; 
     } 
} 

यदि मैं एंट्री वैल्यू के लिए एक और स्ट्रिंग-सरणी का उपयोग करता हूं तो यह काम करता है। उदाहरण के लिए अगर मैं मूल्यों और प्रविष्टियों के रूप में एक ही स्ट्रिंग सरणी का उपयोग करें:

android:entries="@array/date_alignement" 
    android:entryValues="@array/date_alignement" 

तो मैं एक छोटे से मेरे कोड को बदलने के लिए है, लेकिन यह काम करता है:

 if(mAlignment.equalsIgnoreCase("center")) { 
      offsetY = mHeight/2.0f; 
     } else if(mAlignment.equalsIgnoreCase("top")) { 
      offsetY = mHeight/3.0f; 
     } else if(mAlignment.equalsIgnoreCase("bottom")) { 
      offsetY = mHeight*2.0f/3.0f; 
     } 

क्यों मैं एक string- उपयोग नहीं कर सकते सरणी और ListPreference प्रविष्टियों और मानों के लिए एक पूर्णांक-सरणी?

+0

मैं बेवकूफ प्रश्न के लिए sory हूँ, लेकिन आप चर mAlignment किस प्रकार उपयोग करते हैं? और आपको PREF_ALIGNMENT कहां मिला? – Yarik

+0

पहले मामले में mAlignment एक int है। PREF_ALIGNMENT SharePreferences में प्रविष्टि का नाम है, जहां संरेखण वर्तमान मान – Santacrab

उत्तर

73

उत्तर सरल है: क्योंकि एंड्रॉइड इस तरह से डिज़ाइन किया गया है। यह सिर्फ प्रविष्टियों और प्रविष्टि मानों के लिए String सरणी का उपयोग करता है और यह सब कुछ है। और मुझे इस तथ्य में कोई समस्या नहीं दिखाई दे रही है, क्योंकि आप Integer.parseInt() विधि का उपयोग करके String को int पर आसानी से परिवर्तित कर सकते हैं। उम्मीद है की यह मदद करेगा।

+21

ठीक है, फिर भी यह नहीं मिलता है कि यह समर्थित क्यों नहीं है। स्पष्ट रूप से मैं इसे बदल सकता हूं और मैं इसे परिवर्तित कर दूंगा, लेकिन स्ट्रिंग एक का उपयोग करने और इसे int में बदलने के बजाय एक विशिष्ट संरचना (पूर्णांक-सरणी) का उपयोग करना संभव है, तो इसे काम करना चाहिए :) वैसे भी धन्यवाद! – Santacrab

+3

@ सैंटैक्रैब, यदि एक पूर्णांक सरणी समर्थन था, तो वहां फ्लोट सरणी समर्थन, डबल, चार इत्यादि भी होना चाहिए। यह एक बड़ी गड़बड़ी होगी, इसलिए मुझे लगता है कि स्ट्रिंग को किसी भी प्रकार की डेटा प्रकार में परिवर्तित करना आसान है। अगर आपको यह उपयोगी लगता है तो कृपया उत्तर स्वीकार करें। – Egor

+1

वास्तव में पूर्णांक-सरणी संरचना मौजूद है। समस्या यह है कि जब स्ट्रिंग में जोड़ा जाता है तो यह काम नहीं करता है। – Santacrab

3

उत्तर List Preference Documentation में सूचीबद्ध है।

int findIndexOfValue (String value) 

दिया मूल्य के लिए सूचकांक वापस आ जाएगी और तर्क एक स्ट्रिंग के रूप में लिया जाता है, इसलिए entryValues ​​सरणी एक स्ट्रिंग सरणी इस काम पाने के लिए किया जाना चाहिए।

-2

निम्नलिखित मेरे लिए काम किया:

String objectName = prefs.getString("listPrefMelodyYd1", ""); 
switch (objectName.toUpperCase()) { 
    case "1": 
     playSound(catSound); 
     break; 
    case "2": 
     playSound(dogSound); 
     break; 
    case "3": 
     playSound(cowSound); 
     break; 
} 
+0

कृपया इस मुद्दे का सही वर्णन करें। –

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