web-dev-qa-db-ja.com

Android:その名前を使ってリソースから文字列を取得する方法

私は、私のリソースファイルres\values\strings.xmlで、UIと2つの別々の文字列値のために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です。

なぜ私の場合はうまくいかないのですか?

478
Ivan

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

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

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

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

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

956
user658042

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

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

活動だけからではない:

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

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);
    }
}
25
Miguel Rivero

もっと簡単な方法はアクティビティ内でgetString()関数を使うことです。

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

参照: http://developer.Android.com/guide/topics/resources/string-resource.html

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

13
Eren Yilmaz

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

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

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

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

ベストアプローチ

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タグにnameフィールドを追加してください。

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

今、あなたは行ってもいいです。アプリ内の任意の場所でApp.getAppResources().getString(R.string.some_id)を使用してください。

5
Khemraj

一連の 定義済みのAndroid文字列 "Ok"、 "Cancel"、その他多数 - を宣言している必要はない。それらは単に利用可能です:

getString(Android.R.string.ok)

(この場合、 "Ok"という文字列)ところで、例えばアイコン画像などのような利用可能な他のAndroidリソースもあります。

4
forsberg

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

簡単な方法

1
Avinash

アクティビティでこれを試すことができます:

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のthisになります。

0
O Thạnh Ldt