स्ट्रिंग स्ट्रिंग संसाधन में xml के साथ एक स्ट्रिंग को संदर्भित करना


256

मेरे पास प्राथमिकताएं हैं जहां आप मेनू पर दिखाए जाने वाले आइटम को सक्षम / अक्षम कर सकते हैं। 17 आइटम हैं। मैंने इन 17 वस्तुओं में से प्रत्येक के लिए शीर्षक के साथ मान / arrays.xml में एक स्ट्रिंग सरणी बनाई।

मेरे पास तरजीही.एक्सएमएल है जिसमें मेरी प्राथमिकताएं फ़ाइल के लिए लेआउट है, और मैं शीर्षक के रूप में उपयोग करने के लिए स्ट्रिंग सरणी से किसी एक आइटम का संदर्भ लेना चाहूंगा।

मैं यह कैसे कर सकता हूँ?

एंड्रॉइड डेवलपर संदर्भ में, मैं देखता हूं कि मैं एक्सएमएल के साथ एक स्ट्रिंग को कैसे संदर्भित कर सकता हूं, लेकिन यह नहीं कि मैं एक्सएमएल में एक सरणी संसाधन से स्ट्रिंग का संदर्भ कैसे दे सकता हूं।

जवाबों:


331

संक्षेप में: मुझे नहीं लगता कि आप कर सकते हैं, लेकिन लगता है कि एक समाधान है :।

यदि आप यहां Android संसाधन पर एक नज़र डालें:

http://developer.android.com/guide/topics/resources/string-resource.html

आप सरणी अनुभाग (स्ट्रिंग सरणी, कम से कम) के तहत देखते हैं, "संसाधन संदर्भ" (जैसा कि आप एक XML से प्राप्त करते हैं) व्यक्तिगत वस्तुओं को संबोधित करने का एक तरीका निर्दिष्ट नहीं करता है। तुम भी अपने XML में "@ सरणी / yourarrayhere" का उपयोग करने की कोशिश कर सकते हैं। मुझे पता है कि डिजाइन के समय में आपको पहला आइटम मिलेगा। लेकिन इसका कोई व्यावहारिक उपयोग नहीं है यदि आप इसका उपयोग करना चाहते हैं, तो आइए बताते हैं ... दूसरा, निश्चित रूप से।

फिर भी, एक चाल है जो आप कर सकते हैं। यहाँ देखें:

XML ऐरे (Android) में XML स्ट्रिंग का संदर्भ देना

आप सरणी की परिभाषा में स्वतंत्र स्ट्रिंग को संबोधित करके सरणी की परिभाषा (वास्तव में नहीं) को "धोखा" दे सकते हैं। उदाहरण के लिए, अपने तार में। xml:

<string name="earth">Earth</string>
<string name="moon">Moon</string>

<string-array name="system">
    <item>@string/earth</item>
    <item>@string/moon</item>
</string-array>

इसका उपयोग करके, आप अपने "एंड्रॉइड: टेक्स्ट" और "एंड्रॉइड: शीर्षक" एक्सएमएल फ़ील्ड्स में "@ स्ट्रिंग / अर्थ" और "@ स्ट्रिंग / मून" का सामान्य रूप से उपयोग कर सकते हैं, और फिर भी आप सरणी का उपयोग करने की क्षमता नहीं खोएंगे। पहली जगह में आप जो भी उद्देश्य चाहते हैं उसकी परिभाषा।

मेरे ग्रहण पर यहाँ काम करने लगता है। अगर आप यह काम करते हैं और हमें बताने की कोशिश क्यों नहीं करते हैं? :-)


32
अगर हम केवल name<item> s ... * sigh *
कुछ Noob Student

2
बस कोशिश की! डिफॉल्ट में ऐरे को डिफाइन किया, strings.xmlलेकिन values-frफ्रेंच वर्जन के साथ ऐरे में अपडेट नहीं किया गया। इतना गलत .. लेकिन शांत यह काम करता है!
ब्लंडेल मार्क

1
किसी को भी त्वरित टिप: "पृथ्वी" पर डबल क्लिक करने से पृथ्वी पर प्रकाश डाला जाएगा। @ स्ट्रिंग / चंद्रमा में चंद्रमा पर डबल क्लिक करने से सिर्फ चंद्रमा पर प्रकाश डाला जाएगा। इस प्रकार, यदि आप अपने एरे का निर्माण करते समय कई बार किसी पहले आइटम की नकल करते हैं, तो आप अपने व्यक्तिगत स्ट्रिंग्स और स्ट्रिंग-ऐरे के बीच काफ़ी आसानी से कॉपी और पेस्ट कर सकते हैं। अपने स्ट्रिंग-सरणी के निर्माण में तेजी लाने में मदद कर सकते हैं :)
आर्टऑफवर्फ

2
बस यह जानना चाहते हैं कि क्या यह दृष्टिकोण खराब प्रदर्शन का कारण बनता है अगर मैं सरणी में तारों की घोषणा करता हूं, लेकिन वे संदर्भ का उपयोग नहीं कर रहे हैं?
एलेक्स बोनेल

1
@AlexBonel एक दिलचस्प सवाल है, और मैं ईमानदारी से नहीं जानता। यहां तक ​​कि अगर यह होता है, तो मुझे लगता है कि हमें इस तरह के बहुत सूक्ष्म अनुकूलन को संकलक पर छोड़ देना चाहिए। वैसे भी, क्या वे सड़क के नीचे कहीं भी इनलाइन नहीं हैं? मुझे लगता है कि वे करते हैं, लेकिन मुझे यकीन नहीं है। कम से कम एंड्रॉइड चेन में उच्च स्तर पर, मुझे पता है कि आप एपीकेटी के साथ एपीके को पूरी तरह से अलग कर सकते हैं, और यह स्ट्रिंग कुंजी के मूल नामों को पुनर्प्राप्त करेगा, जिसका अर्थ है कि उपरोक्त घोषणाओं, जैसे ऊपर, को रखा गया है। लेकिन मुझे अभी उस क्षेत्र में बहुत दिलचस्पी नहीं है, इसलिए मैं आपके सवाल का जवाब नहीं दे सकता। हालांकि यह एक अच्छा सवाल है।
davidcsb

216

शायद इससे मदद मिलेगी:

String[] some_array = getResources().getStringArray(R.array.your_string_array)

तो आप एक स्ट्रिंग [] के रूप में सरणी-सूची प्राप्त करते हैं और फिर किसी भी i, some_array [i] को चुनते हैं।


10
मैं समझता हूं कि ऐरे रिसोर्स कैसे प्राप्त करें। हालांकि मुझे xml लेआउट में सरणी से आइटम को संदर्भित करने की अनुमति नहीं है।
जोशेर

1
आह क्षमा करें। मैंने गलत समझा। खैर, क्या यह xml लेआउट में होना चाहिए? यदि शीर्षक उपयोगकर्ता की पसंद के साथ बदलता है, तो बस इसे .java फ़ाइल में क्यों न करें। जैसे .सेटटेक्स्ट (some_array [i])।

2
क्योंकि, वरीयताओं का लेआउट xml में है। जावा उन मदों के साथ मेनू को लोड करता है जो वरीयताओं में "सक्षम" हैं। वरीयताओं के लिए 17 चेक टाइप करना, और बाद के कोड को सूची में जोड़ने के लिए सिर्फ मुझे बेमानी और मैला लगता है।
जोशेर

यह तब उपयोगी था जब मैं अपने वैल्यू फ़ोल्डर में एक xml एरे से एक अडैप्टर बना रहा था
EHarpham

वरीयता मिलने पर डिफ़ॉल्ट मान की आवश्यकता होने पर मैंने इसे उपयोगी पाया: String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);जहाँ my_pref को पहले कुछ मान के लिए सेट किया गया था some_array [x]
अल लेलोपैथ

67

बेहतर विकल्प यह होगा कि आप दिए गए संसाधन को सरणी के रूप में उपयोग करें, जिसका अर्थ है:

getResources().getStringArray(R.array.your_array)[position]

यह उपर्युक्त दृष्टिकोणों का एक शॉर्टकट तरीका है, लेकिन उस फैशन में काम करता है जो आप चाहते हैं। अन्यथा android doesn t xml आधारित सरणियों के लिए प्रत्यक्ष XML अनुक्रमणिका प्रदान करता है।


1
@ Benjiko99 त्रुटि को खोलने के लिए धन्यवाद, इसे तदनुसार बदल दिया है।
अमितेश

यह इसे करने का सबसे संक्षिप्त तरीका है। +1!
suomi35

1
यह अधिक संक्षिप्त जैसा लग सकता है, लेकिन अगर कोई या अनुवादक स्ट्रिंग फ़ाइल में सरणी के क्रम को बदलता है, तो आप गलत स्ट्रिंग का उपयोग करके समाप्त हो जाएंगे।
newDeveloper

9

दुर्भाग्य से:

  • ऐसा लगता है कि आप एक्सएमएल के साथ मान / arrays.xml में सरणी से एक भी आइटम का संदर्भ नहीं दे सकते हैं। बेशक आप जावा में कर सकते हैं, लेकिन एक्सएमएल नहीं। Android डेवलपर संदर्भ में ऐसा करने के बारे में कोई जानकारी नहीं है, और मुझे कहीं और नहीं मिला।

  • ऐसा लगता है कि आप वरीयता लेआउट में एक सरणी के रूप में एक सरणी का उपयोग नहीं कर सकते। प्रत्येक कुंजी का एकल मान होना चाहिए, जिसका अपना कुंजी नाम है।

मैं क्या हासिल करना चाहता हूं: मैं 17 वरीयताओं के माध्यम से लूप करने में सक्षम होना चाहता हूं, जांचें कि क्या आइटम की जांच की गई है, और यदि यह है, तो उस वरीयता नाम के लिए स्ट्रिंग सरणी से स्ट्रिंग लोड करें।

यहाँ वह कोड है जिसकी मुझे आशा थी कि यह कार्य पूरा होगा:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());  
ArrayAdapter<String> itemsArrayList = new ArrayAdapter<String>(getBaseContext(),   android.R.layout.simple_list_item_1);  
String[] itemNames = getResources().getStringArray(R.array.itemNames_array);  


for (int i = 0; i < 16; i++) {  
    if (prefs.getBoolean("itemKey[i]", true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
} 

मैंने क्या किया:

  • मैंने प्रत्येक आइटम के लिए एक सिंगल स्ट्रिंग सेट किया, और इसमें सिंगल स्ट्रिंग्स का संदर्भ दिया। मैं वरीयताओं लेआउट चेकबॉक्स खिताब के लिए एकल स्ट्रिंग संदर्भ का उपयोग करता हूं, और मेरे लूप के लिए सरणी।

  • वरीयताओं के माध्यम से लूप करने के लिए, मैंने बस कुंजी 1, की 2, की 3 आदि जैसी कुंजियों का नाम दिया है क्योंकि जब आप एक स्ट्रिंग के साथ एक कुंजी का संदर्भ देते हैं, तो आपके पास रनटाइम पर कुंजी का नाम "बिल्ड" करने का विकल्प होता है।

यहाँ नया कोड है:

for (int i = 0; i < 16; i++) {  
        if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
}

1

इसे करने का एक और तरीका नीचे की तरह strings.xml में एक संसाधन सरणी को परिभाषित कर रहा है।

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [
    <!ENTITY supportDefaultSelection "Choose your issue">
    <!ENTITY issueOption1 "Support">
    <!ENTITY issueOption2 "Feedback">
    <!ENTITY issueOption3 "Help">
    ]>

और फिर उपरोक्त संसाधनों का उपयोग करके एक स्ट्रिंग सरणी को परिभाषित करना

<string-array name="support_issues_array">
        <item>&supportDefaultSelection;</item>
        <item>&issueOption1;</item>
        <item>&issueOption2;</item>
        <item>&issueOption3;</item>
    </string-array>

आप उसी स्ट्रिंग को अन्य xmls में भी देख सकते हैं, जो DRY को बरकरार रखता है। मुझे जो लाभ दिखाई दे रहा है, वह एकल मान परिवर्तन के साथ कोड के सभी संदर्भों को प्रभावित करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.