2011-09-21 13 views
385

मैं अपने संसाधन फ़ाइल res\values\strings.xml में उनके लिए यूआई और अलग स्ट्रिंग मूल्यों के लिए 2 भाषाओं करना चाहते हैं:एंड्रॉइड: मैं अपने नाम का उपयोग कर संसाधनों से स्ट्रिंग कैसे प्राप्त करूं?

<string name="tab_Books_en">Books</string> 
<string name="tab_Quotes_en">Quotes</string> 
<string name="tab_Questions_en">Questions</string> 
<string name="tab_Notes_en">Notes</string> 
<string name="tab_Bookmarks_en">Bookmarks</string> 

<string name="tab_Books_ru">Книги</string> 
<string name="tab_Quotes_ru">Цитаты</string> 
<string name="tab_Questions_ru">Вопросы</string> 
<string name="tab_Notes_ru">Заметки</string> 
<string name="tab_Bookmarks_ru">Закладки</string> 

अब मैं में गतिशील रूप से इन मूल्यों को पुनः प्राप्त करने की जरूरत है मेरी ऐप:

spec.setContent(R.id.tabPage1); 
String pack = getPackageName(); 
String id = "tab_Books_" + Central.lang; 
int i = Central.Res.getIdentifier(id, "string", pack); 
String str = Central.Res.getString(i); 

मेरी समस्या यह है कि i = 0

यह मेरे मामले में क्यों काम नहीं करता है?

+1

क्या आप निश्चित हैं कि सेंट्रल.लांग या तो 'एन' या' आरयू' है? –

+0

अपने कोड का निरीक्षण करने के लिए अधिक जानकारी की आवश्यकता है। मुझे प्राप्त करने से पहले प्रत्येक var की स्थिति क्या है? वैसे भी, आपको चीजों को सरल रखने के लिए एंड्रॉइड में डिफ़ॉल्ट स्थानीयकरण समर्थन का उपयोग करना चाहिए। – Alin

उत्तर

786

जिस लिंक का आप उल्लेख कर रहे हैं वह रनटाइम पर उत्पन्न तारों के साथ काम करता प्रतीत होता है। Strings.xml से तार रनटाइम पर नहीं बनाए जाते हैं। आप के माध्यम से

String mystring = getResources().getString(R.string.mystring); 

getResources() उन्हें प्राप्त कर सकते हैं Context वर्ग की एक विधि है। यदि आप Activity या Service (जो संदर्भ बढ़ाते हैं) के अंदर हैं तो आप इसे इस स्निपेट में उपयोग कर सकते हैं।

भी ध्यान दें कि संपूर्ण भाषा निर्भरता एंड्रॉइड फ्रेमवर्क द्वारा देखभाल की जा सकती है। बस प्रत्येक भाषा के लिए अलग-अलग फ़ोल्डर बनाएं। अगर अंग्रेजी आपकी डिफ़ॉल्ट भाषा है, तो अंग्रेजी स्ट्रिंग्स को res/values/strings.xml पर रखें। फिर एक नया फ़ोल्डर values-ru बनाएं और रूसी तारों को समान नामों के साथ res/values-ru/strings.xml में रखें। एंड्रॉइड पर इस बिंदु से आपके लिए डिवाइस लोकेल के आधार पर सही एक का चयन करता है, या तो जब आप getString() पर कॉल करते हैं या @string/mystring के माध्यम से एक्सएमएल में स्ट्रिंग का संदर्भ देते हैं। res/values/strings.xml के लोग फ़ॉलबैक वाले हैं, यदि आपके पास उपयोगकर्ता लोकेल को कवर करने वाला फ़ोल्डर नहीं है, तो इसका उपयोग डिफ़ॉल्ट मानों के रूप में किया जाएगा। अधिक जानकारी के लिए

Localization और Providing Resources देखें।

+7

यदि आप 'android.support.v4.app.Fragment' में हैं, तो आप सीधे 'getString (R.string.mystring)' को कॉल कर सकते हैं। – JaKXz

+1

मैं बस wodering था। ऐसा क्यों किया जाता है (गूगल द्वारा) इस तरह के जटिल तरीके से? सबसे पहले mystring (आर ऑब्जेक्ट से) की संख्यात्मक आईडी प्राप्त करें और फिर उस आईडी द्वारा स्ट्रिंग प्राप्त करें? और जहां जोड़ी "आईडी-ऑफ-माइस्ट्रिंग => वास्तविक वैल्यू" वास्तव में रहता है? जहां तक ​​मुझे पता है कि mystring => आईडी-ऑफ-माइस्ट्रिंग आर.जावा में है, लेकिन यह है :) –

+0

सुनिश्चित करें कि "आर" आपकी प्रोजेक्ट आर है डिफ़ॉल्ट एंड्रॉइड आर – ralphgabb

247

मुझे एक ही समस्या है। लेकिन नीचे यह कोड मेरे लिए काम करता है: सत्यापित करें कि आपका पैकेज नाम सही है या नहीं। आपको अपने एंड्रॉइड एप्लिकेशन के रूट पैकेज का संदर्भ लेना होगा।

private String getStringResourceByName(String aString) { 
     String packageName = getPackageName(); 
     int resId = getResources().getIdentifier(aString, "string", packageName); 
     return getString(resId); 
    } 
+4

होना चाहिए यदि किसी के पास ऐसा करने का कोई अच्छा कारण है (उदाहरण के लिए, डेटा फ़ाइलों में एक कस्टम स्ट्रिंग होती है जो निर्णय लेती है कि कौन सा संसाधन स्ट्रिंग प्रदर्शित की जानी चाहिए, या यदि यह स्ट्रिंग इंटरनेट से प्राप्त की जाती है) - तो मैं यह इंगित करना चाहता हूं कि यह समाधान सही है। विशेष रूप से उस भाग को सही करें जहां संसाधन प्रकार 'स्ट्रिंग' है और 'स्ट्रिंग्स' नहीं है। क्योंकि यह तार्किक है (बाकी एंड्रॉइड की तरह)। तो, उस (और अधिक), @leonvian के लिए धन्यवाद। :-) –

+0

और सरणी को कैसे पढ़ा जाए? स्ट्रिंग्स द्वारा सरणी प्राप्त करने के लिए – Sameer

+2

@ समीर का उपयोग करें: res.getStringArray (R.array.planets_array); इस आइसियल लिंक पर एक नज़र डालें: http://developer.android.com/guide/topics/resources/string-resource.html#StringArray – leonvian

25

मैं, leonvian के समाधान के लिए कुछ जोड़ना होगा, इसलिए यदि किसी भी संयोग से स्ट्रिंग संसाधनों में नहीं पाया जाता है (वापसी मान 0 है, कि एक वैध संसाधन कोड नहीं है), समारोह कुछ वापस कर सकती है:

private String getStringResourceByName(String aString) { 
    String packageName = getPackageName(); 
    int resId = getResources() 
      .getIdentifier(aString, "string", packageName); 
    if (resId == 0) { 
     return aString; 
    } else { 
     return getString(resId); 
    } 
} 
36
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName())) 
10

आसान तरीका गतिविधि के भीतर getString() समारोह का प्रयोग है।

String myString = getString(R.string.mystring); 

संदर्भ: http://developer.android.com/guide/topics/resources/string-resource.html

मुझे लगता है कि इस सुविधा हाल ही में एक Android संस्करण में जोड़ा जाता है, जो कोई इतिहास जानता है इस पर टिप्पणी कर सकते हैं।

2

स्ट्रिंग से संसाधन आईडी प्राप्त करने का एक आसान तरीका। यहां संसाधननाम संसाधन ImageView का नाम खींचने योग्य फ़ोल्डर में है जो एक्सएमएल फ़ाइल में भी शामिल है।

int resID = getResources().getIdentifier(resourceName, "id", getPackageName()); 
    ImageView im = (ImageView) findViewById(resID); 
    Context context = im.getContext(); 
    int id = context.getResources().getIdentifier(resourceName, "drawable", 
    context.getPackageName()); 
    im.setImageResource(id); 
50
न केवल गतिविधियों से

:

public static String byIdName(Context context, String name) { 
     Resources res = context.getResources(); 
     return res.getString(res.getIdentifier(name, "string", context.getPackageName())); 
    } 
7

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

getContext().getString(R.string.your_string_name); 
4

वहाँ भी एक सेट है पूर्वनिर्धारित Android स्ट्रिंग्स जैसे "ठीक", "रद्द करें" और कई अन्य - इसलिए आपको सभी को घोषित करने की आवश्यकता नहीं है। वे आसानी से उपलब्ध हैं:

getString(android.R.string.ok) 

(इस मामले में, "ठीक है" स्ट्रिंग)। बीटीडब्ल्यू अन्य एंड्रॉइड संसाधन भी उपलब्ध हैं जैसे कि उदाहरण छवियों इत्यादि।

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

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