Is it possible to have placeholders in string values in
string.xml that can be assigned values at run time?
some string PLACEHOLDER1 some more string
Yes, see the following from String Resources: Formatting and Styling
If you need to format your strings using
String.format(String, Object...), then you can do so by putting your format arguments in the string resource. For example, with the following resource:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
In this example, the format string has two arguments:
%1$sis a string and
%2$dis a decimal number. You can format the string with arguments from your application like this:
Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
getString has an overload that uses the string as a format string:
String text = res.getString(R.string.welcome_messages, username, mailCount);
If you need to handle plurals, use this:
<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 param is used to decide which format to use (single or plural), the other params are your substitutions:
Resources res = getResources(); String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
See String Resources: Plurals for more details.
When I first saw
%2$d in the accepted answer, it made no sense. Here is a little more explanation.
They are called format specifiers. In the xml string they are in the form of
3$. The order you place them in the resource string doesn't matter, only the order that you supply the parameters.
format type: There are a lot of ways that you can format things (see the documentation). Here are some common ones:
ffloating point number
We will create the following formatted string where the gray parts are inserted programmatically.
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
String myString = "Mary"; int myInt = 12; String formatted = getString(R.string.my_xml_string, myString, myInt);
getStringbecause I was in an Activity. You can use
context.getResources().getString(...)if it is not available.
String.format()will also format a String.
2$terms don't need to be used in that order. That is,
2$can come before
1$. This is useful when internationalizing an app for languages that use a different word order.
%1$smultiple times in the xml if you want to repeat it.
%%to get the actual