android - studio - data binding español
Quiero concat dos cadenas para un TextView en Android, Data Binding Api (7)
Estoy usando DataBinding
Api para configurar las vistas en diseños de Android. Aquí está mi diseño.
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="testing.sampleapp.com.sampleapp.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ "Hello " + user.firstName}"/>
</LinearLayout>
Quiero que TextView muestre Hello UserName . Cómo lograr esto utilizando la api de enlace de datos.
5 maneras de concat cuerdas
1. Uso de recursos de cadena (lo más preferible debido a la localización )
android:text= "@{@string/generic_name(user.name)}"
Sólo haz un recurso de cadena como este.
<string name="generic_name">Hello %s</string>
2. concat codificado
android:text="@{`Hello ` + user.name}"/>
3. Usando String
método concat de String
.
android:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"
Aquí el space
es una entidad html que se coloca dentro de strings.xml
. Porque XML
no acepta entidades HTML o caracteres especiales directamente. (Enlace de entidades HTML)
<string name="space">/u0020</string>
4. Usando String.format()
android:text= "@{String.format(@string/Hello, user.name)}"
tienes que importar clase String en diseño en este tipo.
<?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. otro método
android:text="@{@string/generic_name(user.firstName,user.lastName)}"
En este caso, ponga un recurso de cadena en strings.xml
<string name="generic_name">%1$s, %2$s</string>
Puede haber muchas otras formas, elige una que necesites.
Como xml admite comillas simples para valores de atributo, también puede hacer esto:
android:text=''@{"Hello "+user.firstName}''
Esto ya ha sido respondido por @GeorgeMount en comentarios a una de las soluciones. Que para mí parece la mejor solución hasta ahora aquí. Por favor dale un +1
android:text="@{@string/location(user.city,user.state)}"
en tus cadenas.xml
<string name="location">%1$s, %2$s</string>
Hay dos maneras.
Primera solucion
concat con grave acento (`)
android:text="@{`Hello ` + user.firstName}"/>
Segunda solucion
strings.xml
tu cadena en strings.xml
como "Hello %1$s , (whatever you want to add then add here)"
.
amd use String.format(stringResource, upsatename);
Para hacer un concat en diseño xml:
<data>
/*This is used for android view*/
<import type="android.view.View" />
/*This is used for android resources*/
<import type="com.myapp.R" />
/*This is app context*/
<variable
name="context"
type="android.content.Context" />
/*This is used for model data*/
<variable
name="item"
type="com.myapp.models.Chapter" />
</data>
android:text="@{item.serialNo.concat(@string/space).concat(item.title)}"
En strings.xml he añadido código para el espacio en blanco:
<string name="space">/u0020</string>
Si quiere concat String
resource con datos de su modelo, puede hacerlo de la siguiente manera:
android:text=''@{@string/release_date+model.release_date}''
concítala con acento grave (`)
android:text="@{`Hello ` + user.firstName}"/>