অ্যান্ড্রয়েড: আমি কীভাবে এর নাম ব্যবহার করে উত্স থেকে স্ট্রিং পাব?


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
আপনি কি নিশ্চিত যে সেন্ট্রাল.লং হয় হয় enনাকি ru?
কে-বালো

1
আপনার কোডটি পরিদর্শন করতে আরও তথ্যের প্রয়োজন। আমি পাওয়ার আগে প্রতিটি ভারের অবস্থা কী? যাইহোক, আপনার জিনিসগুলি সহজ রাখতে অ্যান্ড্রয়েডে ডিফল্ট স্থানীয়করণ সমর্থন ব্যবহার করা উচিত।
অ্যালিন

উত্তর:


1069

আপনি যে লিঙ্কটি উল্লেখ করছেন সেটি রানটাইম সময়ে উত্পন্ন স্ট্রিংগুলির সাথে কাজ করে বলে মনে হচ্ছে। স্ট্রিং.এক্সএমএল থেকে স্ট্রিং রানটাইম তৈরি হয় না। আপনি তাদের মাধ্যমে পেতে পারেন

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

getResources() এর একটি পদ্ধতি Contextক্লাসের । আপনি যদি কোনও Activityবা Serviceএকের মধ্যে থাকেন (যা প্রসঙ্গ প্রসারিত হয়) আপনি এই স্নিপেটের মতো এটি ব্যবহার করতে পারেন।

এছাড়াও লক্ষ করুন যে অ্যান্ড্রয়েড কাঠামো দ্বারা পুরো ভাষার নির্ভরতা যত্ন নেওয়া যেতে পারে । প্রতিটি ভাষার জন্য কেবল আলাদা ফোল্ডার তৈরি করুন। ইংরাজী যদি আপনার ডিফল্ট ভাষা হয় তবে কেবল ইংরেজী স্ট্রিংগুলিকে intoোকান res/values/strings.xml। তারপরে একটি নতুন ফোল্ডার তৈরি করুন values-ruএবং এর মধ্যে অভিন্ন নামের সাথে রাশিযুক্ত স্ট্রিংগুলি দিন res/values-ru/strings.xml। অ্যান্ড্রয়েডের এই বিন্দু থেকে আপনার জন্য ডিভাইস লোকেলের উপর নির্ভর করে সঠিকটি নির্বাচন করে, আপনি যখন কল করবেন getString()বা এক্সএমএলে স্ট্রিংগুলি রেফারেন্সের মাধ্যমে মাধ্যমে করুন@string/mystring । থেকে বেশী res/values/strings.xml, ফলব্যাক বেশী আপনি আচ্ছাদন ব্যবহারকারীদের লোকেল একটি ফোল্ডার, এই এক ডিফল্ট মান হিসেবে ব্যবহার করা হবে না।

দেখুন স্থানীয়করণ এবং প্রদান রিসোর্স আরও তথ্যের জন্য।


23
আপনি যদি একটি হন android.support.v4.app.Fragment, আপনি কেবল getString(R.string.mystring)সরাসরি কল করতে পারেন ।
জ্যাকএক্সজেড

3
আমি কেবল ঘোরাঘুরি করছিলাম। কেন এমন জটিল উপায়ে এটি গুগল দ্বারা করা হয়? প্রথমে মাইস্ট্রিংয়ের সংখ্যার আইডি পান (আর অবজেক্ট থেকে) এবং তারপরে সেই আইডি দিয়ে স্ট্রিং পাচ্ছেন? এবং "আইডি-অফ-মাইস্ট্রিং => আসলভ্যালু" জুটিটি আসলে কোথায় থাকে? যতদূর আমি জানি মাইস্ট্রিং => আইডি-অফ-মাইস্ট্রিংটি আর.জেবাতে রয়েছে তবে এটি এটি :)
লুকা আডেক

2
নিশ্চিত করুন যে "আর" আপনার প্রকল্পের আর ডিফল্ট অ্যান্ড্রয়েড আর নয়
রাল্ফগ্যাব

2
এটি হয়ত উত্তরটির প্রয়োজন ছিল তবে এটিই যা চাওয়া হয়েছিল তা নয়! নাম অনুসারে একটি স্ট্রিং রিসোর্স অ্যাক্সেসের জন্য, @ লেওলোয়ান থেকে উত্তরটি দেখুন ... যা গ্রহণযোগ্য একটি আইএমও হওয়া উচিত
ক্রিস হ্যাটন

321

আমি একই সমস্যা আছে। তবে নীচের এই কোডটি আমার পক্ষে কাজ করে: আপনার প্যাকেজ নামটি সঠিক কিনা তা যাচাই করুন। আপনাকে আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির মূল প্যাকেজটির জন্য উল্লেখ করতে হবে।

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

9
কারও কাছে এটি করার উপযুক্ত কারণ রয়েছে (উদাহরণস্বরূপ, ডেটা ফাইলগুলিতে একটি কাস্টম স্ট্রিং থাকে যা কোন রিসোর্স স্ট্রিংটি প্রদর্শিত হবে তা স্থির করে, বা যদি এই স্ট্রিংটি ইন্টারনেট থেকে আনা হয়) - তবে আমি এটি উল্লেখ করতে চাই এই সমাধানটি সঠিক। বিশেষত সেই অংশটি সংশোধন করুন যেখানে সংস্থানটির ধরণ রয়েছে stringএবং নেই strings। কারণ এটি যৌক্তিক (অন্যান্য অ্যান্ড্রয়েডের মতো)। সুতরাং, এর জন্য ধন্যবাদ (এবং আরও অনেক কিছু), @ লিওভেনিয়ান। :-)
ইভান ভুইসিকা

2
স্ট্রিংস দ্বারা অ্যারে পেতে @ সমীর কেবলমাত্র ব্যবহার করুন: রেজ.গেটস্ট্রিংআরে (আর.আররে.প্ল্যানেটস_আরে); এই
আইসিএল

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ওভাররাইডের কারণ হবে। এছাড়াও একক প্যাটার্নটি অপ্রয়োজনীয় বলে মনে হচ্ছে, সম্ভবত এড়িয়ে যেতে পারে। এই সমাধান সঙ্গে কোন স্মৃতি সমস্যা ফাঁস?
জারভালাস

@ মার্ভালাস এটি কি স্মৃতি ফাঁস করে দেয়?
খেমরাজ

আমার অ্যাপ্লিকেশনটিতে সমস্ত ঠিক আছে :) কারও সাথে এটির কোনও সমস্যা আছে কিনা তা কেবল ভাবছি। আমি যদি কোনও সমস্যায় পড়ি তবে আমি জানাব let
জারভালাস

1
@ জারভালাস মেমোরি লিক সাধারণত এমন স্থানে ঘটে যেখানে একটি ভেরিয়েবল ব্যবহার করা হচ্ছে এমনকি পিতাম শ্রেণীর ধ্বংস হয় destroyed ক্রিয়াকলাপগুলির মতো, খণ্ডগুলি। আমি মনে করি না এটি এক্ষেত্রে ঘটবে।
খেমরাজ

14

getString()ক্রিয়াকলাপের মধ্যে ফাংশনটি ব্যবহার করা সহজ উপায় ।

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

রেফারেন্স: http://developer.android.com/guide/topics/resources/string-resource.html

আমি মনে করি সাম্প্রতিক অ্যান্ড্রয়েড সংস্করণে এই বৈশিষ্ট্যটি যুক্ত করা হয়েছে, যে কেউ ইতিহাস জানেন তারা এ সম্পর্কে মন্তব্য করতে পারেন।


14

টেক্সটভিউতে স্ট্রিং থেকে রিসোর্স স্ট্রিংয়ের একটি সহজ উপায়। এখানে রিসোর্সনাম হ'ল রিসোর্সের নাম

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

7

আপনার যদি কোনও কার্যকলাপের উল্লেখ না থাকে তবে আপনি আপনার প্রসঙ্গটি এইভাবে ব্যবহার করতে পারেন:

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

4

এছাড়াও পূর্বনির্ধারিত অ্যান্ড্রয়েড স্ট্রিংগুলির একটি সেট রয়েছে যেমন "ওকে", "বাতিল করুন" এবং আরও অনেকগুলি - তাই আপনাকে সমস্ত ঘোষণা করতে হবে না। এগুলি সহজভাবে উপলব্ধ:

getString(android.R.string.ok)

(এই ক্ষেত্রে, "ওকে" স্ট্রিং)। বিটিডব্লিউতে অন্যান্য অ্যান্ড্রয়েড সংস্থানগুলি পাওয়া যায় যেমন আইকন চিত্রগুলি ইত্যাদি available


2

স্ট্রিং মাইস্ট্রিং = গেটস্ট্রিং (আর। স্ট্রিং.মাইস্ট্রিং);

সহজ পথ


1

আপনি এটি একটি কার্যকলাপে চেষ্টা করতে পারেন:

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

অন্যান্য পরিস্থিতিতে যেমন টুকরা, ... ব্যবহার

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

0

নিরাপদে, আপনার যুক্ত করা উচিত: mContext.getRes स्रोत ()। GetString (R.string.your_string);

mContext হতে পারে: খন্ডের অন্যাটচ () এর ক্রিয়াকলাপ বা এই ক্রিয়াকলাপ।


0

আপনি যদি এটি কোনও ক্রিয়াকলাপ বা ফ্রেমনেটের ভিতরে পেতে না চান তবে:

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

আপনি যদি ক্রিয়াকলাপ বা খণ্ডের বাইরে কোনও ক্লাস থেকে এটি পেতে চান যেখানে আপনার ক্রিয়াকলাপের প্রসঙ্গ নেই তবে অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করুন:

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

0
R.string.<string_name>

আপনার জাভা ফাইলে সেই লাইনটি সরাসরি ব্যবহার করুন। সহজবোধ্য রাখো.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.