web-dev-qa-db-ja.com

Eclipse / Java-R.string。*の値はintを返しますか?

私は上品になり、string.xmlファイルを使用して、例外メッセージなどの定数文字列を定義すると思いました。 「strings.xml」で「Add」を押し、「String」オプション(「String Array」ではない)を選択し、名前と値を指定しました。このコードが機能しないことに驚いた。

throw new Exception(R.string.MyExceptionMessage);

R.string.MyExceptionMessageは実際にはint型であるため、失敗します。 R.Javaを調べると、そのタイプを確認できます。私は何が欠けていますか?

63
James Cadd

Rクラスのすべてが参照であるため、intとして定義されています。

コードがAndroid Context]内で実行されているか、アクセスできる場合、context.getString(R.string.my_exception_message)を呼び出して実際のStringを取得できます。値。

または、翻訳する必要がないため、Android resource .xmlファイルで厳密に定義する必要がない例外文字列のようなものについては、文字列を定数として保存できますある種のStringConstantsインターフェイス:この方法で、Contextにアクセスできない可能性のあるユーティリティクラス内の文字列を参照できます。

115
Christopher Orr

「getResources()。getString(id)」メソッドを使用します。

  getResources().getString(R.string.title_activity)

そして、ブーム、あなたの文字列があります。その文字列は、valuesフォルダーのstring.xmlファイルに必ず保存してください。

32
skidadon

クリスは正しい。しかし、例外文字列もローカライズする場合はどうでしょう。たとえば、例外をスローし、それをキャッチした場合、ユーザーに例外メッセージを表示します。これらをstrings.xmlに入れたいのですが、同時にこのコードを使いたくありません

throw new Exception(context.getString(R.string.my_exception_message))

例外が発生した場合、おそらく不要であり、例外メッセージを取得するために余分なコードを使用できないと思うからです。

私の唯一の解決策は、メインのアクティビティでこのメッセージの静的文字列を宣言し、次のようにできるだけ早く初期化することです(たとえば、onCreate()メソッドで):

private static String my_exception_message;

public onCreate()
{
    my_exception_message = context.getString(R.string.my_exception_message);
}

したがって、例外をスローすると、ローカライズされたメッセージを使用する準備が整います。あなたが思うこと?他のソリューションを考えることができますか?

5
PinoSan