ฉันต้องการเชื่อมต่อสองสตริงสำหรับ TextView ใน Android, Data Binding Api


94

ฉันใช้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 เพื่อแสดงสวัสดีชื่อผู้ใช้ วิธีบรรลุสิ่งนี้โดยใช้ API การผูกข้อมูล

คำตอบ:


242

ต่อด้วยสำเนียงที่รุนแรง (`)

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

คุณสามารถเชื่อมต่อได้หลายวิธีตรวจสอบได้ที่นี่concat-two-strings-in-textview-using-databinding


ใช่มันได้ผล ขอบคุณ. ฉันใช้จุลภาคกลับด้านเดียว (') Grave accent (`) ใช้ได้ผลกับฉัน
Sasank Sunkavalli

@SasankSunkavalli ยินดีที่จะช่วยคุณ :) ใช้สำเนียงที่รุนแรงสำหรับสตริงเมื่อใช้ DataBinding
ราวี

1
ฉันไม่เข้าใจ ใน. xml ของฉันวิธีนี้รวมถึงวิธีการอื่น ๆ ในหน้านี้ไม่ได้ใกล้เคียงกับการใช้งาน เพียงแค่พิมพ์เป็น: @{สวัสดี `+ 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
Serg Burlaka

นั่นคือสิ่งที่ฉันกำลังมองหา :)
Edgar Khimich

48

หลายวิธีในการต่อสตริง

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)}"

นี่spaceเป็นนิติบุคคล HTML 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);


ฉันรู้ว่ามันใช้ได้ แต่ฉันต้องการใช้วิธี concat
Sasank Sunkavalli

23
คุณยังสามารถใช้ทรัพยากรสตริงที่จัดรูปแบบได้ในนิพจน์:android:text="@{@string/hello(user.firstName)}"
George Mount

เป็น% 1 $ s แทนที่จะเป็น% $ 1s ... ;)
Rik van Velzen

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>

4

หากคุณต้องการเชื่อมStringทรัพยากรกับข้อมูลจากแบบจำลองของคุณคุณสามารถทำได้ด้วยวิธีดังต่อไปนี้:

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

0

วิธีที่ง่ายที่สุดที่ฉันพบคือแทนที่ '' (single) แทน "" (double) For Eg คุณมีสองตัวแปร

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

ตอนนี้เพื่อเชื่อมต่อ

android:text='a + " " + b}'

0

อาจจะสายไปงานปาร์ตี้: โค้ดด้านล่างนี้จะใช้งานได้เช่นกัน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.