2011-09-21 14 views
385

私は自分のリソースファイルres\values\strings.xmlに彼らのために2つのUIの言語と別の文字列値を持っていると思います。今、私は私の中でこれらの値を動的に取得する必要がAndroid:名前から文字列を取得するにはどうすればよいですか?

<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'のいずれかであると確信していますか? –

+0

コードを調べるにはさらに詳しい情報が必要です。私は前に各varの状態は何ですか?とにかく、Androidでデフォルトのローカリゼーションサポートを使用して、物事をシンプルに保つ必要があります。 – Alin

答えて

786

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

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

getResources()経由でそれらを得ることができContextクラスのメソッドです。 ActivityまたはService(Contextを拡張している)の内部にいる場合は、このスニペットのように使用できます。

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

詳細については、LocalizationおよびProviding Resourcesを参照してください。

+7

'android.support.v4.app.Fragment'の中にいるなら、' getString(R.string.mystring) 'を直接呼び出すことができます。 – JaKXz

+1

私はちょうどうそをついていた。なぜそれは(Googleによって)そのような複雑な方法で行われますか?まずMystringの数値ID(Rオブジェクトから)を取得し、そのIDで文字列を取得しますか?そして、 "ID-of-mystring => actualValue"というペアが実際に存在する場所はどこですか?私の知る限りミステリー=> IDのミストリングはR.javaにありますが、それはそれです:) –

+0

"R"があなたのプロジェクトのRであることを確認してください。デフォルトのアンドロイドR. – ralphgabb

247

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

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

誰かがこれを行う理由がある場合(たとえば、データファイルには、文字列を表示するか、この文字列をインターネットから取得した場合)、この解決策が正しいことを指摘したいと思います。特にリソースタイプが 'string'ではなく' strings'である部分を修正してください。それは論理的です(Androidの残りの部分と同様)。だから、それを感謝します(そしてもっと)、@ leonvian。 :-) –

+0

と配列の読み方は? – Sameer

+2

@SameerはStringを使って配列を取得するだけです。res.getStringArray(R.array.planets_array); このリンクをご覧ください: http://developer.android.com/guide/topics/resources/string-resource.html#StringArray – leonvian

25

万が一文字列がリソース(有効なリソースコードではありません、戻り値0、)の間で見つからない場合、関数は何かを返す場合がありますので、私は、leonvianの溶液に何かを追加します。

private String getStringResourceByName(String aString) { 
    String packageName = getPackageName(); 
    int resId = getResources() 
      .getIdentifier(aString, "string", packageName); 
    if (resId == 0) { 
     return aString; 
    } else { 
     return getString(resId); 
    } 
} 
36
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName())) 
10

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

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

参考:http://developer.android.com/guide/topics/resources/string-resource.html

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

2

文字列からリソースIDを取得する簡単な方法です。ここでresourceNameは、XMLファイルに含まれるDrawableフォルダ内のImageViewリソースの名前です。

だけの活動から
int resID = getResources().getIdentifier(resourceName, "id", getPackageName()); 
    ImageView im = (ImageView) findViewById(resID); 
    Context context = im.getContext(); 
    int id = context.getResources().getIdentifier(resourceName, "drawable", 
    context.getPackageName()); 
    im.setImageResource(id); 
50

ない:

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

あなたはアクティビティの参照を持っていない場合、あなたはこの方法であなたのコンテキストを使用することができます。

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

セットもありますあらかじめ定義されたAndroid文字列(「OK」、「キャンセル」など) - すべてを宣言する必要はありません。彼らは単に:

getString(android.R.string.ok) 

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

関連する問題