Android:名前を使用してリソースから文字列を取得するにはどうすればよいですか?


553

リソースファイルで、UIの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 2011

1
コードを検査するには、さらに情報が必要です。私を取得する前の各変数の状態は何ですか?とにかく、Androidのデフォルトのローカリゼーションサポートを使用して、物事をシンプルに保つ必要があります。
2011

回答:


1069

あなたが参照しているリンクは、実行時に生成された文字列で動作するようです。strings.xmlの文字列は実行時に作成されません。あなたはそれらを得ることができます

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

getResources()Contextクラスのメソッドです。a Activityまたはa Service(Contextを拡張する)内にいる場合は、このスニペットのように使用できます。

また、言語の依存関係全体がAndroidフレームワークによって処理されることに注意してください。言語ごとに異なるフォルダを作成するだけです。英語がデフォルトの言語である場合は、英語の文字列をに入れてくださいres/values/strings.xml。次に、新しいフォルダvalues-ruを作成し、同じ名前のロシア語の文字列をに入れますres/values-ru/strings.xml。この時点から、Androidは、呼び出しgetString()時またはXMLで文字列を参照するときに、デバイスのロケールに応じて適切なものを選択します@string/mystring。からのres/values/strings.xmlものはフォールバックのものです。ユーザーのロケールをカバーするフォルダーがない場合、これはデフォルト値として使用されます。

詳細については、ローカライズリソースの提供を参照してください。


23
にいる場合は、直接android.support.v4.app.Fragment呼び出すことができますgetString(R.string.mystring)
JaKXz 2014年

3
私はただ不思議に思っていました。なぜそんなに複雑な方法で(グーグルによって)行われるのですか?最初に(Rオブジェクトから)mystringの数値IDを取得し、次にそのIDで文字列を取得しますか?そして、「ID-of-mystring => actualValue」のペアが実際に存在する場所はどこですか?私の知る限り=> ID-の-のMyStringがR.javaであるが、それはそれである:) MYSTRING知っているように
ルカシュラデク

2
「R」がプロジェクトのRであり、デフォルトのAndroid Rではないことを確認してください
。– ralphgabb

2
これは必要な答えかもしれませんが、求められた答えではありませんでした!名前で文字列リソースに動的にアクセスする場合は、@ leonvianからの回答を参照してください...これは受け入れられるIMOである必要があります
Chris Hatton

321

私は同じ問題を抱えています。しかし、以下のこのコードは私にとっては機能します:packageNameが正しいかどうかを確認してください。Androidアプリケーションのルートパッケージを参照する必要があります。

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

9
誰かがこれを行う正当な理由がある場合(たとえば、データファイルに、表示するリソース文字列を決定するカスタム文字列が含まれている場合、またはこの文字列がインターネットから取得される場合)-それを指摘したいと思いますこのソリューションは正しいものです。特に、リソースタイプがある部分stringとない部分を修正しますstrings。それは論理的だからです(Androidの他の部分と同様)。@leonvianさん、ありがとうございました。:-)
IvanVučica2013

2
文字列で配列を取得するには@Sameerを使用します:res.getStringArray(R.array.planets_array); このoficialリンクを見てみましょう:developer.android.com/guide/topics/resources/...
leonvian

3
涼しい。個別のメソッド宣言を取り除くために、これは次のように「簡略化」できますString someStringFromXML = getString(getResources().getIdentifier("some_string_name", "string", getPackageName()));
神経伝達物質2016

80

活動のみからではない:

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

ありがとうございました
Mosa


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)

どこでも動作します(Utils、Modelも)。

私はすべての答えを読みました。すべての答えはあなたの仕事を成し遂げることができます。

  • またはのgetString(R.string.some_string_id)両方で使用できます。ActivityFragment
  • メソッドに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これによりメモリリークが発生しますか?
ケムラジ

私のアプリではすべてうまくいきます:)誰かがそれに何か問題があったかどうか疑問に思います 落とし穴があったらお知らせします。
Xarvalus

1
@Xarvalusのメモリリークは、通常、親クラスが破棄されても、変数が使用されている場所で発生します。アクティビティのように、フラグメント。この場合は発生しないと思います。
ケムラジ


14

リソース文字列を文字列からTextViewに取得する簡単な方法。ここで、resourceNameはリソースの名前です

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

7

アクティビティ参照がない場合は、次のようにコンテキストを使用できます。

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

4

「OK」、「キャンセル」など、事前に定義された一連のAndroid文字列もあります。そのため、すべてを宣言する必要はありません。簡単に入手できます:

getString(android.R.string.ok)

(この場合、「OK」文字列)。ところで、アイコンの画像など、他のAndroidリソースも利用できます。



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は、FragmentのonAttach()内のコンテキスト、またはこれのActivityです。


0

アクティビティまたはfragmnet内で取得したくない場合は、次のようにします。

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

アクティビティまたはフラグメント以外のクラスから、アクティビティコンテキストがない場合に取得するには、アプリケーションコンテキストを使用します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.