ภาษานิพจน์ช่วยให้คุณเขียนนิพจน์ที่จัดการเหตุการณ์ที่ส่งไป ตามจำนวนการดู ไลบรารีการเชื่อมโยงข้อมูลจะสร้างคลาสที่จำเป็นโดยอัตโนมัติ เพื่อเชื่อมโยงมุมมองในเลย์เอาต์กับออบเจ็กต์ข้อมูล
ไฟล์เลย์เอาต์การเชื่อมโยงข้อมูลจะแตกต่างกันเล็กน้อยและเริ่มต้นด้วยแท็กรากของ
layout
ตามด้วยองค์ประกอบ data
และราก view
มุมมองนี้
คือสิ่งที่รากของคุณอยู่ในไฟล์เลย์เอาต์ที่ไม่มีการเชื่อมโยง รหัสต่อไปนี้
แสดงตัวอย่างไฟล์เลย์เอาต์
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.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="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
ตัวแปร user
ภายใน data
อธิบายพร็อพเพอร์ตี้ที่ใช้งานภายในได้
เลย์เอาต์นี้:
<variable name="user" type="com.example.User" />
นิพจน์ภายในเลย์เอาต์จะเขียนในคุณสมบัติของแอตทริบิวต์โดยใช้
ไวยากรณ์ @{}
ในตัวอย่างต่อไปนี้ พารามิเตอร์
ตั้งค่าข้อความ TextView
เป็น
พร็อพเพอร์ตี้ firstName
ของตัวแปร user
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
ออบเจ็กต์ข้อมูล
สมมติว่าคุณมีออบเจ็กต์ธรรมดาที่ใช้อธิบายเอนทิตี User
:
Kotlin
data class User(val firstName: String, val lastName: String)
Java
public class User { public final String firstName; public final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }
ออบเจ็กต์ประเภทนี้มีข้อมูลที่ไม่เคยเปลี่ยนแปลง เป็นเรื่องปกติในแอปที่ ข้อมูลที่อ่านเพียงครั้งเดียวและไม่มีการเปลี่ยนแปลงหลังจากนั้น นอกจากนี้คุณยังสามารถใช้ วัตถุที่เป็นไปตามชุดข้อตกลง เช่น การใช้เมธอดตัวเข้าถึงใน ภาษาการเขียนโปรแกรม Java ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
// Not applicable in Kotlin. data class User(val firstName: String, val lastName: String)
Java
public class User { private final String firstName; private final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } }
จากมุมมองของการเชื่อมโยงข้อมูล คลาสทั้งสองนี้เทียบเท่ากัน
นิพจน์ @{user.firstName}
ที่ใช้สำหรับ
android:text
เข้าถึงฟิลด์ firstName
ในคลาสเดิมและ
getFirstName()
ในคลาสหลัง และยังเป็น
firstName()
หากมีวิธีการดังกล่าว
การเชื่อมโยงข้อมูล
ระบบจะสร้างคลาสการเชื่อมโยงสำหรับไฟล์เลย์เอาต์แต่ละไฟล์ โดยค่าเริ่มต้น ชื่อของ
จะอิงตามชื่อไฟล์เลย์เอาต์ที่แปลงเป็นตัวพิมพ์เล็ก/ใหญ่แบบ Pascal
จะมีการเพิ่มคำต่อท้ายการเชื่อมโยงไว้ ตัวอย่างเช่น ชื่อไฟล์ของเลย์เอาต์ก่อนหน้าคือ
activity_main.xml
ดังนั้นคลาสการเชื่อมโยงที่สร้างขึ้นที่เกี่ยวข้องคือ
ActivityMainBinding
คลาสนี้จะมีการเชื่อมโยงทั้งหมดจากพร็อพเพอร์ตี้ของเลย์เอาต์ ตัวอย่างเช่น
ตัวแปร user
ให้แก่มุมมองของเลย์เอาต์และรู้วิธีกำหนดค่า
สำหรับนิพจน์การเชื่อมโยง เราขอแนะนำให้สร้างการเชื่อมโยงขณะขยายขนาด
เลย์เอาต์ ดังที่ปรากฏในตัวอย่างต่อไปนี้
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityMainBinding = DataBindingUtil.setContentView( this, R.layout.activity_main) binding.user = User("Test", "User") }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User("Test", "User"); binding.setUser(user); }
ขณะรันไทม์ แอปจะแสดงผู้ใช้ทดสอบใน UI อีกวิธีหนึ่งคือ
รับมุมมองโดยใช้
LayoutInflater
ดังที่แสดงใน
ตัวอย่างต่อไปนี้
Kotlin
val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())
Java
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
หากคุณกำลังใช้รายการการเชื่อมโยงข้อมูลภายใน
Fragment
ListView
หรือ
RecyclerView
คุณควรใช้อะแดปเตอร์
inflate()
ของคลาสการเชื่อมโยงหรือ
DataBindingUtil
ชั้นเรียนแบบ
ที่แสดงในตัวอย่างโค้ดต่อไปนี้
Kotlin
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Java
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); // or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
ภาษานิพจน์
ฟีเจอร์ทั่วไป
ภาษานิพจน์มีลักษณะคล้ายกับนิพจน์ที่พบในโค้ดที่มีการจัดการ คุณ สามารถใช้โอเปอเรเตอร์และคีย์เวิร์ดต่อไปนี้ในภาษานิพจน์
- คณิตศาสตร์:
+ - / * %
- การต่อสตริง:
+
- ตรรกะ:
&& ||
- ไบนารี:
& | ^
- ค่าเดี่ยว:
+ - ! ~
- Shift:
>> >>> <<
- การเปรียบเทียบ:
== > < >= <=
(ต้อง Escape<
เป็น<
) instanceof
- การจัดกลุ่ม:
()
- ลิเทอรัล เช่น อักขระ สตริง ตัวเลข
null
- แคสต์
- การเรียกเมธอด
- สิทธิ์เข้าถึงช่อง
- การเข้าถึงอาร์เรย์:
[]
- โอเปอเรเตอร์สามส่วน:
?:
ตัวอย่างเช่น
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
การดำเนินการที่ขาดหายไป
การดำเนินการต่อไปนี้หายไปจากไวยากรณ์นิพจน์ที่คุณใช้ได้ ในโค้ดที่มีการจัดการ
this
super
new
- การเรียกใช้ทั่วไปที่อาจไม่เหมาะสม
โอเปอเรเตอร์การรวมศูนย์
โอเปอเรเตอร์การรวมค่าว่าง (??
) เลือกตัวถูกดำเนินการด้านซ้ายหากไม่ใช่ null
หรือทางขวาหากอันแรกคือ null
android:text="@{user.displayName ?? user.lastName}"
ซึ่งมีฟังก์ชันการทำงานเทียบเท่ากับรายการต่อไปนี้
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
การอ้างอิงพร็อพเพอร์ตี้
นิพจน์สามารถอ้างอิงพร็อพเพอร์ตี้ในคลาสได้โดยใช้รูปแบบต่อไปนี้
ซึ่งจะเหมือนกันสำหรับฟิลด์, Getters และ
ObservableField
ออบเจ็กต์มีดังนี้
android:text="@{user.lastName}"
หลีกเลี่ยงข้อยกเว้นตัวชี้ Null
โค้ดการเชื่อมโยงข้อมูลที่สร้างขึ้นจะตรวจสอบค่า null
โดยอัตโนมัติและหลีกเลี่ยง
ข้อยกเว้นตัวชี้ค่าว่าง ตัวอย่างเช่น ในนิพจน์ @{user.name}
หาก
user
เป็นค่าว่าง user.name
มีการกำหนดค่าเริ่มต้นเป็น null
หากคุณ
อ้างอิง user.age
โดยที่อายุอยู่ในประเภท int
การเชื่อมโยงข้อมูลจะใช้เมธอด
ค่าเริ่มต้นคือ 0
ดูข้อมูลอ้างอิง
นิพจน์สามารถอ้างอิงมุมมองอื่นๆ ในเลย์เอาต์ได้ด้วยรหัส โดยใช้ข้อมูลต่อไปนี้ ไวยากรณ์:
android:text="@{exampleText.text}"
ในตัวอย่างต่อไปนี้ ข้อมูลพร็อพเพอร์ตี้ TextView
อ้างอิงข้อมูลพร็อพเพอร์ตี้ EditText
ใน
โดยใช้เลย์เอาต์เดียวกัน
<EditText
android:id="@+id/example_text"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
<TextView
android:id="@+id/example_output"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{exampleText.text}"/>
คอลเล็กชัน
คุณสามารถเข้าถึงคอลเล็กชันทั่วไป เช่น อาร์เรย์ รายการ รายการแบบกระจัดกระจาย และ
แผนที่ โดยใช้โอเปอเรเตอร์ []
เพื่อความสะดวก
<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<String, String>"/>
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>
...
android:text="@{list[index]}"
...
android:text="@{sparse[index]}"
...
android:text="@{map[key]}"
คุณยังสามารถอ้างอิงค่าในแผนที่โดยใช้สัญลักษณ์ object.key
ได้ด้วย สำหรับ
ตัวอย่างเช่น คุณสามารถแทนที่ @{map[key]}
ในตัวอย่างก่อนหน้านี้ด้วย
@{map.key}
ลิเทอรัลสตริง
คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวล้อมรอบค่าแอตทริบิวต์ ซึ่งทำให้สามารถใช้ เครื่องหมายอัญประกาศคู่ในนิพจน์ ดังที่ปรากฏในตัวอย่างต่อไปนี้
android:text='@{map["firstName"]}'
นอกจากนี้ คุณยังใช้เครื่องหมายคำพูดคู่ล้อมรอบค่าแอตทริบิวต์ได้ด้วย เมื่อดำเนินการดังกล่าว
ลิเทอรัลสตริงต้องล้อมรอบด้วยเครื่องหมายแบ็กทิก `
ดังที่แสดง
ที่นี่:
android:text="@{map[`firstName`]}"
แหล่งข้อมูล
นิพจน์สามารถอ้างอิงทรัพยากรของแอปด้วยไวยากรณ์ต่อไปนี้
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
คุณสามารถประเมินสตริงรูปแบบและพหูพจน์ได้โดยการระบุพารามิเตอร์:
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
คุณสามารถส่งผ่านการอ้างอิงพร็อพเพอร์ตี้และข้อมูลพร็อพเพอร์ตี้ การอ้างอิง เป็นพารามิเตอร์ทรัพยากร:
android:text="@{@string/example_resource(user.lastName, exampleText.text)}"
เมื่อรูปพหูพจน์มีหลายพารามิเตอร์ ให้ส่งผ่านพารามิเตอร์ทั้งหมดดังนี้
Have an orange
Have %d oranges
android:text="@{@plurals/orange(orangeCount, orangeCount)}"
ทรัพยากรบางรายการต้องมีการประเมินประเภทที่ชัดเจน ดังที่แสดงใน ตาราง:
ประเภท | การอ้างอิงปกติ | การอ้างอิงนิพจน์ |
---|---|---|
String[] |
@array |
@stringArray |
int[] |
@array |
@intArray |
TypedArray |
@array |
@typedArray |
Animator |
@animator |
@animator |
StateListAnimator |
@animator |
@stateListAnimator |
color int |
@color |
@color |
ColorStateList |
@color |
@colorStateList |
การจัดการเหตุการณ์
การเชื่อมโยงข้อมูลช่วยให้คุณเขียนเหตุการณ์การจัดการนิพจน์ที่ส่งจาก
ยอดดู เช่น
onClick()
ชื่อแอตทริบิวต์เหตุการณ์จะกำหนดโดยชื่อของเมธอด Listener
โดยมีข้อยกเว้นบางประการ ตัวอย่างเช่น
View.OnClickListener
มี
เมธอด onClick()
ดังนั้นแอตทริบิวต์สำหรับเหตุการณ์นี้จึงเป็น android:onClick
มีเครื่องจัดการเหตุการณ์พิเศษบางอย่างสำหรับเหตุการณ์การคลิกที่ต้องใช้แอตทริบิวต์
แอตทริบิวต์อื่นที่ไม่ใช่ android:onClick
เพื่อหลีกเลี่ยงข้อขัดแย้ง คุณสามารถใช้
ดังต่อไปนี้เพื่อหลีกเลี่ยงข้อขัดแย้งประเภทนี้
ชั้น | ตัวตั้งค่า Listener | แอตทริบิวต์ |
---|---|---|
SearchView |
setOnSearchClickListener(View.OnClickListener) |
android:onSearchClick |
ZoomControls |
setOnZoomInClickListener(View.OnClickListener) |
android:onZoomIn |
ZoomControls |
setOnZoomOutClickListener(View.OnClickListener) |
android:onZoomOut |
คุณสามารถใช้กลไก 2 ตัวนี้ได้ ซึ่งอธิบายไว้โดยละเอียดในส่วนที่ จัดการเหตุการณ์โดยทำดังนี้
- การอ้างอิงเมธอด: ในนิพจน์ คุณสามารถ
วิธีการอ้างอิงที่สอดคล้องกับลายเซ็นของเมธอด Listener วันและเวลา
นิพจน์จะประเมินการอ้างอิงเมธอด การเชื่อมโยงข้อมูลจะรวมเมธอด
การอ้างอิงและออบเจ็กต์เจ้าของใน Listener และกำหนด Listener นั้นในฟังก์ชัน
มุมมองเป้าหมาย หากนิพจน์ประเมินเป็น
null
การเชื่อมโยงข้อมูลจะไม่ สร้าง Listener และตั้งค่า Listenernull
แทน - การเชื่อมโยง Listener: นิพจน์เหล่านี้คือนิพจน์แลมบ์ดาที่ จะได้รับการประเมินเมื่อเกิดเหตุการณ์ขึ้น การเชื่อมโยงข้อมูลจะสร้าง Listener ซึ่งตั้งค่าไว้ในมุมมอง เมื่อมีการส่งเหตุการณ์ พารามิเตอร์ Listener จะประเมินนิพจน์แลมบ์ดา
การอ้างอิงเมธอด
คุณสามารถเชื่อมโยงเหตุการณ์กับเมธอดเครื่องจัดการได้โดยตรง ซึ่งคล้ายกับวิธีที่คุณทำได้
กำหนด
android:onClick
เป็น
ในกิจกรรม ข้อได้เปรียบหนึ่งข้อเทียบกับ
View
onClick
แอตทริบิวต์คือ
นิพจน์จะถูกประมวลผลในเวลาคอมไพล์ ดังนั้น ถ้าไม่พบเมธอดหรือ
ลายเซ็นไม่ถูกต้อง คุณได้รับข้อผิดพลาดเกี่ยวกับเวลาคอมไพล์
ความแตกต่างสำคัญระหว่างการอ้างอิงเมธอดและการเชื่อมโยงผู้ฟังคือ การติดตั้งใช้งาน Listener จริงจะสร้างขึ้นเมื่อมีการเชื่อมโยงข้อมูล ไม่ใช่เมื่อมีการเชื่อมโยง ทริกเกอร์เหตุการณ์ หากต้องการประเมินนิพจน์เมื่อเหตุการณ์ ให้ใช้การเชื่อมโยงผู้ฟัง
หากต้องการกำหนดเหตุการณ์ให้กับเครื่องจัดการ ให้ใช้นิพจน์การเชื่อมโยงปกติที่มีพารามิเตอร์ ซึ่งเป็นชื่อเมธอดในการเรียก ตัวอย่างเช่น ลองพิจารณาตัวอย่างต่อไปนี้ ออบเจ็กต์ข้อมูลเลย์เอาต์:
Kotlin
class MyHandlers { fun onClickFriend(view: View) { ... } }
Java
public class MyHandlers { public void onClickFriend(View view) { ... } }
นิพจน์การเชื่อมโยงสามารถกำหนด Listener การคลิกสำหรับมุมมองให้กับฟังก์ชัน
onClickFriend()
ดังนี้
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.MyHandlers"/>
<variable name="user" type="com.example.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="@{user.firstName}"
android:onClick="@{handlers::onClickFriend}"/>
</LinearLayout>
</layout>
การผูก Listener
การเชื่อมโยง Listener เป็นนิพจน์การเชื่อมโยงที่เรียกใช้เมื่อเหตุการณ์เกิดขึ้น โฆษณาเหล่านี้ คล้ายกับการอ้างอิงเมธอด แต่จะให้คุณเรียกใช้การเชื่อมโยงข้อมูลที่กำหนดเอง นิพจน์ ฟีเจอร์นี้ใช้ได้กับปลั๊กอิน Android Gradle สำหรับ Gradle เวอร์ชัน 2.0 ขึ้นไป
ในการอ้างอิงเมธอด พารามิเตอร์ของเมธอดจะต้องตรงกับพารามิเตอร์ของ
Listener เหตุการณ์ ในการเชื่อมโยง Listener เฉพาะค่าผลลัพธ์เท่านั้นที่ต้องตรงกับ
ผลลัพธ์ที่คาดไว้ของผู้ฟัง เว้นแต่ว่าจะคาดหวัง void
สำหรับ
ลองพิจารณาชั้นเรียนผู้นำเสนอต่อไปนี้ที่มี onSaveClick()
วิธีการ:
Kotlin
class Presenter { fun onSaveClick(task: Task){} }
Java
public class Presenter { public void onSaveClick(Task task){} }
คุณสามารถเชื่อมโยงกิจกรรมการคลิกกับเมธอด onSaveClick()
ได้ดังนี้
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="task" type="com.android.example.Task" />
<variable name="presenter" type="com.android.example.Presenter" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> presenter.onSaveClick(task)}" />
</LinearLayout>
</layout>
เมื่อมีการใช้ Callback ในนิพจน์ การเชื่อมโยงข้อมูลจะสร้างฟังก์ชัน Listener ที่จำเป็นและลงทะเบียนสำหรับกิจกรรมนั้น เมื่อมุมมองเริ่มทำงาน เหตุการณ์ การเชื่อมโยงข้อมูลจะประเมินนิพจน์ที่ระบุ เช่นเดียวกับการเชื่อมโยงปกติ นิพจน์ คุณจะได้รับความปลอดภัยแบบ Null และเทรดของการผูกข้อมูล ก็กำลังประเมินนิพจน์ของผู้ฟังอยู่
ในตัวอย่างก่อนหน้านี้ พารามิเตอร์ view
ที่ส่งไปยัง onClick(View)
ไม่ได้กำหนดไว้ การเชื่อมโยงผู้ฟังมี 2 ทางเลือกสำหรับพารามิเตอร์ Listener ได้แก่
คุณสามารถเพิกเฉยต่อพารามิเตอร์ทั้งหมดในเมธอดหรือตั้งชื่อพารามิเตอร์ทั้งหมดก็ได้ หากต้องการ
เพื่อตั้งชื่อพารามิเตอร์ คุณสามารถใช้พารามิเตอร์ในนิพจน์ได้ ตัวอย่างเช่น คุณสามารถ
สามารถเขียนนิพจน์ที่อยู่ก่อนหน้าดังนี้
android:onClick="@{(view) -> presenter.onSaveClick(task)}"
หากต้องการใช้พารามิเตอร์ในนิพจน์ ให้ทําดังนี้
Kotlin
class Presenter { fun onSaveClick(view: View, task: Task){} }
Java
public class Presenter { public void onSaveClick(View view, Task task){} }
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"
และคุณใช้นิพจน์ lambda ที่มีมากกว่า 1 พารามิเตอร์ได้ ดังนี้
Kotlin
class Presenter { fun onCompletedChanged(task: Task, completed: Boolean){} }
Java
public class Presenter { public void onCompletedChanged(Task task, boolean completed){} }
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />
หากเหตุการณ์ที่คุณกำลังฟังแสดงค่าที่ไม่ใช่ void
ค่า
นิพจน์จะต้องแสดงผลค่าประเภทเดียวกันด้วย ตัวอย่างเช่น ถ้าคุณต้องการ
เพื่อฟังการสัมผัสและ Hold (คลิกยาว) นิพจน์จะต้องแสดงผลเป็น
บูลีน
Kotlin
class Presenter { fun onLongClick(view: View, task: Task): Boolean { } }
Java
public class Presenter { public boolean onLongClick(View view, Task task) { } }
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"
หากประเมินนิพจน์ไม่ได้เนื่องจากออบเจ็กต์ null
รายการ การเชื่อมโยงข้อมูลจะแสดงผล
ค่าเริ่มต้นสำหรับประเภทนั้นๆ เช่น null
สำหรับประเภทการอ้างอิง 0
สำหรับ
int
หรือ false
ในราคา boolean
หากต้องการใช้นิพจน์ที่มีภาคแสดง เช่น
สามส่วน คุณสามารถใช้ void
เป็นสัญลักษณ์ได้ ดังนี้
android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
หลีกเลี่ยงผู้ฟังที่ซับซ้อน
นิพจน์ของผู้ฟังมีประสิทธิภาพและทำให้โค้ดอ่านง่ายขึ้น ใน ในทางกลับกัน ผู้ฟังที่มีสีหน้าที่ซับซ้อนจะทำให้เลย์เอาต์ของคุณยากขึ้น ในการอ่านและดูแลรักษา ทำให้นิพจน์ของคุณเรียบง่ายด้วยการส่งข้อมูลที่มี จาก UI ไปยังเมธอด Callback ใช้ตรรกะทางธุรกิจภายใน เมธอด Callback ที่คุณเรียกใช้จากนิพจน์ Listener
การนําเข้า ตัวแปร และรวมถึง
ไลบรารีการเชื่อมโยงข้อมูลมีฟีเจอร์ต่างๆ เช่น การนำเข้า ตัวแปร และ ซึ่งรวมถึง การนำเข้าจะทำให้ดูชั้นเรียนอ้างอิงได้ง่ายภายในไฟล์เลย์เอาต์ของคุณ ตัวแปรช่วยให้คุณอธิบายพร็อพเพอร์ตี้ที่ใช้ในนิพจน์การเชื่อมโยงได้ รวมถึงช่วยให้คุณใช้เลย์เอาต์ที่ซับซ้อนในแอปของคุณได้
การนำเข้า
การนำเข้าช่วยให้คุณอ้างอิงคลาสภายในไฟล์เลย์เอาต์ได้ เช่น ในโค้ดที่มีการจัดการ
คุณจะใช้องค์ประกอบ import
ภายในองค์ประกอบ data
จำนวน 0 รายการขึ้นไปได้
ตัวอย่างโค้ดต่อไปนี้นำเข้าคลาส View
ไปยังไฟล์เลย์เอาต์
<data>
<import type="android.view.View"/>
</data>
การนำเข้าคลาส View
จะช่วยให้คุณอ้างอิงคลาสจากนิพจน์การเชื่อมโยงได้
ตัวอย่างต่อไปนี้แสดงวิธีอ้างอิงแอตทริบิวต์
VISIBLE
และ
ค่าคงที่ GONE
ของคลาส View
:
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
พิมพ์ชื่อแทน
เมื่อมีชื่อชั้นเรียนที่ขัดแย้งกัน คุณสามารถเปลี่ยนชื่อชั้นเรียนหนึ่งเป็น
ชื่อแทน ตัวอย่างต่อไปนี้เปลี่ยนชื่อคลาส View
ใน
แพ็กเกจ com.example.real.estate
ไปยัง Vista
:
<import type="android.view.View"/>
<import type="com.example.real.estate.View"
alias="Vista"/>
จากนั้น คุณสามารถใช้ Vista
เพื่ออ้างอิง com.example.real.estate.View
และ View
เพื่ออ้างอิง android.view.View
ภายในไฟล์เลย์เอาต์
นำเข้าชั้นเรียนอื่น
คุณสามารถใช้ประเภทที่นำเข้าเป็นการอ้างอิงประเภทในตัวแปรและนิพจน์ได้
ตัวอย่างต่อไปนี้แสดง User
และ List
ที่ใช้เป็นประเภทของตัวแปร
<data>
<import type="com.example.User"/>
<import type="java.util.List"/>
<variable name="user" type="User"/>
<variable name="userList" type="List<User>"/>
</data>
คุณใช้ประเภทที่นำเข้าเพื่อแคสต์ส่วนของนิพจน์ได้ ดังต่อไปนี้
ตัวอย่าง แคสต์พร็อพเพอร์ตี้ connection
เป็นประเภท User
ดังนี้
<TextView
android:text="@{((User)(user.connection)).lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
คุณยังสามารถใช้ประเภทที่นำเข้าเมื่ออ้างอิงฟิลด์และวิธีการแบบคงที่ใน
นิพจน์ โค้ดต่อไปนี้จะนำเข้าคลาส MyStringUtils
และการอ้างอิง
เมธอด capitalize
:
<data>
<import type="com.example.MyStringUtils"/>
<variable name="user" type="com.example.User"/>
</data>
…
<TextView
android:text="@{MyStringUtils.capitalize(user.lastName)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ระบบจะนำเข้า java.lang.*
โดยอัตโนมัติเช่นเดียวกับในโค้ดที่มีการจัดการ
ตัวแปร
คุณใช้องค์ประกอบ variable
หลายรายการภายในองค์ประกอบ data
ได้ ชิ้น
องค์ประกอบ variable
อธิบายพร็อพเพอร์ตี้ที่ตั้งค่าในเลย์เอาต์ที่จะใช้ได้
ในการเชื่อมโยงนิพจน์ภายในไฟล์เค้าโครง ตัวอย่างต่อไปนี้แจ้งว่า
ตัวแปร user
, image
และ note
<data>
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
</data>
ระบบจะตรวจสอบประเภทตัวแปรในเวลาคอมไพล์ ดังนั้นหากตัวแปรใช้
Observable
หรือเป็น
คอลเล็กชันที่สังเกตได้
ที่ต้องแสดงให้เห็นในประเภท หากตัวแปรเป็นคลาสพื้นฐานหรืออินเทอร์เฟซ
ที่ไม่ได้ใช้อินเทอร์เฟซ Observable
ตัวแปรจะไม่
สังเกตการณ์แล้ว
เมื่อมีไฟล์เลย์เอาต์ที่แตกต่างกันสำหรับการกำหนดค่าต่างๆ (เช่น แนวนอนหรือแนวตั้ง) ระบบจะรวมตัวแปรเข้าด้วยกัน ต้องไม่มี คำจำกัดความของตัวแปรที่ขัดแย้งกันระหว่างไฟล์เลย์เอาต์เหล่านี้
คลาสการเชื่อมโยงที่สร้างขึ้นมีตัวตั้งค่าและ Getter สำหรับแต่ละรายการที่อธิบาย
ตัวแปร ตัวแปรจะใช้ค่าโค้ดที่มีการจัดการเริ่มต้นจนกว่าตัวตั้งค่า
เรียกว่า — null
สำหรับประเภทการอ้างอิง, 0
สำหรับ int
, false
สำหรับ
boolean
ฯลฯ
ระบบสร้างตัวแปรพิเศษชื่อ context
เพื่อใช้ในนิพจน์การเชื่อมโยง
ตามความจำเป็น ค่าของ context
คือค่า
Context
จากมุมมองราก
getContext()
การประกาศตัวแปรอย่างชัดแจ้งกับตัวแปร context
ถูกลบล้าง
ชื่อ
รวม
คุณสามารถส่งผ่านตัวแปรไปยังการเชื่อมโยงของการออกแบบที่รวมจาก
โดยใช้เนมสเปซของแอปและชื่อตัวแปรในแอตทริบิวต์
ตัวอย่างต่อไปนี้แสดงตัวแปร user
ที่รวมอยู่จาก name.xml
และ
contact.xml
ไฟล์การออกแบบ:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</LinearLayout>
</layout>
การเชื่อมโยงข้อมูลไม่รองรับการรวมเป็นหน่วยย่อยโดยตรงขององค์ประกอบการผสาน ระบบไม่รองรับเลย์เอาต์ต่อไปนี้ดังตัวอย่างต่อไปนี้
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<merge><!-- Doesn't work -->
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</merge>
</layout>
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมโยงข้อมูลได้ในแหล่งข้อมูลเพิ่มเติมต่อไปนี้