Eu quero concat duas strings para um TextView no Android, Data Binding Api

94

Estou usando o DataBindingApi para definir as visualizações em layouts de Android. Aqui está meu 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>

Eu quero que o TextView exiba Hello UserName . Como fazer isso usando a API de vinculação de dados.

Sasank Sunkavalli
fonte

Respostas:

242

disfarçar com sotaque grave (`)

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

Você pode concatá-lo de várias maneiras, verifique aqui concat-two-strings-in-textview-using-databinding

Ravi
fonte
Sim, funcionou. Obrigado . Eu estava usando uma vírgula invertida ('). Sotaque grave (`) funcionou para mim.
Sasank Sunkavalli
@SasankSunkavalli fico feliz em ajudá-lo :), sempre use acentos graves para string ao usar DataBinding.
Ravi
1
Eu não entendo. No meu .xml, esse método, assim como quaisquer outros métodos desta página, não está nem perto de ser funcional. Tudo o que ele faz é imprimir como: @{Hello `+ user.firstName}`
ekashking
Este é o DataBinding?
IgorGanapolsky
71

Isso já foi respondido por @GeorgeMount em comentários a uma das soluções. Que para mim parece ser a melhor solução até agora aqui.

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

em seu strings.xml

<string name="location">%1$s, %2$s</string>
Prakash
fonte
ótimo! thnx wery
Serg Burlaka
isso é o que estou procurando :)
Edgar Khimich
48

Muitas maneiras de concat strings

1. Usando o recurso de string ( mais preferível devido à localização )

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

Apenas crie um recurso de string como este.

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

2. Concat codificado

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

3. Usando Stringo método concat de

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

Aqui spaceestá uma entidade html que é colocada dentro strings.xml. Porque XMLnão aceita entidades Html ou caracteres especiais diretamente. (Vincular entidades Html)

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

4. Usando String.format()

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

você tem que importar a classe String no layout deste 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. Outro método

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

Neste caso, coloque um recurso de string em strings.xml

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

Pode haver muitas outras maneiras, escolha a que você precisa.

Khemraj
fonte
A opção 1 funcionou para mim. A opção 4 não funcionou. Se você tiver um adaptador estreito, recomendo a Opção 1.
rminaj
10

Como o xml oferece suporte a aspas simples para valores de atributo, você também pode fazer isso:

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

Existem duas maneiras.

Primeira Solução

concat com sotaque grave (`)

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

Segunda Solução

Declare sua string em strings.xml

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

amd use String.format(stringResource, upsatename);

Yogesh Rathi
fonte
Eu sei que isso funcionaria, mas eu quero usar a forma concat
Sasank Sunkavalli
23
Você também pode usar recursos de string formatados na expressão:android:text="@{@string/hello(user.firstName)}"
George Mount
é% 1 $ s em vez de% $ 1s ...;)
Rik van Velzen
6

No caso de string estática e outra dinâmica, você pode usar este

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

No caso de dados dinâmicos, você pode usar isso.

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

Para fazer um concat no 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)}"

Em strings.xml, adicionei o código para o espaço em branco:

<string name="space">\u0020</string>
Pronto Android
fonte
4

se quiser concatenar o Stringrecurso com os dados do seu modelo, você pode fazer isso da seguinte maneira:

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

A maneira mais simples que descobri de ser é substituir '' (simples) no lugar de "" (duplo), por exemplo. Você tem duas variáveis,

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

Agora, para concatenar,

android:text='a + " " + b}'
Aziz
fonte
0

Provavelmente atrasado para a festa: o código abaixo também funcionará

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

madroid
fonte