Je veux concaténer deux chaînes pour un TextView dans Android, API de liaison de données

91

J'utilise DataBinding Api pour définir les vues dans les mises en page Android. Voici ma mise en page.

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>

Je veux que TextView affiche Hello UserName . Comment y parvenir en utilisant l'API de liaison de données.

Sasank Sunkavalli
la source

Réponses:

233

concate-le avec un accent grave (`)

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

Vous pouvez le concaténer de plusieurs manières, vérifiez-le ici concat-two-strings-in-textview-using-databinding

Ravi
la source
Ouais ça a marché. Merci . J'utilisais une seule virgule inversée ('). L'accent grave (`) a fonctionné pour moi.
Sasank Sunkavalli
@SasankSunkavalli heureux de vous aider :), utilisez toujours l'accent grave pour la chaîne lorsque vous utilisez DataBinding.
Ravi
1
Je ne comprends pas. Sur mon .xml, cette méthode, ainsi que toutes les autres méthodes de cette page, n'est même pas près d'être fonctionnelle. Tout ce qu'il fait, c'est imprimer comme: @{Bonjour `+ user.firstName}`
ekashking
C'est DataBinding?
IgorGanapolsky
68

C'est déjà répondu par @GeorgeMount dans les commentaires de l'une des solutions. Ce qui me semble être la meilleure solution à ce jour ici.

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

dans votre strings.xml

<string name="location">%1$s, %2$s</string>
Prakash
la source
génial! thnx wery
Serg Burlaka
c'est ce que je recherche :)
Edgar Khimich
45

De nombreuses façons de concater des chaînes

1. Utilisation de la ressource de chaîne (le plus préférable en raison de la localisation )

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

Créez simplement une chaîne de caractères comme celle-ci.

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

2. Concat codé en dur

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

3. Utilisation de Stringla méthode concat de

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

Voici spaceune entité html qui est placée à l'intérieur strings.xml. Car XMLn'accepte pas directement les entités Html ou les caractères spéciaux. (Lier les entités HTML)

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

4. Utilisation String.format()

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

vous devez importer la classe String dans la mise en page dans ce 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. Une autre méthode

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

Dans ce cas, mettez une ressource chaîne dans strings.xml

<string name="generic_name">%1$s, %2$s</string>

Il peut y avoir de nombreuses autres façons, choisissez celle dont vous avez besoin.

Khemraj
la source
L'option 1 a fonctionné pour moi. L'option 4 n'a pas fonctionné. Si vous avez un adaptateur étroit, je recommande l'option 1.
rminaj
10

Étant donné que xml prend en charge les guillemets simples pour les valeurs d'attribut, vous pouvez également le faire:

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

Il y a deux manières.

Première solution

concat avec un accent grave (`)

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

Deuxième solution

Déclarez votre chaîne dans strings.xml

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

utilisation amd String.format(stringResource, upsatename);

Yogesh Rathi
la source
Je sais que cela fonctionnerait, mais je veux utiliser la méthode
concat
23
Vous pouvez également utiliser des ressources de chaîne formatées dans l'expression:android:text="@{@string/hello(user.firstName)}"
George Mount
c'est% 1 $ s au lieu de% $ 1s ...;)
Rik van Velzen
6

En cas de chaîne statique et autre dynamique, vous pouvez utiliser ceci

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

En cas de données dynamiques, vous pouvez l'utiliser.

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

Pour faire un concat dans une mise en page 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)}"

Dans strings.xml, j'ai ajouté du code pour l'espace vide:

<string name="space">\u0020</string>
Prêt Android
la source
4

si vous souhaitez concaténer la Stringressource avec les données de votre modèle, vous pouvez le faire de la manière suivante:

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

La manière la plus simple que j'ai trouvée est de remplacer «» (simple) à la place de «» (double), par exemple. Vous avez deux variables,

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

Maintenant pour concaténer,

android:text='a + " " + b}'
Aziz
la source