Voglio concatenare due stringhe per un TextView in Android, Data Binding Api


94

Sto usando DataBindingApi per impostare le visualizzazioni nei layout Android. Ecco il mio layout.

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>

Voglio che TextView visualizzi Hello UserName . Come ottenere ciò utilizzando l'API di associazione dati.

Risposte:


242

concedilo con accento grave (`)

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

Puoi concatenerlo in più modi, controllalo qui concat-two-string-in-textview-using-databinding


Sì, ha funzionato. Grazie . Stavo usando una singola virgola invertita ('). L'accento grave (`) ha funzionato per me.
Sasank Sunkavalli

@SasankSunkavalli felice di aiutarti :), usa sempre un accento grave per la stringa quando usi DataBinding.
Ravi

1
Non lo capisco. Sul mio .xml questo metodo, così come qualsiasi altro metodo in questa pagina, non è nemmeno vicino all'essere funzionale. Tutto ciò che fa è stampare come: @{Hello `+ user.firstName}`
ekashking

Questo è il DataBinding?
IgorGanapolsky

71

Questo è già stato risposto da @GeorgeMount nei commenti a una delle soluzioni. Che a me sembra la migliore soluzione finora qui.

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

nel tuo strings.xml

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

grande! thnx wery
Serg Burlaka

questo è quello che sto cercando :)
Edgar Khimich

48

Molti modi per concatenare le stringhe

1. Utilizzo della risorsa stringa ( preferibile soprattutto a causa della localizzazione )

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

Crea solo una risorsa stringa come questa.

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

2. Concat. Hard coded

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

3. Utilizzo Stringdel metodo concat di

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

Ecco spaceun'entità html che è posizionata all'interno strings.xml. Perché XMLnon accetta direttamente entità Html o caratteri speciali. (Collega entità HTML)

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

4. Utilizzando String.format()

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

devi importare la classe String nel layout di questo 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. Un altro metodo

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

In questo caso, inserisci una risorsa stringa strings.xml

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

Ci possono essere molti altri modi, scegli quello che ti serve.


L'opzione 1 ha funzionato per me. L'opzione 4 non ha funzionato. Se hai un adattatore stretto, ti consiglio l'opzione 1.
rminaj

10

Poiché xml supporta virgolette singole per i valori di attributo, puoi anche fare questo:

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

7

Ci sono due modi.

Prima soluzione

concatenare con accento grave (`)

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

Seconda soluzione

Dichiara la tua stringa in strings.xml

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

amd use String.format(stringResource, upsatename);


So che funzionerebbe, ma voglio usare il modo
concatenato

23
È anche possibile utilizzare risorse stringa formattate nell'espressione:android:text="@{@string/hello(user.firstName)}"
George Mount

è% 1 $ s invece di% $ 1s ...;)
Rik van Velzen

6

In caso di stringa statica e altre dinamiche puoi usarla

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

In caso di dati dinamici puoi usarli.

android:text='@{user.firstName+" "+user.lastName}'

4

Per eseguire una concatenazione nel layout 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)}"

In strings.xml ho aggiunto il codice per lo spazio vuoto:

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

4

se vuoi concatenare la Stringrisorsa con i dati del tuo modello, puoi farlo in questo modo:

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

0

Il modo più semplice che ho trovato è sostituire "" (singolo) al posto di "" (doppio), ad es. Hai due variabili,

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

Ora per concatenare,

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

0

Probabilmente in ritardo alla festa: funzionerà anche il codice sottostante

android:text='@{@string/hello.concat(user.firstName)}'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.