หลักพื้นฐานของ Android Kotlin 02.4: ข้อมูลเบื้องต้นเกี่ยวกับการเชื่อมโยงข้อมูล

Codelab นี้เป็นส่วนหนึ่งของหลักสูตรหลักพื้นฐานของ Android Kotlin คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้หากทำตาม Codelab ตามลำดับ Codelab ของหลักสูตรทั้งหมดแสดงอยู่ในหน้า Landing Page ของ Codelab หลักพื้นฐานของ Android Kotlin

บทนำ

ใน Codelab ก่อนหน้าของหลักสูตรนี้ คุณใช้ฟังก์ชัน findViewById() เพื่อรับการอ้างอิงไปยังมุมมอง เมื่อแอปมีลำดับชั้นของ View ที่ซับซ้อน findViewById() จะมีค่าใช้จ่ายสูงและทำให้แอปช้าลง เนื่องจาก Android จะข้ามลำดับชั้นของ View โดยเริ่มจากรูทจนกว่าจะพบ View ที่ต้องการ โชคดีที่ยังมีวิธีที่ดีกว่า

หากต้องการตั้งค่าข้อมูลในมุมมอง คุณได้ใช้ทรัพยากรสตริงและตั้งค่าข้อมูลจากกิจกรรม การที่มุมมองทราบเกี่ยวกับข้อมูลจะทำให้มีประสิทธิภาพมากขึ้น และโชคดีที่ทำได้

ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีใช้การเชื่อมโยงข้อมูลเพื่อไม่จำเป็นต้องใช้ findViewById() นอกจากนี้ คุณยังได้เรียนรู้วิธีใช้การเชื่อมโยงข้อมูลเพื่อเข้าถึงข้อมูลจากมุมมองโดยตรงด้วย

สิ่งที่คุณควรทราบอยู่แล้ว

คุณควรคุ้นเคยกับสิ่งต่อไปนี้

  • กิจกรรมคืออะไร และวิธีตั้งค่ากิจกรรมที่มีเลย์เอาต์ใน onCreate()
  • การสร้างมุมมองข้อความและการตั้งค่าข้อความที่มุมมองข้อความแสดง
  • ใช้ findViewById() เพื่อรับการอ้างอิงไปยังมุมมอง
  • การสร้างและแก้ไขเลย์เอาต์ XML พื้นฐานสำหรับมุมมอง

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้ Data Binding Library เพื่อหลีกเลี่ยงการเรียกใช้ findViewById() ที่ไม่มีประสิทธิภาพ
  • วิธีเข้าถึงข้อมูลแอปจาก XML โดยตรง

สิ่งที่คุณต้องดำเนินการ

  • แก้ไขแอปให้ใช้การเชื่อมโยงข้อมูลแทน findViewById() และเข้าถึงข้อมูลจากไฟล์ XML ของเลย์เอาต์โดยตรง

ใน Codelab นี้ คุณจะเริ่มต้นด้วยแอป AboutMe และเปลี่ยนแอปให้ใช้ Data Binding แอปจะมีลักษณะเหมือนเดิมทุกประการเมื่อคุณดำเนินการเสร็จสิ้น

สิ่งที่แอป AboutMe ทำได้มีดังนี้

  • เมื่อผู้ใช้เปิดแอป แอปจะแสดงชื่อ ช่องสำหรับป้อนชื่อเล่น ปุ่มเสร็จสิ้น รูปดาว และข้อความที่เลื่อนได้
  • ผู้ใช้สามารถป้อนชื่อเล่นแล้วแตะปุ่มเสร็จสิ้น ระบบจะแทนที่ช่องและปุ่มที่แก้ไขได้ด้วยมุมมองข้อความที่แสดงชื่อเล่นที่ป้อน


คุณสามารถใช้โค้ดที่สร้างใน Codelab ก่อนหน้า หรือดาวน์โหลดโค้ด AboutMeDataBinding-Starter จาก GitHub ก็ได้

โค้ดที่คุณเขียนใน Codelab ก่อนหน้านี้ใช้ฟังก์ชัน findViewById() เพื่อรับการอ้างอิงไปยังมุมมอง

ทุกครั้งที่คุณใช้ findViewById() เพื่อค้นหามุมมองหลังจากสร้างหรือสร้างมุมมองใหม่ ระบบ Android จะข้ามลำดับชั้นของมุมมองที่รันไทม์เพื่อค้นหามุมมองนั้น แต่หากแอปของคุณมีจำนวนการดูเพียงไม่กี่ครั้ง ก็จะไม่เกิดปัญหา อย่างไรก็ตาม แอปการผลิตอาจมีมุมมองหลายสิบรายการในเลย์เอาต์ และแม้จะมีการออกแบบที่ดีที่สุด ก็จะมีมุมมองที่ซ้อนกันอยู่

ลองนึกถึงเลย์เอาต์เชิงเส้นที่มี ScrollView ซึ่งมี TextView สำหรับลำดับชั้นของ View ที่มีขนาดใหญ่หรือซับซ้อน การค้นหา View อาจใช้เวลานานพอที่จะทำให้แอปช้าลงอย่างเห็นได้ชัดสำหรับผู้ใช้ การแคชมุมมองในตัวแปรอาจช่วยได้ แต่คุณยังคงต้องเริ่มต้นตัวแปรสำหรับแต่ละมุมมองในแต่ละเนมสเปซ หากมีจำนวนการดูและกิจกรรมหลายอย่าง การดำเนินการนี้ก็จะเพิ่มขึ้นด้วย

วิธีแก้ไขอย่างหนึ่งคือการสร้างออบเจ็กต์ที่มีการอ้างอิงถึงแต่ละมุมมอง ทั้งแอปสามารถใช้ออบเจ็กต์นี้ซึ่งเรียกว่าออบเจ็กต์ Binding ได้ เทคนิคนี้เรียกว่าการเชื่อมโยงข้อมูล เมื่อสร้างออบเจ็กต์การเชื่อมโยงสำหรับแอปแล้ว คุณจะเข้าถึงมุมมองและข้อมูลอื่นๆ ผ่านออบเจ็กต์การเชื่อมโยงได้โดยไม่ต้องไปยังลำดับชั้นของมุมมองหรือค้นหาข้อมูล

การเชื่อมโยงข้อมูลมีประโยชน์ดังนี้

  • โค้ดจะสั้นลง อ่านง่ายขึ้น และดูแลรักษาง่ายกว่าโค้ดที่ใช้ findByView()
  • ข้อมูลและมุมมองจะแยกกันอย่างชัดเจน ประโยชน์ของการเชื่อมโยงข้อมูลนี้จะมีความสำคัญมากขึ้นในภายหลังของหลักสูตรนี้
  • ระบบ Android จะไปยังลำดับชั้นของ View เพียงครั้งเดียวเพื่อรับแต่ละ View และจะเกิดขึ้นในระหว่างการเริ่มต้นแอป ไม่ใช่ที่รันไทม์เมื่อผู้ใช้โต้ตอบกับแอป
  • คุณจะได้รับความปลอดภัยของประเภทสำหรับการเข้าถึงมุมมอง (ความปลอดภัยของประเภทหมายความว่าคอมไพเลอร์จะตรวจสอบประเภทขณะคอมไพล์ และจะแสดงข้อผิดพลาดหากคุณพยายามกำหนดประเภทที่ไม่ถูกต้องให้กับตัวแปร)

ในงานนี้ คุณจะตั้งค่าการเชื่อมโยงข้อมูล และใช้การเชื่อมโยงข้อมูลเพื่อแทนที่การเรียก findViewById() ด้วยการเรียกออบเจ็กต์การเชื่อมโยง

ขั้นตอนที่ 1: เปิดใช้การเชื่อมโยงข้อมูล

หากต้องการใช้การเชื่อมโยงข้อมูล คุณต้องเปิดใช้การเชื่อมโยงข้อมูลในไฟล์ Gradle เนื่องจากระบบไม่ได้เปิดใช้โดยค่าเริ่มต้น เนื่องจากการเชื่อมโยงข้อมูลจะเพิ่มเวลาในการคอมไพล์และอาจส่งผลต่อเวลาเริ่มต้นของแอป

  1. หากไม่มีแอป AboutMe จาก Codelab ก่อนหน้า ให้รับโค้ด AboutMeDataBinding-Starter จาก GitHub เปิดใน Android Studio
  2. เปิดไฟล์ build.gradle (Module: app)
  3. ในส่วน android ก่อนเครื่องหมายปีกกาปิด ให้เพิ่มส่วน dataBinding และตั้งค่า enabled เป็น true
dataBinding {
    enabled = true
}
  1. เมื่อได้รับข้อความแจ้ง ให้ซิงค์โปรเจ็กต์ หากไม่ได้รับข้อความแจ้ง ให้เลือกไฟล์ > ซิงค์โปรเจ็กต์กับไฟล์ Gradle
  2. คุณเรียกใช้แอปได้ แต่จะไม่เห็นการเปลี่ยนแปลงใดๆ

ขั้นตอนที่ 2: เปลี่ยนไฟล์เลย์เอาต์ให้ใช้ได้กับการเชื่อมโยงข้อมูล

หากต้องการใช้การเชื่อมโยงข้อมูล คุณต้องรวมเลย์เอาต์ XML ไว้ในแท็ก <layout> เพื่อให้คลาสรูทไม่ใช่กลุ่มมุมมองอีกต่อไป แต่เป็นเลย์เอาต์ที่มีกลุ่มมุมมองและมุมมองแทน จากนั้นออบเจ็กต์การเชื่อมโยงจะทราบเกี่ยวกับเลย์เอาต์และมุมมองในเลย์เอาต์นั้น

  1. เปิดไฟล์ activity_main.xml
  2. เปลี่ยนไปที่แท็บข้อความ
  3. เพิ่ม <layout></layout> เป็นแท็กด้านนอกสุดรอบ <LinearLayout>
<layout>
   <LinearLayout ... >
   ...
   </LinearLayout>
</layout>
  1. เลือกโค้ด > จัดรูปแบบโค้ดเพื่อแก้ไขการเยื้องโค้ด

    การประกาศเนมสเปซสำหรับเลย์เอาต์ต้องอยู่ในแท็กด้านนอกสุด
  1. ตัดการประกาศเนมสเปซจาก <LinearLayout> แล้ววางลงในแท็ก <layout> แท็กเปิด <layout> ควรมีลักษณะดังที่แสดงด้านล่าง และแท็ก <LinearLayout> ควรมีเฉพาะพร็อพเพอร์ตี้มุมมอง
<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
  1. สร้างและเรียกใช้แอปเพื่อยืนยันว่าคุณทำตามขั้นตอนอย่างถูกต้อง

ขั้นตอนที่ 3: สร้างออบเจ็กต์การเชื่อมโยงในกิจกรรมหลัก

เพิ่มการอ้างอิงไปยังออบเจ็กต์การเชื่อมโยงไปยังกิจกรรมหลักเพื่อให้คุณใช้เพื่อเข้าถึงมุมมองได้

  1. เปิดไฟล์ MainActivity.kt
  2. ก่อน onCreate() ให้สร้างตัวแปรสำหรับออบเจ็กต์การเชื่อมโยงที่ระดับบนสุด โดยปกติแล้วตัวแปรนี้เรียกว่า binding

    คอมไพเลอร์จะสร้างประเภทของ binding ซึ่งก็คือคลาส ActivityMainBinding ขึ้นมาโดยเฉพาะสำหรับกิจกรรมหลักนี้ ชื่อนี้ได้มาจากชื่อของไฟล์เลย์เอาต์ นั่นคือ activity_main + Binding
private lateinit var binding: ActivityMainBinding
  1. หาก Android Studio แจ้ง ให้นำเข้า ActivityMainBinding หากระบบไม่แจ้ง ให้คลิก ActivityMainBinding แล้วกด Alt+Enter (Option+Enter ใน Mac) เพื่อนำเข้าชั้นเรียนที่ขาดหายไปนี้ (ดูแป้นพิมพ์ลัดเพิ่มเติมได้ที่แป้นพิมพ์ลัด)

    คำสั่ง import ควรมีลักษณะคล้ายกับคำสั่งที่แสดงด้านล่าง
import com.example.android.aboutme.databinding.ActivityMainBinding

จากนั้นแทนที่ฟังก์ชัน setContentView() ปัจจุบันด้วยคำสั่งที่ทำสิ่งต่อไปนี้

  • สร้างออบเจ็กต์การเชื่อมโยง
  • ใช้ฟังก์ชัน setContentView() จากคลาส DataBindingUtil เพื่อเชื่อมโยงเลย์เอาต์ activity_main กับ MainActivity setContentView() ฟังก์ชันนี้ยังดูแลการตั้งค่าการเชื่อมโยงข้อมูลบางอย่างสําหรับมุมมองด้วย
  1. ใน onCreate() ให้แทนที่การเรียก setContentView() ด้วยโค้ดบรรทัดต่อไปนี้
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
  1. นำเข้า DataBindingUtil
import androidx.databinding.DataBindingUtil

ขั้นตอนที่ 4: ใช้ออบเจ็กต์การเชื่อมโยงเพื่อแทนที่การเรียก findViewById() ทั้งหมด

ตอนนี้คุณสามารถแทนที่การเรียกใช้ทั้งหมดไปยัง findViewById() ด้วยการอ้างอิงไปยังมุมมองที่อยู่ในออบเจ็กต์การเชื่อมโยงได้แล้ว เมื่อสร้างออบเจ็กต์การเชื่อมโยง คอมไพเลอร์จะสร้างชื่อของ View ในออบเจ็กต์การเชื่อมโยงจากรหัสของ View ในเลย์เอาต์ โดยแปลงเป็นรูปแบบ Camel Case เช่น done_button จะเป็น doneButton ในออบเจ็กต์การเชื่อมโยง nickname_edit จะกลายเป็น nicknameEdit และ nickname_text จะกลายเป็น nicknameText

  1. ใน onCreate() ให้แทนที่โค้ดที่ใช้ findViewById() เพื่อค้นหา done_button ด้วยโค้ดที่อ้างอิงปุ่มในออบเจ็กต์การเชื่อมโยง

    แทนที่โค้ดนี้: findViewById<Button>(R.id.done_button)
    ด้วย: binding.doneButton

    โค้ดที่เสร็จสมบูรณ์แล้วเพื่อตั้งค่าเครื่องมือตรวจหาการคลิกใน onCreate() ควรมีลักษณะดังนี้
binding.doneButton.setOnClickListener {
   addNickname(it)
}
  1. ทำเช่นเดียวกันกับคำขอทั้งหมดไปยัง findViewById() ในฟังก์ชัน addNickname()
    แทนที่อินสแตนซ์ทั้งหมดของ findViewById<View>(R.id.id_view) ด้วย binding.idView โดยทำดังนี้
  • ลบคำจำกัดความของตัวแปร editText และ nicknameTextView พร้อมกับการเรียกไปยัง findViewById() ซึ่งจะทำให้เกิดข้อผิดพลาด
  • แก้ไขข้อผิดพลาดโดยรับมุมมอง nicknameText, nicknameEdit และ doneButton จากออบเจ็กต์ binding แทนตัวแปร (ที่ถูกลบ)
  • แทนที่ view.visibility ด้วย binding.doneButton.visibility การใช้ binding.doneButton แทน view ที่ส่งเข้ามาจะทำให้โค้ดมีความสอดคล้องกันมากขึ้น

    โค้ดที่ได้จะเป็นดังนี้
binding.nicknameText.text = binding.nicknameEdit.text
binding.nicknameEdit.visibility = View.GONE
binding.doneButton.visibility = View.GONE
binding.nicknameText.visibility = View.VISIBLE
  • ไม่มีการเปลี่ยนแปลงฟังก์ชันการทำงาน คุณสามารถเลือกที่จะนำพารามิเตอร์ view ออกและอัปเดตการใช้ view ทั้งหมดให้ใช้ binding.doneButton ภายในฟังก์ชันนี้ได้
  1. nicknameText ต้องใช้ String และ nicknameEdit.text เป็น Editable เมื่อใช้การเชื่อมโยงข้อมูล คุณต้องแปลง Editable เป็น String อย่างชัดเจน
binding.nicknameText.text = binding.nicknameEdit.text.toString()
  1. คุณสามารถลบการนำเข้าที่แสดงเป็นสีเทาได้
  2. เปลี่ยนฟังก์ชันเป็น Kotlin โดยใช้ apply{}
binding.apply {
   nicknameText.text = nicknameEdit.text.toString()
   nicknameEdit.visibility = View.GONE
   doneButton.visibility = View.GONE
   nicknameText.visibility = View.VISIBLE
}
  1. สร้างและเรียกใช้แอป...และแอปควรมีลักษณะและทำงานเหมือนเดิมทุกประการ

คุณใช้ประโยชน์จากการเชื่อมโยงข้อมูลเพื่อให้คลาสข้อมูลพร้อมใช้งานในมุมมองได้โดยตรง เทคนิคนี้ช่วยลดความซับซ้อนของโค้ด และมีประโยชน์อย่างยิ่งในการจัดการกรณีที่ซับซ้อนมากขึ้น

ในตัวอย่างนี้ คุณจะสร้างคลาสข้อมูลสำหรับชื่อและชื่อเล่นแทนการตั้งค่าชื่อและชื่อเล่นโดยใช้ทรัพยากรสตริง คุณทำให้คลาสข้อมูลพร้อมใช้งานในมุมมองโดยใช้การเชื่อมโยงข้อมูล

ขั้นตอนที่ 1: สร้างคลาสข้อมูล MyName

  1. ใน Android Studio ในไดเรกทอรี java ให้เปิดไฟล์ MyName.kt หากไม่มีไฟล์นี้ ให้สร้างไฟล์ Kotlin ใหม่และตั้งชื่อว่า MyName.kt
  2. กำหนดคลาสข้อมูลสำหรับชื่อและชื่อเล่น ใช้สตริงว่างเป็นค่าเริ่มต้น
data class MyName(var name: String = "", var nickname: String = "")

ขั้นตอนที่ 2: เพิ่มข้อมูลลงในเลย์เอาต์

ในไฟล์ activity_main.xml ปัจจุบันชื่อจะตั้งค่าไว้ใน TextView จากทรัพยากรสตริง คุณต้องแทนที่การอ้างอิงชื่อด้วยการอ้างอิงข้อมูลในคลาสข้อมูล

  1. เปิด activity_main.xml ในแท็บข้อความ
  2. ที่ด้านบนของเลย์เอาต์ ให้แทรกแท็ก <data></data> ระหว่างแท็ก <layout> กับ <LinearLayout> คุณจะเชื่อมต่อข้อมูลกับมุมมองได้ที่นี่
<data>
  
</data>

ภายในแท็กข้อมูล คุณสามารถประกาศตัวแปรที่มีชื่อซึ่งเก็บการอ้างอิงถึงคลาสได้

  1. เพิ่มแท็ก <variable> ภายในแท็ก <data>
  2. เพิ่มพารามิเตอร์ name เพื่อตั้งชื่อตัวแปรเป็น "myName" เพิ่มพารามิเตอร์ type และตั้งค่าประเภทเป็นชื่อที่สมบูรณ์ของคลาสข้อมูล MyName (ชื่อแพ็กเกจ + ชื่อตัวแปร)
<variable
       name="myName"
       type="com.example.android.aboutme.MyName" />

ตอนนี้คุณสามารถอ้างอิงmyNameตัวแปรแทนการใช้ทรัพยากรสตริงสำหรับชื่อได้แล้ว

  1. แทนที่ android:text="@string/name" ด้วยโค้ดด้านล่าง

@={} เป็นคำสั่งเพื่อรับข้อมูลที่อ้างอิงภายในเครื่องหมายปีกกา

myName อ้างอิงตัวแปร myName ที่คุณกำหนดไว้ก่อนหน้านี้ ซึ่งชี้ไปยังคลาสข้อมูล myName และดึงพร็อพเพอร์ตี้ name จากคลาส

android:text="@={myName.name}"

ขั้นตอนที่ 3: สร้างข้อมูล

ตอนนี้คุณมีข้อมูลอ้างอิงถึงข้อมูลในไฟล์เลย์เอาต์แล้ว จากนั้นให้สร้างข้อมูลจริง

  1. เปิดไฟล์ MainActivity.kt
  2. ที่ด้านบน onCreate() ให้สร้างตัวแปรส่วนตัว ซึ่งเรียกอีกอย่างว่า myName ตามธรรมเนียม กำหนดอินสแตนซ์ของคลาสข้อมูล MyName ให้กับตัวแปรโดยส่งชื่อ
private val myName: MyName = MyName("Aleks Haecky")
  1. ใน onCreate() ให้ตั้งค่าตัวแปร myName ในไฟล์เลย์เอาต์เป็นค่าของตัวแปร myName ที่คุณเพิ่งประกาศ คุณไม่สามารถเข้าถึงตัวแปรใน XML ได้โดยตรง คุณต้องเข้าถึงผ่านออบเจ็กต์การเชื่อมโยง
binding.myName = myName
  1. ซึ่งอาจแสดงข้อผิดพลาดเนื่องจากคุณต้องรีเฟรชออบเจ็กต์การเชื่อมโยงหลังจากทำการเปลี่ยนแปลง สร้างแอป แล้วข้อผิดพลาดจะหายไป

ขั้นตอนที่ 4: ใช้คลาสข้อมูลสำหรับชื่อเล่นใน TextView

ขั้นตอนสุดท้ายคือการใช้คลาสข้อมูลสำหรับชื่อเล่นใน TextView ด้วย

  1. เปิด activity_main.xml
  2. ในnickname_textมุมมองข้อความ ให้เพิ่มพร็อพเพอร์ตี้ text อ้างอิง nickname ในคลาสข้อมูล ดังที่แสดงด้านล่าง
android:text="@={myName.nickname}"
  1. ใน ActivityMain ให้แทนที่
    nicknameText.text = nicknameEdit.text.toString()
    ด้วยรหัสเพื่อตั้งชื่อเล่นในตัวแปร myName
myName?.nickname = nicknameEdit.text.toString()

หลังจากตั้งค่าชื่อเล่นแล้ว คุณจะต้องให้โค้ดรีเฟรช UI ด้วยข้อมูลใหม่ โดยคุณต้องทำให้นิพจน์การเชื่อมโยงทั้งหมดไม่ถูกต้องเพื่อให้ระบบสร้างนิพจน์เหล่านั้นขึ้นใหม่ด้วยข้อมูลที่ถูกต้อง

  1. เพิ่ม invalidateAll() หลังจากตั้งค่าชื่อเล่นเพื่อให้ UI รีเฟรชด้วยค่าในออบเจ็กต์การเชื่อมโยงที่อัปเดต
binding.apply {
   myName?.nickname = nicknameEdit.text.toString()
   invalidateAll()
   ...
}
  1. สร้างและเรียกใช้แอป แล้วแอปจะทำงานเหมือนเดิมทุกประการ

โปรเจ็กต์ Android Studio: AboutMeDataBinding

ขั้นตอนการใช้การเชื่อมโยงข้อมูลเพื่อแทนที่การเรียกใช้ findViewById()

  1. เปิดใช้การเชื่อมโยงข้อมูลในส่วน Android ของไฟล์ build.gradle:
    dataBinding { enabled = true }
  2. ใช้ <layout> เป็นมุมมองรากในเลย์เอาต์ XML
  3. กำหนดตัวแปรการเชื่อมโยง:
    private lateinit var binding: ActivityMainBinding
  4. สร้างออบเจ็กต์การเชื่อมโยงใน MainActivity โดยแทนที่ setContentView:
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
  5. แทนที่การเรียกใช้ findViewById() ด้วยการอ้างอิงไปยังมุมมองในออบเจ็กต์การเชื่อมโยง เช่น
    findViewById<Button>(R.id.done_button) ⇒ binding.doneButton
    (ในตัวอย่างนี้ ระบบจะสร้างชื่อของมุมมองเป็นรูปแบบ Camel Case จาก id ของมุมมองใน XML)

ขั้นตอนการเชื่อมโยงมุมมองกับข้อมูลมีดังนี้

  1. สร้างคลาสข้อมูลสำหรับข้อมูล
  2. เพิ่มบล็อก <data> ภายในแท็ก <layout>
  3. กำหนด <variable> โดยมีชื่อและประเภทที่เป็นคลาสข้อมูล
<data>
   <variable
       name="myName"
       type="com.example.android.aboutme.MyName" />
</data>
  1. ใน MainActivity ให้สร้างตัวแปรที่มีอินสแตนซ์ของคลาสข้อมูล เช่น
    private val myName: MyName = MyName("Aleks Haecky")
  1. ในออบเจ็กต์การเชื่อมโยง ให้ตั้งค่าตัวแปรเป็นตัวแปรที่คุณเพิ่งสร้าง:
    binding.myName = myName
  1. ใน XML ให้ตั้งค่าเนื้อหาของมุมมองเป็นตัวแปรที่คุณกำหนดไว้ในบล็อก <data> ใช้รูปแบบจุดเพื่อเข้าถึงข้อมูลภายในคลาสข้อมูล
    android:text="@={myName.name}"

หลักสูตร Udacity:

เอกสารประกอบสำหรับนักพัฒนาแอป Android

ส่วนนี้แสดงรายการการบ้านที่เป็นไปได้สำหรับนักเรียน/นักศึกษาที่กำลังทำ Codelab นี้เป็นส่วนหนึ่งของหลักสูตรที่สอนโดยผู้สอน ผู้สอนมีหน้าที่ดำเนินการต่อไปนี้

  • มอบหมายการบ้านหากจำเป็น
  • สื่อสารกับนักเรียนเกี่ยวกับวิธีส่งงานที่ได้รับมอบหมาย
  • ให้คะแนนงานการบ้าน

ผู้สอนสามารถใช้คำแนะนำเหล่านี้ได้มากน้อยตามที่ต้องการ และควรมีอิสระในการมอบหมายการบ้านอื่นๆ ที่เห็นว่าเหมาะสม

หากคุณกำลังทำ Codelab นี้ด้วยตนเอง โปรดใช้แบบฝึกหัดเหล่านี้เพื่อทดสอบความรู้ของคุณ

ตอบคำถามต่อไปนี้

คำถามที่ 1

เหตุใดคุณจึงต้องการลดการเรียก findViewById() โดยชัดแจ้งและโดยนัย

  • ทุกครั้งที่มีการเรียกใช้ findViewById() ระบบจะข้ามลําดับชั้นของ View
  • findViewById() ทำงานในเธรดหลักหรือเธรด UI
  • การเรียกเหล่านี้อาจทำให้อินเทอร์เฟซผู้ใช้ทำงานช้าลง
  • แอปมีแนวโน้มที่จะขัดข้องน้อยลง

คำถามที่ 2

คุณจะอธิบายการเชื่อมโยงข้อมูลว่าอย่างไร

ตัวอย่างสิ่งที่คุณพูดได้เกี่ยวกับการเชื่อมโยงข้อมูลมีดังนี้

  • แนวคิดหลักเกี่ยวกับการเชื่อมโยงข้อมูลคือการสร้างออบเจ็กต์ที่เชื่อมต่อ/แมป/เชื่อมโยงข้อมูล 2 ส่วนที่อยู่ห่างกันเข้าด้วยกันในเวลาคอมไพล์ เพื่อให้คุณไม่ต้องค้นหาข้อมูลในรันไทม์
  • ออบเจ็กต์ที่แสดงการเชื่อมโยงเหล่านี้ต่อคุณเรียกว่าออบเจ็กต์การเชื่อมโยง
  • คอมไพเลอร์จะสร้างออบเจ็กต์การเชื่อมโยง

คำถามที่ 3

ข้อใดต่อไปนี้ไม่ใช่ประโยชน์ของการเชื่อมโยงข้อมูล

  • โค้ดจะสั้นลง อ่านง่ายขึ้น และดูแลรักษาง่ายขึ้น
  • ข้อมูลและมุมมองจะแยกกันอย่างชัดเจน
  • ระบบ Android จะไปยังส่วนต่างๆ ของลำดับชั้นของ View เพียงครั้งเดียวเพื่อรับแต่ละ View
  • การเรียกใช้ findViewById() จะทำให้เกิดข้อผิดพลาดของคอมไพเลอร์
  • ความปลอดภัยของประเภทสำหรับการเข้าถึงมุมมอง

คำถามที่ 4

แท็ก <layout> มีหน้าที่อะไร

  • คุณจะวางไว้รอบๆ มุมมองรากในเลย์เอาต์
  • ระบบจะสร้างการเชื่อมโยงสำหรับมุมมองทั้งหมดในเลย์เอาต์
  • โดยจะกำหนดมุมมองระดับบนสุดในเลย์เอาต์ XML ที่ใช้การเชื่อมโยงข้อมูล
  • คุณใช้แท็ก <data> ภายใน <layout> เพื่อเชื่อมโยงตัวแปรกับคลาสข้อมูลได้

คำถามที่ 5

วิธีที่ถูกต้องในการอ้างอิงข้อมูลที่เชื่อมโยงในเลย์เอาต์ XML คือวิธีใด

  • android:text="@={myDataClass.property}"
  • android:text="@={myDataClass}"
  • android:text="@={myDataClass.property.toString()}"
  • android:text="@={myDataClass.bound_data.property}"

เริ่มบทเรียนถัดไป: 3.1: สร้าง Fragment

ดูลิงก์ไปยัง Codelab อื่นๆ ในหลักสูตรนี้ได้ที่หน้า Landing Page ของ Codelab หลักพื้นฐานของ Android Kotlin