एंड्रॉइड: मुझे इसके नाम का उपयोग करके संसाधनों से स्ट्रिंग कैसे मिलेगी?


553

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

<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
क्या आप निश्चित हैं कि Central.lang enया तो है ru?
K-ballo

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

जवाबों:


1069

जिस लिंक का आप जिक्र कर रहे हैं, वह रनटाइम पर उत्पन्न स्ट्रिंग्स के साथ काम करता है। 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()या जब XML के माध्यम से तार का संदर्भ देते हैं @string/mystring। इनमें से res/values/strings.xmlजो कमबैक वाले हैं, यदि आपके पास उपयोगकर्ताओं को लोकेल को कवर करने वाला कोई फ़ोल्डर नहीं है, तो इसे डिफ़ॉल्ट मान के रूप में उपयोग किया जाएगा।

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


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

3
मैं सिर्फ लंड हिला रहा था। यह (Google द्वारा) इतने जटिल तरीके से क्यों किया जाता है? सबसे पहले (R ऑब्जेक्ट से) मिस्ट्री की संख्यात्मक आईडी प्राप्त करें और फिर उस आईडी से स्ट्रिंग प्राप्त करें? और जहां जोड़ी "आईडी-ऑफ-मिस्ट्रिंग => एक्चुअलव्यू" वास्तव में रहती है? जहाँ तक मुझे रहस्य है => आईडी-ऑफ-मिस्ट्रिंग R.java में है, लेकिन यह है :)
Lukáš áádek

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

2
यह वह उत्तर हो सकता है जिसकी आवश्यकता थी लेकिन यह वह नहीं था जिसके लिए कहा गया था! नाम से एक स्ट्रिंग संसाधन को गतिशील रूप से एक्सेस करने के लिए, @leonvian से उत्तर देखें ... जिसे स्वीकार किया जाना चाहिए एक IMO
क्रिस हैटन

321

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

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

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

2
@ स्ट्रिंग स्ट्रिंग्स द्वारा एक सरणी प्राप्त करने के लिए बस उपयोग करें: res.getStringArray (R.array.planets_array); इस
सांकेतिक

3
ठंडा। एक अलग विधि घोषणा से छुटकारा पाने के लिए, इस तरह से "सरलीकृत" किया जा सकता है String someStringFromXML = getString(getResources().getIdentifier("some_string_name", "string", getPackageName()));:।
न्यूरोट्रांसमीटर

80

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

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

इसने बहुत धन्यवाद काम किया
मोसा

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

26

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

15

सर्वश्रेष्ठ दृष्टिकोण

App.getRes().getString(R.string.some_id)

हर जगह काम करेंगे (बर्तन, मॉडल भी)।

मैंने सभी उत्तर पढ़ लिए हैं, सभी उत्तर आपके काम आ सकते हैं।

  • आप getString(R.string.some_string_id)दोनों में Activityया उपयोग कर सकते हैं Fragment
  • आप उस पद्धति का उपयोग कर सकते हैं Context.getString(R.string.some_string_id)जहां आपके पास getString()विधि तक सीधी पहुंच नहीं है । की तरह Dialog

मुसीबत

जब आपकी Contextपहुंच नहीं होती है , तो अपनी Utilकक्षा में एक विधि की तरह ।

कॉनटेक्स्ट के बिना विधि नीचे मान लें।

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

अब आप Contextइस विधि और उपयोग में पैरामीटर के रूप में पास होंगेgetString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

मैं क्या कर रहा हूँ

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

क्या? अपने ऐप में कहीं भी उपयोग करना बहुत सरल है!

तो यहाँ एक समाधान है जिसके द्वारा आप संसाधनों को कहीं से भी एक्सेस कर सकते हैं Util class

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}

अपने manifest.xml <applicationटैग में नाम फ़ील्ड जोड़ें ।

<application
        android:name=".App"
        ...
        >
        ...
    </application>

अब आप जाने के लिए अच्छे हैं। App.getAppResources().getString(R.string.some_id)अनुप्रयोग में कहीं भी उपयोग करें ।


+1 सरल और साफ समाधान। खराब वर्तनी पर ध्यान दें getResourses, getResourcesओवरराइड का कारण होगा। इसके अलावा, सिंगलटन पैटर्न अनावश्यक लगता है, संभवतः इसे छोड़ दिया जा सकता है। कोई स्मृति इस समाधान के साथ समस्याओं को लीक करती है?
Xarvalus

@Xarvalus क्या यह मेमोरी लीक करता है?
खेमराज

मेरे app में सब ठीक है :) अगर किसी को इसके साथ कोई समस्या थी तो बस सोच रहा था। मुझे पता चल जाएगा कि क्या मुझे कोई नुकसान हुआ है।
Xarvalus

1
@Xarvalus मेमोरी लीक आमतौर पर उस स्थान पर होती है जहां एक चर का उपयोग किया जा रहा है यहां तक ​​कि मूल वर्ग भी नष्ट हो जाता है। जैसे एक्टिविटीज, फ्रेग्मेंट्स। मुझे नहीं लगता कि इस मामले में ऐसा होगा।
खेमराज

14

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

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

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

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


14

एक TextView में स्ट्रिंग से संसाधन स्ट्रिंग प्राप्त करने का एक सरल तरीका। यहाँ रिसोर्सनाम संसाधन का नाम है

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);

7

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

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

4

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

getString(android.R.string.ok)

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



1

आप इसे एक गतिविधि में आज़मा सकते हैं:

getResources().getString(R.string.your string name);

टुकड़े जैसी अन्य स्थितियों में, ... का उपयोग करें

getContext().getResources().getString(R.string.your string name);

0

सुरक्षित करने के लिए, आपको जोड़ना चाहिए: mContext.getResources ()। GetString (R.string.your_string);

mContext हो सकता है: onAttach का संदर्भ () फ्रैगमेंट का या गतिविधि का।


0

यदि आप इसे किसी गतिविधि या खुशबू के अंदर प्राप्त करते हैं, तो:

getContext().getResources().getString(R.string.string_name);

यदि आप इसे गतिविधि या खंड के बाहर एक वर्ग से प्राप्त करना चाहते हैं, जहां आपके पास गतिविधि संदर्भ नहीं है, तो एप्लिकेशन संदर्भ का उपयोग करें:

getApplicationContext().getResources().getString(R.string.string_name);

0
R.string.<string_name>

उस लाइन का उपयोग सीधे अपने जावा फाइल में करें। इसे सरल रखें।

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