Quiero concat dos cadenas para un TextView en Android, Data Binding Api

91

Estoy usando DataBindingApi 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 usando la API de enlace de datos.

Sasank Sunkavalli
fuente

Respuestas:

233

concatelo con acento grave (`)

android:text="@{`Hello ` + user.firstName}"/>

Puede combinarlo de varias maneras, verifíquelo aquí concat-two-strings-in-textview-using-databinding

Ravi
fuente
Sí, funcionó. Gracias . Estaba usando una sola coma invertida ('). El acento grave (`) funcionó para mí.
Sasank Sunkavalli
@SasankSunkavalli se complace en ayudarlo :), siempre use acento grave para la cadena cuando use DataBinding.
Ravi
1
No lo entiendo. En mi .xml, este método, así como cualquier otro método en esta página, ni siquiera está cerca de ser funcional. Todo lo que hace es imprimir como: @{Hola `+ user.firstName}`
ekashking
¿Esto es DataBinding?
IgorGanapolsky
68

Esto ya lo responde @GeorgeMount en los comentarios de una de las soluciones. Lo que a mí me parece la mejor solución hasta ahora.

android:text="@{@string/location(user.city,user.state)}"

en tu strings.xml

<string name="location">%1$s, %2$s</string>
Prakash
fuente
¡estupendo! thnx wery
Serg Burlaka
eso es lo que estoy buscando :)
Edgar Khimich
45

Muchas formas de concatizar cadenas

1. Uso de recursos de cadena ( más preferible debido a la localización )

android:text= "@{@string/generic_name(user.name)}"

Simplemente haga un recurso de cadena como este.

<string name="generic_name">Hello %s</string>

2. Concat codificado de forma rígida

android:text="@{`Hello ` + user.name}"/>

3. Usando Stringel método concat de '

android:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"

Aquí spacehay una entidad html que se coloca dentro strings.xml. Porque XMLno acepta entidades Html ni caracteres especiales directamente. (Vincular entidades HTML)

<string name="space">\u0020</string>

4. Usando String.format()

android:text= "@{String.format(@string/Hello, user.name)}"

tienes que importar la clase String en el diseño de 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, elija la que necesite.

Khemraj
fuente
La opción 1 funcionó para mí. La opción 4 no funcionó. Si tiene un adaptador estrecho, recomiendo la opción 1.
rminaj
10

Dado que xml admite comillas simples para los valores de atributo, también puede hacer esto:

android:text='@{"Hello "+user.firstName}'
ArJ
fuente
7

Hay dos maneras.

Primera solucion

concat con acento grave (`)

android:text="@{`Hello ` + user.firstName}"/>

Segunda solución

Declare su cadena en strings.xml

como "Hello %1$s , (whatever you want to add then add here)".

uso amd String.format(stringResource, upsatename);

Yogesh Rathi
fuente
Sé que esto funcionaría, pero quiero usar el método concat
Sasank Sunkavalli
23
También puede utilizar recursos de cadena formateados en la expresión:android:text="@{@string/hello(user.firstName)}"
George Mount
es% 1 $ s en lugar de% $ 1s ...;)
Rik van Velzen
6

En caso de cadena estática y otra dinámica, puede usar esto

android:text="@{`Hello ` + user.firstName}"/>

En caso de datos dinámicos, puede usar esto.

android:text='@{user.firstName+" "+user.lastName}'
kishan verma
fuente
4

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 agregado código para espacio en blanco:

<string name="space">\u0020</string>
Android listo
fuente
4

si desea concatizar Stringrecursos con datos de su modelo, puede hacerlo de la siguiente manera:

 android:text='@{@string/release_date+model.release_date}'
Jackky777
fuente
0

La forma más sencilla que encontré es reemplazar '' (sencillo) en lugar de "" (doble), por ejemplo. Tienes dos variables,

<variable name="a" type="String" />
<variable name="b" type="String" />

Ahora para concatenar,

android:text='a + " " + b}'
Aziz
fuente