Tôi muốn nối hai chuỗi cho TextView trong android, Data Binding Api


91

Tôi đang sử dụng DataBindingApi để thiết lập các chế độ xem trong bố cục android. Đây là cách bố trí của tôi.

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>

Tôi muốn TextView hiển thị Xin chào UserName . Làm thế nào để đạt được điều này bằng cách sử dụng api liên kết dữ liệu.

Câu trả lời:


234

nối nó với trọng âm (`)

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

Bạn có thể nối nó theo nhiều cách, hãy kiểm tra nó tại đây concat-hai-string-in-textview-using-databinding


Vâng, nó đã hoạt động. Cảm ơn . Tôi đã sử dụng dấu phẩy đảo ngược duy nhất ('). Dấu trọng âm (`) phù hợp với tôi.
Sasank Sunkavalli

@SasankSunkavalli rất vui khi được giúp đỡ bạn :), luôn sử dụng trọng âm cho chuỗi khi sử dụng DataBinding.
Ravi

1
Tôi không hiểu. Trên .xml của tôi, phương thức này, cũng như bất kỳ phương thức nào khác trên trang này, thậm chí không hoạt động. Tất cả những gì nó làm là in thành: @{Xin chào `+ user.firstName} '
ekashking

Đây là DataBinding?
IgorGanapolsky

68

Điều này đã được @GeorgeMount trả lời trong các nhận xét cho một trong những giải pháp. Với tôi, giải pháp nào tốt nhất cho đến nay ở đây.

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

trong string.xml của bạn

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

tuyệt quá! thnx wery
SERG Burlaka

thats những gì tôi đang tìm :)
Edgar Khimich

45

Nhiều cách để nối các chuỗi

1. Sử dụng tài nguyên chuỗi ( Thích hợp nhất vì bản địa hóa )

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

Chỉ cần tạo tài nguyên chuỗi như thế này.

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

2. concat mã hóa cứng

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

3. Sử dụng Stringphương thức concat của

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

Đây spacelà một thực thể html được đặt bên trong strings.xml. Bởi vì XMLkhông chấp nhận trực tiếp các thực thể Html hoặc các ký tự đặc biệt. (Liên kết các thực thể Html)

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

4. Sử dụng String.format()

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

bạn phải nhập lớp Chuỗi trong bố cục kiểu này.

<?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. Một phương pháp khác

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

Trong trường hợp này, hãy đặt một tài nguyên chuỗi vào strings.xml

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

Có thể có nhiều cách khác, hãy chọn một cách bạn cần.


Tùy chọn 1 đã làm việc cho tôi. Tùy chọn 4 không hoạt động. Nếu bạn có một bộ chuyển đổi hẹp, tôi khuyên bạn nên lựa chọn 1.
rminaj

10

Vì xml hỗ trợ các dấu ngoặc kép cho các giá trị của thuộc tính, bạn cũng có thể thực hiện việc này:

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

7

Có hai cách.

Giải pháp đầu tiên

nối với trọng âm (`)

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

Giải pháp thứ hai

Khai báo chuỗi của bạn trong strings.xml

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

sử dụng amd String.format(stringResource, upsatename);


Tôi biết điều này sẽ làm việc, Nhưng tôi muốn sử dụng cách concat
Sasank Sunkavalli

23
Bạn cũng có thể sử dụng tài nguyên chuỗi được định dạng trong biểu thức:android:text="@{@string/hello(user.firstName)}"
George Mount

nó% 1 $ s thay vì% $ 1s ...;)
Rik van Velzen

6

Trong trường hợp chuỗi tĩnh và chuỗi động khác, bạn có thể sử dụng

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

Trong trường hợp dữ liệu động, bạn có thể sử dụng điều này.

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

4

Để thực hiện một concat trong bố cục 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)}"

Trong string.xml, tôi đã thêm mã cho khoảng trống:

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

4

nếu bạn muốn kết hợp Stringtài nguyên với dữ liệu từ mô hình của mình, bạn có thể thực hiện theo cách sau:

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

0

Cách đơn giản nhất mà tôi thấy là thay thế '' (đơn) thay cho "" (kép), Ví dụ: Bạn có hai biến,

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

Bây giờ để nối,

android:text='a + " " + b}'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.