2010-12-01 20 views
40

मैं एक संसाधन डेटा संरचना को लागू करने की कोशिश कर रहा हूं जिसमें सरणी, विशेष रूप से तारों की एक सरणी शामिल है। जिस मुद्दे में मैं चलाता हूं वह है कि सब-सरणी ऑब्जेक्ट्स और उनके विशिष्ट मान कैसे प्राप्त करें। यहाँ की तरह ....एंड्रॉइड संसाधन - Arrays के Array

<resources> 
    <array name="array0"> 
    <item> 
     <string-array name="array01"> 
     <item name="id">1</item> 
     <item name="title">item one</item> 
     </string-array> 
    </item> 
    <item> 
     <string-array name="array02"> 
     <item name="id">2</item> 
     <item name="title">item two</item> 
     </string-array> 
    </item> 
    <item> 
     <string-array name="array03"> 
     <item name="id">3</item> 
     <item name="title">item three</item> 
     </string-array> 
    </item> 
    </array> 
</resources> 

फिर, मेरी जावा कोड में मैं सरणी निकालते हैं और इसलिए तरह उप तत्वों तक पहुँचने का प्रयास क्या मेरी संसाधन फ़ाइल लग रहा है ...

TypedArray typedArray = getResources().obtainTypedArray(R.array.array0); 

TypedValue typedValue = null; 

typedArray.getValue(0, typedValue); 

इस पर टाइप करेंअरे ऑब्जेक्ट को स्ट्रिंग-सरणी "array01" का प्रतिनिधित्व करना चाहिए, हालांकि, मुझे नहीं लगता कि "आईडी" और "शीर्षक" स्ट्रिंग तत्वों को कैसे पुनर्प्राप्त किया जाए। अग्रिम धन्यवाद, किसी भी मदद की सराहना की जाएगी।

+0

एंडी क्रुश द्वारा इंगित किए गए अनुसार, एक्सएमएल में इस्तेमाल किए गए "नाम" विशेषताओं में पकड़े न जाएं। वे मेरे प्रश्न को समझने में आसान बनाने के लिए बस वहां हैं। (मैंने सोचा) :-) – JediPotPie

+0

वाह! मैंने सोचा कि यह किसी के लिए आसान होगा। तो, क्या समुदाय कह रहा है कि यह नहीं किया जा सकता है? – JediPotPie

उत्तर

111

आप जो भी चाहते हैं वह लगभग कर सकते हैं। आपको प्रत्येक सरणी को अलग से और फिर संदर्भों की एक सरणी घोषित करनी होगी। कुछ इस तरह:

<string-array name="array01"> 
    <item name="id">1</item> 
    <item name="title">item one</item> 
</string-array> 
<!-- etc. --> 
<array name="array0"> 
    <item>@array/array01</item> 
    <!-- etc. --> 
</array> 
फिर अपने कोड में

आप कुछ इस तरह करते हैं: @Ted हॉप जवाब के अनुसार

Resources res = getResources(); 
TypedArray ta = res.obtainTypedArray(R.array.array0); 
int n = ta.length(); 
String[][] array = new String[n][]; 
for (int i = 0; i < n; ++i) { 
    int id = ta.getResourceId(i, 0); 
    if (id > 0) { 
     array[i] = res.getStringArray(id); 
    } else { 
     // something wrong with the XML 
    } 
} 
ta.recycle(); // Important! 
+0

भयानक टिप !!!! –

+0

मैं सरणी का तत्व प्राप्त करने में सक्षम नहीं हूं। क्या आप कुछ समाधान दे सकते हैं कृपया – user

+0

@Trupti - क्यों नहीं? यदि यह उत्तर आपके लिए काम नहीं कर रहा है, तो एक प्रश्न पोस्ट करें जो आप दिखा रहे हैं कि आप क्या कर रहे हैं और वर्णन कर रहे हैं कि क्या गलत हो रहा है। –

-3

एक ऐरे नाम/मूल्य जोड़ी नहीं है। आप केवल संख्याओं के आधार पर तत्वों तक पहुंच सकते हैं। एक्सएमएल में वाक्यविन्यास गलत है। यह इस तरह होना चाहिए:

<string-array name="string_array_name"> 
    <item>text_string1</item> 
    <item>text_string2</item> 
</string-array> 
+0

कड़ाई से बोलते हुए, एक्सएमएल का सिंटैक्स गलत नहीं है। मैंने उन नामों को मेरे प्रश्न के लिए और अधिक मानव पठनीय बनाने के लिए रखा है। आपने मेरे प्रश्न का गलत व्याख्या किया। सवाल यह है कि, मैं typedArray ऑब्जेक्ट से उप सरणी के तत्वों को कैसे एक्सेस करूं? – JediPotPie

0

, और अधिक सुरुचिपूर्ण रास्ता:

<integer-array name="id_array"> 
    <item>1</item> 
    <item>2</item> 
    <item>3</item> 
</integer-array> 
<string-array name="name_array"> 
    <item>name 1</item> 
    <item>name 2</item> 
    <item>name 3</item> 
</string-array> 
<array name="array0"> 
    <item>@array/id_array</item> 
    <item>@array/name_array</item> 
</array> 

यकीन है कि उप सरणियों बनाने पंक्ति गणना समान है।
सरणी कोशिकाओं तक पहुंचने के लिए लिखें कोड का आनंद लें!
एंड्रॉइड अभी भी एक बच्चा है जबकि TypedArray "array0" के बदसूरत "आइटम" टैग को बनाए रखता है।
मेरी राय में, सबसे लचीला होना चाहिए:

<array name="array0"> 
    <integer-array name="id_array"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </integer-array> 
    <string-array name="name_array"> 
     <item>name 1</item> 
     <item>name 2</item> 
     <item>name 3</item> 
    </string-array> 
</array> 

लेकिन ऐसा नहीं है कि क्योंकि है कि एंड्रॉयड रास्ता :)

+1

उप-सरणी पंक्ति गणना के समान होने की कोई आवश्यकता नहीं है। एंड्रॉइड (और सामान्य रूप से जावा) किसी भी समस्या के साथ [jagged (a.k.a. ragged) arrays] (https://en.wikipedia.org/wiki/Jagged_array) का समर्थन करता है। ऐसे सरणी के माध्यम से पुनरावृत्ति करते समय आपको लूप इंडेक्स पर उचित ध्यान देना होगा। –

0

https://developer.android.com/guide/topics/resources/more-resources.html#Color

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <array name="icons"> 
     <item>@drawable/home</item> 
     <item>@drawable/settings</item> 
     <item>@drawable/logout</item> 
    </array> 
    <array name="colors"> 
     <item>#FFFF0000</item> 
     <item>#FF00FF00</item> 
     <item>#FF0000FF</item> 
    </array> 
</resources> 

यह आवेदन कोड प्रत्येक सरणी को पुन: प्राप्त नहीं है और उसके बाद प्रत्येक सरणी में पहली प्रविष्टि प्राप्त होती है:

Resources res = getResources(); 
TypedArray icons = res.obtainTypedArray(R.array.icons); 
Drawable drawable = icons.getDrawable(0); 
TypedArray colors = res.obtainTypedArray(R.array.colors); 
int color = colors.getColor(0,0); 
संबंधित मुद्दे