Я хочу объединить две строки для TextView в android, Data Binding Api

94

Я использую DataBinding Api для настройки представлений в макетах 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 привязки данных.

Сасанк Сункавалли
источник

Ответы:

242

соедините это с серьезным ударением (`)

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

Вы можете объединить его несколькими способами, проверьте здесь concat-two-strings-in-textview-using-databinding

Рави
источник
Да, это сработало. Благодарю . Я использовал одиночную кавычку ('). У меня сработал серьезный ударение (`).
Сасанк Сункавалли,
@SasankSunkavalli рад вам помочь :), всегда используйте серьезный акцент для строки при использовании DataBinding.
Рави,
1
Я не понимаю. В моем .xml этот метод, как и любые другие методы на этой странице, даже близко не работает. Все, что он делает, это печатается как: @{Hello `+ user.firstName}`
ekashking
Это DataBinding?
IgorGanapolsky
71

На это уже ответил @GeorgeMount в комментариях к одному из решений. Что мне кажется здесь лучшим решением.

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

в вашем strings.xml

<string name="location">%1$s, %2$s</string>
Пракаш
источник
отличный! thnx wery
Серг Бурлака
вот что я ищу :)
Эдгар Химич
48

Множество способов объединения строк

1. Использование строкового ресурса ( наиболее предпочтительно из-за локализации )

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

Просто сделайте такой строковый ресурс.

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

2. Жестко запрограммированный concat

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}'
ArJ
источник
7

Есть два пути.

Первое решение

concat с серьезным ударением (`)

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

Второе решение

Объявите свою строку в strings.xml

нравится "Hello %1$s , (whatever you want to add then add here)".

и использование String.format(stringResource, upsatename);

Йогеш Рати
источник
Я знаю, что это сработает, но я хочу использовать метод
concat,
23
Вы также можете использовать форматированные строковые ресурсы в выражении:android:text="@{@string/hello(user.firstName)}"
Джордж Маунт,
это% 1 $ s вместо% $ 1s ...;)
Рик ван Велзен
6

В случае статической строки и других динамических вы можете использовать это

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

В случае динамических данных вы можете использовать это.

android:text='@{user.firstName+" "+user.lastName}'
Кишан верма
источник
4

Чтобы выполнить concat в макете 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>
Готовый Android
источник
4

если вы хотите объединить Stringресурс с данными из вашей модели, вы можете сделать это следующим образом:

 android:text='@{@string/release_date+model.release_date}'
Jackky777
источник
0

Самый простой способ, который я нашел, - это заменить «» (одинарный) вместо «» (двойной). Например. У вас есть две переменные,

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

Теперь, чтобы объединить,

android:text='a + " " + b}'
Азиз
источник
0

Вероятно, опоздал на вечеринку: приведенный ниже код также будет работать

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

мадроид
источник