android - एंड्रॉइड: संसाधनों से नाम कैसे मिल सकता है?


मुझे अपने संसाधन फ़ाइल res\values\strings.xml में UI के लिए 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 यह कोड इस लिंक से लिया गया था।

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



Answers


जिस लिंक का आप उल्लेख कर रहे हैं वह रनटाइम पर उत्पन्न तारों के साथ काम करने लगता है। स्ट्रिंग्स से स्ट्रिंग्स। 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 वाले लोग फ़ॉलबैक हैं, यदि आपके पास उपयोगकर्ता लोकेल को कवर करने वाला कोई फ़ोल्डर नहीं है, तो इसका उपयोग डिफ़ॉल्ट मान के रूप में किया जाएगा।

अधिक जानकारी के लिए स्थानीयकरण और उपलब्ध संसाधन देखें।




मेरी भी यही समस्या है। लेकिन यह कोड मेरे लिए काम करता है: यदि आपका पैकेजनाम सही है तो सत्यापित करें। आपको अपने एंड्रॉइड एप्लिकेशन के जड़ पैकेज का उल्लेख करना होगा।

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



केवल गतिविधियों से नहीं:

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



getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))



मैं लियोनियन के समाधान के लिए कुछ जोड़ूंगा, इसलिए यदि किसी भी मौके से स्ट्रिंग संसाधनों के बीच नहीं मिलती है (वापसी मूल्य 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);
    }
}



गतिविधि के भीतर getString() फ़ंक्शन का उपयोग करना आसान तरीका है

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

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

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




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

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



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

getString(android.R.string.ok)

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




Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);



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

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);