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.

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


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>

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.


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}'

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);


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}'

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>

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}'

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}'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.