Codelab นี้เป็นส่วนหนึ่งของหลักสูตรหลักพื้นฐานของ Android Kotlin คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้หากทำตาม Codelab ตามลำดับ Codelab ของหลักสูตรทั้งหมดแสดงอยู่ในหน้า Landing Page ของ Codelab หลักพื้นฐานของ Android Kotlin
ใน Codelab นี้ คุณจะได้เรียนรู้เกี่ยวกับ Fragment และสร้าง Fragment ภายในแอปเริ่มต้นที่ชื่อ AndroidTrivia ใน Codelab ถัดไป คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับการนำทางและทำงานเพิ่มเติมในแอป AndroidTrivia
สิ่งที่คุณควรทราบอยู่แล้ว
- พื้นฐานของ Kotlin
- วิธีสร้างแอป Android พื้นฐานใน Kotlin
- วิธีทำงานกับเลย์เอาต์
สิ่งที่คุณจะได้เรียนรู้
- วิธีเพิ่ม Fragment แบบคงที่ลงในแอป
สิ่งที่คุณต้องดำเนินการ
- สร้าง Fragment ภายใน Activity
ใน Codelab 3 รายการที่ประกอบกันเป็นบทเรียนนี้ คุณจะได้ทำงานกับแอปชื่อ AndroidTrivia แอปที่เสร็จสมบูรณ์แล้วจะเป็นเกมที่ผู้ใช้ตอบคำถามความรู้รอบตัว 3 ข้อเกี่ยวกับการเขียนโค้ด Android หากผู้ใช้ตอบคำถามทั้ง 3 ข้อถูกต้อง ผู้ใช้จะชนะเกมและแชร์ผลลัพธ์ได้
แอป AndroidTrivia แสดงรูปแบบการนำทางและการควบคุม แอปมีคอมโพเนนต์หลายอย่าง ได้แก่
- ในหน้าจอชื่อเกม ซึ่งแสดงทางด้านซ้ายในภาพหน้าจอด้านบน ผู้ใช้จะเริ่มเกม
- ในหน้าจอเกมที่มีคำถาม ซึ่งแสดงอยู่ตรงกลางด้านบน ผู้ใช้จะเล่นเกมและส่งคำตอบ
- ลิ้นชักการนำทางที่แสดงทางด้านขวาด้านบนจะเลื่อนออกมาจากด้านข้างของแอปและมีเมนูพร้อมส่วนหัว ไอคอนลิ้นชัก
จะเปิดลิ้นชักการนำทาง เมนูแถบนำทางมีลิงก์ไปยังหน้า "เกี่ยวกับ" และลิงก์ไปยังกฎของเกม
ด้านบนของแอปจะแสดงมุมมองสีที่เรียกว่าแถบแอป หรือที่เรียกว่าแถบการทำงาน
ใน Codelab นี้ คุณจะทำงานจากแอปเริ่มต้นที่มีโค้ดเทมเพลตและคลาส Fragment ที่คุณต้องใช้เมื่อสร้างแอป Trivia เสร็จสมบูรณ์
- ดาวน์โหลดโปรเจ็กต์ AndroidTrivia-Starter ใน Android Studio
- เปิดโปรเจ็กต์ใน Android Studio แล้วเรียกใช้แอป เมื่อแอปเปิดขึ้น แอปจะไม่ทำอะไรเลยนอกจากการแสดงชื่อแอปและหน้าจอว่าง
- ในแผงโปรเจ็กต์ของ Android Studio ให้เปิดมุมมองโปรเจ็กต์: Android เพื่อสำรวจไฟล์โปรเจ็กต์ เปิดโฟลเดอร์ app > java เพื่อดูคลาส
MainActivity
และคลาส Fragment - เปิดโฟลเดอร์ res > layout แล้วดับเบิลคลิก activity_main.xml ไฟล์
activity_main.xml
จะปรากฏใน Layout Editor - คลิกแท็บออกแบบ โครงสร้างคอมโพเนนต์สำหรับไฟล์
activity_main.xml
จะแสดงเลย์เอาต์รูทเป็นแนวตั้งLinearLayout
ในเลย์เอาต์เชิงเส้นแนวตั้ง มุมมองย่อยทั้งหมดในเลย์เอาต์จะจัดแนวในแนวตั้ง
Fragment แสดงลักษณะการทำงานหรือส่วนหนึ่งของอินเทอร์เฟซผู้ใช้ (UI) ในกิจกรรม คุณรวม Fragment หลายรายการไว้ในกิจกรรมเดียวเพื่อสร้าง UI แบบหลายบานหน้าต่าง และนำ Fragment ไปใช้ซ้ำในกิจกรรมหลายรายการได้
Fragment เป็นส่วนแบบแยกส่วนของกิจกรรม ซึ่งคล้ายกับ "กิจกรรมย่อย" ที่คุณใช้ในกิจกรรมอื่นๆ ได้ด้วย
- Fragment มีวงจรของตัวเองและรับเหตุการณ์อินพุตของตัวเอง
- คุณเพิ่มหรือนำ Fragment ออกได้ขณะที่กิจกรรมกำลังทำงาน
- โดย Fragment จะกำหนดไว้ในคลาส Kotlin
- UI ของ Fragment จะกำหนดไว้ในไฟล์เลย์เอาต์ XML
แอป AndroidTrivia มีกิจกรรมหลักและ Fragment หลายรายการ ระบบได้กำหนด Fragment ส่วนใหญ่และไฟล์เลย์เอาต์ของ Fragment เหล่านั้นไว้ให้คุณแล้ว ในงานนี้ คุณจะได้สร้าง Fragment และเพิ่ม Fragment ลงในกิจกรรมหลักของแอป
ขั้นตอนที่ 1: เพิ่มคลาส Fragment
ในขั้นตอนนี้ คุณจะได้สร้างTitleFragment
ชั้นเรียนTitleFragment
เปล่า เริ่มต้นด้วยการสร้างคลาส Kotlin สำหรับ Fragment ใหม่
- ใน Android Studio ให้คลิกที่ใดก็ได้ภายในแผงโปรเจ็กต์เพื่อกลับไปโฟกัสที่ไฟล์โปรเจ็กต์ เช่น คลิกโฟลเดอร์ com.example.android.navigation
- เลือกไฟล์ > ใหม่ > Fragment > Fragment (ว่าง)
- สำหรับชื่อ Fragment ให้ใช้ TitleFragment ล้างช่องทำเครื่องหมายทั้งหมด รวมถึงสร้าง XML ของเลย์เอาต์ รวมเมธอด Factory ของ Fragment และรวมการเรียกกลับของอินเทอร์เฟซ
- คลิกเสร็จสิ้น
- เปิดไฟล์
TitleFragment.kt
fragment หากยังไม่ได้เปิด ซึ่งมีเมธอดonCreateView()
ซึ่งเป็นหนึ่งในเมธอดที่เรียกใช้ในวงจรของ Fragment - ใน
onCreateView()
ให้นำส่วนreturn TextView(activity).apply
ออก รวมถึงบรรทัดที่ขึ้นต้นด้วยsetText
ฟังก์ชันonCreateView()
จะเหลือเพียงโค้ดต่อไปนี้
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
}
สร้างออบเจ็กต์การเชื่อมโยง
ตอนนี้ระบบจะไม่คอมไพล์โค้ด หากต้องการให้ Fragment คอมไพล์ คุณต้องสร้างออบเจ็กต์การเชื่อมโยงและขยายมุมมองของ Fragment (ซึ่งเทียบเท่ากับการใช้ setContentView()
สำหรับกิจกรรม)
- ใน
onCreateView()
เมธอดในTitleFragment.kt
ให้สร้างตัวแปรbinding
(val binding
) - หากต้องการขยายมุมมองของ Fragment ให้เรียกใช้เมธอด
DataBindingUtil.inflate()
ในออบเจ็กต์Binding
ของ Fragment ซึ่งก็คือFragmentTitleBinding
ส่งพารามิเตอร์ 4 รายการไปยังเมธอด
inflater
ซึ่งเป็นLayoutInflater
ที่ใช้เพื่อขยายเลย์เอาต์การเชื่อมโยง- ทรัพยากรเลย์เอาต์ XML ของเลย์เอาต์ที่จะขยาย ใช้เลย์เอาต์ใดเลย์เอาต์หนึ่งที่กำหนดไว้ให้คุณแล้ว
R.layout.fragment_title
container
สำหรับผู้ปกครองViewGroup
(พารามิเตอร์นี้จะใส่หรือไม่ใส่ก็ได้)false
สำหรับค่าattachToParent
- กำหนดค่าที่
DataBindingUtil.inflate
แสดงผลให้กับตัวแปรbinding
- ส่งคืน
binding.root
จากเมธอด ซึ่งมีมุมมองที่ขยาย ตอนนี้เมธอดonCreateView()
ของคุณจะมีลักษณะเหมือนโค้ดต่อไปนี้
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val binding = DataBindingUtil.inflate<FragmentTitleBinding>(inflater,
R.layout.fragment_title,container,false)
return binding.root
}
ขั้นตอนที่ 2: เพิ่ม Fragment ใหม่ลงในไฟล์เลย์เอาต์หลัก
ในขั้นตอนนี้ คุณจะเพิ่ม TitleFragment
ลงในไฟล์เลย์เอาต์ activity_main.xml
ของแอป
- เปิด res > layout > activity_main.xml แล้วคลิกแท็บข้อความเพื่อดูโค้ด XML ของเลย์เอาต์
- เพิ่มองค์ประกอบ
fragment
ภายในองค์ประกอบLinearLayout
ที่มีอยู่ - ตั้งรหัสของ Fragment เป็น
titleFragment
- ตั้งชื่อ Fragment เป็นเส้นทางแบบเต็มของคลาส Fragment ซึ่งในกรณีนี้คือ
com.example.android.navigation.TitleFragment
- ตั้งค่าความกว้างและความสูงของเลย์เอาต์เป็น
match_parent
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/titleFragment"
android:name="com.example.android.navigation.TitleFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
</layout>
- เรียกใช้แอป ระบบได้เพิ่ม Fragment ลงในหน้าจอหลักแล้ว
โปรเจ็กต์ Android Studio: AndroidTriviaFragment
ใน Codelab นี้ คุณได้เพิ่ม Fragment ลงในแอป AndroidTrivia ซึ่งคุณจะใช้ต่อไปใน Codelab อีก 2 รายการในบทเรียนนี้
- Fragment คือส่วนแบบแยกส่วนของกิจกรรม
- Fragment มีวงจรของตัวเองและรับเหตุการณ์อินพุตของตัวเอง
- ใช้แท็ก
<fragment>
เพื่อกำหนดเลย์เอาต์สำหรับ Fragment ในไฟล์เลย์เอาต์ XML - ขยายเลย์เอาต์สำหรับ Fragment ใน
onCreateView()
- คุณเพิ่มหรือนำ Fragment ออกได้ขณะที่กิจกรรมกำลังทำงาน
หลักสูตร Udacity:
เอกสารประกอบสำหรับนักพัฒนาแอป Android
ส่วนนี้แสดงรายการการบ้านที่เป็นไปได้สำหรับนักเรียน/นักศึกษาที่กำลังทำ Codelab นี้เป็นส่วนหนึ่งของหลักสูตรที่สอนโดยผู้สอน ผู้สอนมีหน้าที่ดำเนินการต่อไปนี้
- มอบหมายการบ้านหากจำเป็น
- สื่อสารกับนักเรียนเกี่ยวกับวิธีส่งงานที่ได้รับมอบหมาย
- ให้คะแนนงานการบ้าน
ผู้สอนสามารถใช้คำแนะนำเหล่านี้ได้มากน้อยตามที่ต้องการ และควรมีอิสระในการมอบหมายการบ้านอื่นๆ ที่เห็นว่าเหมาะสม
หากคุณกำลังทำ Codelab นี้ด้วยตนเอง โปรดใช้แบบฝึกหัดเหล่านี้เพื่อทดสอบความรู้ของคุณ
ตอบคำถามต่อไปนี้
คำถามที่ 1
ความแตกต่างระหว่าง Fragment กับ Activity มีอะไรบ้าง เลือกข้อความทั้งหมดที่เป็นจริง
- เมื่อสร้าง Fragment ให้ขยายเลย์เอาต์ในเมธอด
onCreateView()
เมื่อสร้างกิจกรรม คุณจะขยายเลย์เอาต์ในonCreate()
- กิจกรรมมีเลย์เอาต์ของตัวเอง แต่ Fragment ไม่มีเลย์เอาต์ของตัวเอง
- กิจกรรมมีวงจรของตัวเอง แต่ Fragment ไม่มี
- เมื่อขยายเลย์เอาต์สำหรับ Fragment หรือ Activity คุณจะอ้างอิงเลย์เอาต์เป็น
R.layout.
layoutname
ได้
คำถามที่ 2
ข้อความใดต่อไปนี้เกี่ยวกับ Fragment เป็นจริง เลือกได้มากกว่า 1 ข้อ
- คุณใช้ Fragment ในกิจกรรมได้มากกว่า 1 รายการ
- กิจกรรมหนึ่งๆ อาจมีหลาย Fragment
- หลังจากกำหนด Fragment ในคลาส Kotlin แล้ว ระบบจะเพิ่ม Fragment ลงใน
activity_main.xml
ไฟล์เลย์เอาต์โดยอัตโนมัติ - ใช้แท็ก
<fragment>
เพื่อกำหนดตำแหน่งในไฟล์เลย์เอาต์ที่จะแทรก Fragment
เริ่มบทเรียนถัดไป:
ดูลิงก์ไปยัง Codelab อื่นๆ ในหลักสูตรนี้ได้ที่หน้า Landing Page ของ Codelab หลักพื้นฐานของ Android Kotlin