Używam DataBinding
interfejsu 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.
android
android-layout
data-binding
android-databinding
Sasank Sunkavalli
źródło
źródło
@{
Hello `+ user.firstName}`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>
źródło
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
String
z metody concatandroid:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"
Oto
space
jednostka HTML, która jest umieszczona wewnątrzstrings.xml
. PonieważXML
nie 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.
źródło
Ponieważ XML obsługuje pojedyncze cudzysłowy dla wartości atrybutu, możesz również zrobić to:
android:text='@{"Hello "+user.firstName}'
źródło
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);
źródło
android:text="@{@string/hello(user.firstName)}"
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}'
źródło
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>
źródło
jeśli chcesz połączyć
String
zasób z danymi z Twojego modelu, możesz to zrobić w ten sposób:android:text='@{@string/release_date+model.release_date}'
źródło
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}'
źródło