Chcę połączyć dwa ciągi dla TextView w systemie Android, interfejs API wiązania danych

90

Używam DataBindinginterfejsu API do ustawiania widoków w układach Androida. Oto mój układ.

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>

Chcę, aby TextView wyświetlał Hello UserName . Jak to osiągnąć za pomocą interfejsu API powiązania danych.

Sasank Sunkavalli
źródło

Odpowiedzi:

233

konkretyzuje to słabym akcentem (`)

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

Możesz połączyć to na wiele sposobów, sprawdź tutaj concat-two-strings-in-textview-using-databinding

Ravi
źródło
Tak, zadziałało. Dzięki . Użyłem pojedynczego odwróconego przecinka ('). Akcent słaby (`) zadziałał dla mnie.
Sasank Sunkavalli
@SasankSunkavalli cieszę się, że mogę ci pomóc :), zawsze używaj akcentu słabo używanego podczas używania DataBinding.
Ravi
1
Nie rozumiem. W moim .xml ta metoda, podobnie jak inne metody na tej stronie, nie jest nawet bliska funkcjonalności. Wszystko, co robi, to wypisuje się jako: @{Hello `+ user.firstName}`
ekashking
To jest wiązanie danych?
Igor Ganapolsky
67

Na to już odpowiedział @GeorgeMount w komentarzach do jednego z rozwiązań. Co wydaje mi się tutaj najlepszym rozwiązaniem do tej pory.

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

w twoim strings.xml

<string name="location">%1$s, %2$s</string>
Prakash
źródło
świetny! thnx wery
Serg Burlaka
tego właśnie szukam :)
Edgar Khimich
45

Wiele sposobów łączenia ciągów

1. Korzystanie z zasobu ciągu ( preferowane ze względu na lokalizację )

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

Po prostu utwórz zasób ciągów w ten sposób.

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

2. Concat zakodowany na stałe

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

3. Korzystanie Stringz metody concat

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

Oto spacejednostka HTML, która jest umieszczona wewnątrz strings.xml. Ponieważ XMLnie akceptuje bezpośrednio jednostek HTML ani znaków specjalnych. (Połącz jednostki HTML)

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

4. Korzystanie String.format()

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

musisz zaimportować klasę String w układzie tego typu.

<?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. Inna metoda

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

W tym przypadku wstaw zasób ciągu strings.xml

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

Istnieje wiele innych sposobów, wybierz ten, którego potrzebujesz.

Khemraj
źródło
Opcja 1 zadziałała dla mnie. Opcja 4 nie zadziałała. Jeśli masz wąską przejściówkę, polecam opcję 1.
rminaj
10

Ponieważ XML obsługuje pojedyncze cudzysłowy dla wartości atrybutu, możesz również zrobić to:

android:text='@{"Hello "+user.firstName}'
ArJ
źródło
7

Istnieją dwa sposoby.

Pierwsze rozwiązanie

concat z słabym akcentem (`)

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

Drugie rozwiązanie

Zadeklaruj swój ciąg w strings.xml

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

amd use String.format(stringResource, upsatename);

Yogesh Rathi
źródło
Wiem, że to zadziała, ale chcę użyć sposobu
konkatowania
23
Możesz także użyć sformatowanych zasobów w postaci ciągów w wyrażeniu:android:text="@{@string/hello(user.firstName)}"
George Mount
to% 1 $ s zamiast% $ 1s ...;)
Rik van Velzen
6

W przypadku ciągów statycznych i innych dynamicznych możesz tego użyć

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

W przypadku danych dynamicznych możesz tego użyć.

android:text='@{user.firstName+" "+user.lastName}'
kishan verma
źródło
4

Aby wykonać konkatację w układzie 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)}"

W strings.xml dodałem kod spacji:

<string name="space">\u0020</string>
Gotowy Android
źródło
4

jeśli chcesz połączyć Stringzasób z danymi z Twojego modelu, możesz to zrobić w ten sposób:

 android:text='@{@string/release_date+model.release_date}'
Jackky777
źródło
0

Najprostszym sposobem, jaki znalazłem, jest zastąpienie „” (pojedyncza) w miejsce „” (podwójna), np. Masz dwie zmienne,

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

A teraz do konkatenacji,

android:text='a + " " + b}'
Aziz
źródło