81

Problem
I would like to be able to do something like that in Android XML code:

<string name="title">@string/app_name test</string>
<string name="title2">@string/app_name @string/version_name</string>

Regarding first line of code compiler shows this error

No resource found that matches the given name (at 'title' with value '@string/app_name test')

and regarding second line of code compiler shows this error

No resource found that matches the given name (at 'title2' with value '@string/app_name @string/version_name')

Question
Does anybody know how to concatenate multiple strings in Android XML?

Rationale
It is bad practice to duplicate variable values in many places of code (in this case XML).

3
  • Did you file a bug in the Android bug tracker or somewhere else for the case? Commented Jun 23, 2013 at 18:59
  • This feature would be a great help to maintain your code. Commented Oct 9, 2013 at 8:56
  • You can find it from here stackoverflow.com/questions/3656371/… Commented Jul 29, 2017 at 10:44

1 Answer 1

60

I've tried to do a similar maneuver myself but I was told this is not doable in Android.

The interesting thing is that you get an error message that indicates that it indeed is possible but due to errors in resource matching it's not possible right now. (Are you sure you have defined the "app_name" and "version_name" strings before the "title" and "title2" strings?)

You can however do something like:

<string name="title">%1$s test</string>
<string name="title2">%1$s %2$s</string>

<string name="app_name">AppName</string>
<string name="version_name">1.2</string>

And then from Java code do something like:

Resources res = getResources();
String appName = res.getString(R.string.app_name);
String versionName = res.getString(R.string.version_name);

String title = res.getString(R.string.title, appName);
String title2 = res.getString(R.string.title2, appName, versionName);

More about formatting strings in Android.

Hope this helps.

Sign up to request clarification or add additional context in comments.

9 Comments

That is something. :-) Sadly you can't access fields formated this way from XML, e.g. @string/title2 gives you %1$s %2$s.
Yes, that is indeed the single largest drawback of this solution: it needs Java code to work.
What's more, this doesn't work too: <string name="title">test @string/app_name</string> (but doesn't throw compile error, just stays unparsed). Seems that you are right: it's not doable what I'm asking for.
It's quite odd though. You can reference a dimension from another one. <dimen name="icon_width">@dimen/common_width</dimen> is fully valid if you previously have defined <dimen name="common_width">10dp</dimen>
For clarity. That works too: <string name="title">@string/app_name</string>.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.