How do I use databinding to combine a string from resources with a dynamic variable in XML?
Solution 1:
You can do this even simplier:
android:text= "@{@string/generic_text(profile.name)}"
you string should be like this:
<string name="generic_text">My Name is %s</string>
Edit:
-
Of course you can use as many variables as you need:
android:text= "@{@string/generic_text(profile.firstName, profile.secondName)}" <string name="generic_text">My Name is %1$s %2$s</string>
It works just because it's designed in data binding. More in docs: https://developer.android.com/topic/libraries/data-binding/expressions#resources
Solution 2:
You can do this:
android:text= "@{String.format(@string/Generic_Text, Profile.name)}"
if you use string formatting for your Generic_Text
string. ex. %s
at the end
Solution 3:
Many ways to concat strings
1. Using string resource (Recommended because Localization)
android:text= "@{@string/generic_name(user.name)}"
Just make string resource like this.
<string name="generic_name">Hello %s</string>
2. Hard coded concat
android:text="@{`Hello ` + user.name}"/>
This is useful when you need hardcoded append like + for phone number.
3. Using String
's concat method
android:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"
Here space
is an html entity which is placed inside strings.xml
. Because XML
does not accept Html entities or special characters directly. (Link Html Entities)
<string name="space">\u0020</string>
4. Using String.format()
android:text= "@{String.format(@string/Hello, user.name)}"
you have to import String class in layout in this type.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="String" />
</data>
<TextView
android:text= "@{String.format(@string/Hello, user.name)}"
... >
</TextView>
</layout>
5. concat two strings by string resource.
android:text="@{@string/generic_name(user.firstName,user.lastName)}"
In this case put a string resource in strings.xml
<string name="generic_name">%1$s, %2$s</string>
There can be many other ways, choose one you need.