Я хочу поєднати два рядки для TextView в android, Data Binding Api


91

Я використовую DataBindingApi для налаштування подань у макетах Android. Ось мій макет.

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>

Я хочу, щоб TextView відображав Hello UserName . Як цього досягти за допомогою API прив'язки даних.

Відповіді:


233

сполучити його з серйозним акцентом (`)

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

Ви можете зв'язати його кількома способами, перевірте тут concat-two-strings-in-textview-using-databinding


Так, це спрацювало. Дякую . Я використовував одну перевернуту кому ('). Могильний акцент (`) спрацював у мене.
Сасанк Сункаваллі

@SasankSunkavalli радий вам допомогти :), завжди використовуйте серйозний наголос для рядка при використанні DataBinding.
Раві

1
Я не розумію. У моєму .xml цей метод, як і будь-які інші методи на цій сторінці, навіть не наближається до функціонального. Все, що він робить, друкує як: @{Привіт `+ user.firstName}`
ekashking

Це прив'язка даних?
ІгорГанапольський

68

На це вже відповідає @GeorgeMount у коментарях до одного з рішень. Яке для мене тут виглядає як найкраще рішення.

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

у вашому strings.xml

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

чудово! thnx wery
Серг Бурлака

ось що я шукаю :)
Едгар Хіміч

45

Багато способів об'єднати рядки

1. Використання рядкового ресурсу ( Найкраще через локалізацію )

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

Просто створіть такий рядок.

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

2. Твердокодований конкат

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

3. Використання Stringметоду concat

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

Ось spaceHTML-сутність, яка розміщена всередині strings.xml. Оскільки XMLне приймає Html-сутності або спеціальні символи безпосередньо. (Посилання на сутності HTML)

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

4. Використання String.format()

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

вам потрібно імпортувати клас String у макеті цього типу.

<?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. Інший метод

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

У цьому випадку додайте рядовий ресурс в strings.xml

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

Інших способів може бути багато, виберіть один, який вам потрібен.


Варіант 1 у мене спрацював. Варіант 4 не спрацював. Якщо у вас вузький адаптер, я рекомендую варіант 1.
rminaj

10

Оскільки xml підтримує одинарні лапки для значень атрибута, ви також можете зробити це:

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

7

Є два шляхи.

Перше рішення

конкат з могильним акцентом (`)

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

Друге рішення

Заявіть свій рядок у strings.xml

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

та використання String.format(stringResource, upsatename);


Я знаю, що це спрацює, але я хочу скористатися
конкататом

23
Ви також можете використовувати відформатовані рядкові ресурси у виразі:android:text="@{@string/hello(user.firstName)}"
Джордж Маунт

це% 1 $ s замість% $ 1s ...;)
Рік ван Вельцен

6

У випадку статичного рядка та іншої динаміки ви можете використовувати це

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

У випадку динамічних даних ви можете використовувати це.

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

4

Щоб зробити конкат у макеті 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)}"

У strings.xml я додав код для порожнього місця:

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

4

якщо ви хочете поєднати Stringресурс з даними вашої моделі, ви можете зробити це таким чином:

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

0

Найпростіший спосіб, який я виявив, - це замінити '' (одинарний) замість "" (подвійний), наприклад. У вас є дві змінні,

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

Тепер об'єднати,

android:text='a + " " + b}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.