実行時に値を割り当てることができるプレースホルダをstring.xml
内の文字列値に含めることは可能ですか?
例:
いくつかの文字列PLACEHOLDER1もう少しの文字列
はい、 から参照してください。文字列リソース:フォーマットとスタイル
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]
1$
、2$
、および3$
と呼ばれます。リソース文字列に配置する順序は関係ありません。パラメータを指定する順序だけが重要です。フォーマットタイプ:ものをフォーマットする方法はたくさんあります( ドキュメントを参照してください )。ここにいくつかの一般的なものがあります:
s
文字列d
10進整数f
浮動小数点数灰色の部分がプログラムで挿入されている次のフォーマットされた文字列を作成します。
私の妹
Mary
は12
歳です。
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);
getString
を使うことができました。利用できない場合はcontext.getResources().getString(...)
を使用できます。String.format()
は文字列もフォーマットします。1$
および2$
の用語は、この順序で使用する必要はありません。つまり、2$
は1$
の前に置くことができます。これは、異なる語順を使用する言語用にアプリを国際化するときに役立ちます。%1$s
のようなフォーマット指定子を複数回使用できます。%%
文字を取得するには、%
を使用してください。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ファイルにコピーする必要があります。
同じを探していて、ついに以下の非常に単純な解決策を見つけました。最善:それは箱から出して動作します。
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にあります。私のために働きます。 :)
ただし、 EliasMårtenson の答え( Androidの複数のゼロの扱いについて 「ゼロ」などの特定の値の解釈に問題があります。
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))
アプリケーションのコンテキストからリソースを取得する必要があるかもしれません。
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);
受け入れられた答えのコトリン版...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
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