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

2011年09月21日に質問されました。  ·  閲覧回数 615.3k回  ·  ソース

Ivan picture
2011年09月21日

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です。

私の場合、なぜそれが機能しないのですか?

回答

user658042 picture
2011年09月21日
1118

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

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

getResources()は、 Contextクラスのメソッドです。

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

詳細については、ローカリゼーションリソースの提供を参照してください。

leonvian picture
2012年07月22日
340

packageNameが正しいかどうかを確認します。 Androidアプリケーションのルートパッケージを参照する必要があります。

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }
konmik picture
2015年11月20日
82

活動からだけではありません:

    public static String getStringByIdName(Context context, String idName) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(idName, "string", context.getPackageName()));
    }
TOUDIdel picture
2013年06月13日
39
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))
Miguel Rivero picture
2013年05月08日
26

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);
    }
}
Eren Yilmaz picture
2014年10月30日
15

より簡単な方法は、アクティビティ内でgetString()関数を使用することです。

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

参照: http

この機能は最近のAndroidバージョンで追加されたと思います。歴史を知っている人なら誰でもこれにコメントできます。

Muhammad Adil picture
2015年04月28日
15

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

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
Khemraj picture
2018年07月11日
15

最善のアプローチ

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

どこでも動作します(ユーティリティ、モデルも)。

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

  • ActivityまたはFragment両方でgetString(R.string.some_string_id)を使用できます。
  • getString()メソッドに直接アクセスできない場合は、 Context.getString(R.string.some_string_id)を使用できます。 Dialog

問題

Utilクラスのメソッドのように、 Contextアクセス権がない場合。

コンテキストのない以下のメソッドを想定します。

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)使用します。

Hazlo8 picture
2015年12月16日
7

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

getContext().getString(R.string.your_string_name);
forsberg picture
2016年04月20日
4

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

getString(android.R.string.ok)

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