web-dev-qa-db-ja.com

String.xmlを使用した動的文字列

実行時に値を割り当てることができるプレースホルダをstring.xml内の文字列値に含めることは可能ですか?

例:

いくつかの文字列PLACEHOLDER1もう少しの文字列

412
SoftReference

フォーマットとスタイル

はい、 から参照してください。文字列リソース:フォーマットとスタイル

String.format(String, Object...)を使って文字列をフォーマットする必要がある場合は、フォーマット引数を文字列リソースに入れることでそれを行うことができます。たとえば、次のようなリソースがあります。

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

この例では、フォーマット文字列には2つの引数があります。%1$sは文字列、%2$dは10進数です。あなたはこのようにあなたのアプリケーションからの引数で文字列をフォーマットすることができます:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

基本的な使い方

getStringには、文字列をフォーマット文字列として使用するオーバーロードがあります。

String text = res.getString(R.string.welcome_messages, username, mailCount);

複数

あなたが複数形を扱う必要があるならば、これを使ってください:

<plurals name="welcome_messages">
    <item quantity="one">Hello, %1$s! You have a new message.</item>
    <item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>

最初のmailCountパラメータはどのフォーマットを使用するか(単一または複数)を決定するために使用され、他のパラメータはあなたの代用です:

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

詳細については、 文字列リソース:複数形 を参照してください。

補足回答

私が最初に%1$s%2$dを受け入れられた答えで見たとき、それは無意味です。これがもう少し説明です。

それらはフォーマット指定子と呼ばれます。 XML文字列では、

%[parameter_index$][format_type] 
  • :パーセント記号はフォーマット指定子の始まりを示します。
  • パラメータインデックス:これは数字の後にドル記号が続きます。文字列に挿入したい3つのパラメータがある場合、それらは1$2$、および3$と呼ばれます。リソース文字列に配置する順序は関係ありません。パラメータを指定する順序だけが重要です。
  • フォーマットタイプ:ものをフォーマットする方法はたくさんあります( ドキュメントを参照してください )。ここにいくつかの一般的なものがあります:

    • s文字列
    • d 10進整数
    • f浮動小数点数

灰色の部分がプログラムで挿入されている次のフォーマットされた文字列を作成します。

私の妹Mary12歳です。

string.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

MyActivity.Java

String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);

ノート

  • 私はActivityにいたのでgetStringを使うことができました。利用できない場合はcontext.getResources().getString(...)を使用できます。
  • String.format()は文字列もフォーマットします。
  • 1$および2$の用語は、この順序で使用する必要はありません。つまり、2$1$の前に置くことができます。これは、異なる語順を使用する言語用にアプリを国際化するときに役立ちます。
  • 繰り返したい場合は、xmlに%1$sのようなフォーマット指定子を複数回使用できます。
  • 実際の%%文字を取得するには、%を使用してください。
  • 詳細については、次のチュートリアルを参照してください。 Android SDKクイックヒント:リソース文字列の書式設定
206
Suragch

Javaコードを使用せずに実際のstrings.xmlファイルからパラメータを使用したい場合は、次のようにします。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "WhereDat">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

これはリソースファイル間では機能しません。つまり、変数はそれらを必要とする各XMLファイルにコピーする必要があります。

112
Oded Breiner

同じを探していて、ついに以下の非常に単純な解決策を見つけました。最善:それは箱から出して動作します。
1。文字列リソースを変更します。

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2.文字列置換を使用します。

c.getString(R.string.welcome_messages,name,count);

ここで、cはコンテキスト、nameは文字列変数、countはint変数

含める必要があります

<resources xmlns:xliff="http://schemas.Android.com/apk/res-auto">

res/strings.xmlにあります。私のために働きます。 :)

16
user3016503

ただし、 EliasMårtenson の答え( Androidの複数のゼロの扱いについて 「ゼロ」などの特定の値の解釈に問題があります。

2
JJD

Kotlinでは、文字列値を次のように設定するだけです。

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

レイアウト上にテキストビューを作成します。

<TextView Android:id="@+id/song_number_and_title"/>

あなたがAnkoを使っているなら、それからあなたのコードでこれを行います:

val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))  

アプリケーションのコンテキストからリソースを取得する必要があるかもしれません。

1
msbodw001

res/values/string.xmlの

<resources>
    <string name="app_name">Hello World</string>
    <string name="my_application">Application name: %s, package name: %s</string>
</resources>

Javaコードの

String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
1
Chanh

受け入れられた答えのコトリン版...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
0
jesses.co.tt

MessageFormatを使うことができます

<string name="customer_address">Wellcome: {0} {1}</string>

Javaコードでは:

String text =MessageFormat(R.string.customer_address).format("Name","Family");

APIレベル1

https://developer.Android.com/reference/Java/text/MessageFormat.html

0
Ahmad Aghazadeh