ใน Codelab นี้ คุณจะต้องสร้างแอปลูกเต๋า Android ที่ผู้ใช้สามารถคลิก Button
ในแอปเพื่อทอยลูกเต๋า ผลลัพธ์ของม้วนจะแสดงเป็น TextView
บนหน้าจอ
คุณจะใช้เครื่องมือแก้ไขเลย์เอาต์ใน Android Studio เพื่อสร้างเลย์เอาต์ของแอป และเขียนโค้ด Kotlin สําหรับสิ่งที่เกิดขึ้นเมื่อคลิก Button
สิ่งที่ต้องมีก่อน
- วิธีสร้างและเรียกใช้แอป " Hello, World!" ใน Android Studio
- คุ้นเคยกับการใช้
TextViews
และImageViews
ในแอป - วิธีแก้ไขแอตทริบิวต์ของ
TextView
ในเครื่องมือแก้ไขเลย์เอาต์ - วิธีแยกข้อความเป็นทรัพยากรสตริงเพื่อให้แปลแอปและนําสตริงมาใช้ซ้ําได้ง่ายขึ้น
- ข้อมูลเบื้องต้นเกี่ยวกับโปรแกรม Kotlin ตามการสอนใน Codelab ก่อนหน้านี้
สิ่งที่คุณจะได้เรียนรู้
- วิธีเพิ่ม
Button
ในแอป Android - วิธีเพิ่มลักษณะการทํางานเมื่อแตะ
Button
ในแอป - วิธีเปิดและแก้ไขโค้ด
Activity
ของแอป - วิธีแสดงข้อความ
Toast
- วิธีอัปเดตเนื้อหาของ
TextView
ขณะแอปกําลังทํางาน
สิ่งที่คุณจะสร้าง
- แอปลูกเต๋า Android ที่มี
Button
เพื่อทอยลูกเต๋าและอัปเดตข้อความบนหน้าจอด้วยผลลัพธ์ของลูกกลิ้ง
สิ่งที่ต้องมี
- คอมพิวเตอร์ที่ติดตั้ง Android Studio
แอปจะมีลักษณะเช่นนี้เมื่อดําเนินการ Codelab เสร็จสิ้นแล้ว
สร้างโปรเจ็กต์กิจกรรมที่ว่างเปล่า
- หากคุณเปิดโปรเจ็กต์เดิมไว้ใน Android Studio แล้ว ให้ไปที่ File > New > New Project... เพื่อเปิดหน้าจอ Create New Project
- ใน Create New Project ให้สร้างโปรเจ็กต์ Kotlin ใหม่โดยใช้เทมเพลต Empty Activity
- เรียกแอป "Dice Roller" ที่ระดับ API ต่ําสุด 19 (KitKat)
สําคัญ: หากยังไม่คุ้นเคยกับการสร้างโปรเจ็กต์ใหม่ใน Android Studio โปรดดูรายละเอียดที่หัวข้อสร้างและเรียกใช้แอป Android เป็นครั้งแรก
- เรียกใช้แอปใหม่และควรเป็นแบบนี้
เปิดเครื่องมือแก้ไขเลย์เอาต์
- ในหน้าต่างโปรเจ็กต์ ให้ดับเบิลคลิก
activity_main.xml
(app > res > layout > activity_main.xml) เพื่อเปิด คุณควรเห็น Layout Editor โดยมีเฉพาะ " Hello World"TextView
ตรงกลางแอป
จากนั้นคุณจะเพิ่ม Button
ไปยังแอป โดย Button
คือองค์ประกอบของอินเทอร์เฟซผู้ใช้ (UI) ใน Android ที่ผู้ใช้แตะเพื่อดําเนินการได้
ในงานนี้ คุณเพิ่ม Button
ใต้ " Hello World" TextView
TextView
และ Button
จะอยู่ใน ConstraintLayout
ซึ่งเป็นประเภท ViewGroup
เมื่อมี Views
ภายใน ViewGroup
ระบบจะถือว่า Views
เป็นย่อยของผู้ปกครองViewGroup
ในกรณีที่เป็นแอปของคุณ TextView
และ Button
จะถือว่าเป็นผู้เผยแพร่โฆษณาระดับบนสุด ConstraintLayout
เพิ่ม Button
เป็นผู้เผยแพร่โฆษณารายย่อยของ ConstraintLayout
ที่มีอยู่ในแอป
เพิ่มปุ่มลงในเลย์เอาต์
- ลาก
Button
จากจานสีไปยังมุมมองการออกแบบ โดยวางตําแหน่งไว้ใต้ "สวัสดีโลก"TextView
- ยืนยันว่า Palette ใน Component Tree ยืนยันว่า
Button
และTextView
อยู่ภายใต้ConstraintLayout
(เป็นระดับล่างของConstraintLayout
) - ตรวจสอบข้อผิดพลาดว่า
Button
ไม่ได้ถูกจํากัด เนื่องจากButton
อยู่ภายในConstraintLayout
คุณจึงต้องกําหนดข้อจํากัดในแนวตั้งและแนวนอนเพื่อวางตําแหน่ง
วางตําแหน่งปุ่ม
ในขั้นตอนนี้ คุณจะต้องเพิ่มข้อจํากัดแนวตั้งจากด้านบนของ Button
ไปที่ด้านล่างของ TextView
การดําเนินการนี้จะวาง Button
ไว้ต่ํากว่า TextView
- ในมุมมองการออกแบบที่ขอบด้านบนของ
Button
ให้กดวงกลมสีขาวค้างไว้ด้วยเส้นขอบสีน้ําเงิน ลากตัวชี้ จากนั้นลูกศรจะไปตามตัวชี้ ปล่อยเมื่อมาถึงขอบด้านล่างของ " Hello World"TextView
การดําเนินการนี้จะกําหนดข้อจํากัดด้านเลย์เอาต์ และButton
จะเลื่อนไปต่ํากว่าTextView
- ดูแอตทริบิวต์ทางด้านขวาของเครื่องมือแก้ไขเลย์เอาต์
- ในวิดเจ็ตข้อจํากัด ให้สังเกตว่ามีข้อจํากัดของเลย์เอาต์ใหม่ที่ตั้งค่าไว้ที่ด้านล่างของ
TextView
, ด้านบน → BottomOf textView (0dp) (0dp) หมายความว่ามีระยะขอบ 0 นอกจากนี้ คุณยังมีข้อผิดพลาดเนื่องจากไม่มีข้อจํากัดในแนวนอน - เพิ่มข้อจํากัดในแนวนอนจากด้านซ้ายของ
Button
ทางด้านซ้ายของConstraintLayout
ระดับบนสุด - ทําซ้ําทางด้านขวาโดยเชื่อมต่อขอบด้านขวาของ
Button
กับขอบด้านขวาของConstraintLayout
ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้
- หากเลือก
Button
ไว้ วิดเจ็ตข้อจํากัดควรมีลักษณะดังนี้ สังเกตเห็นข้อจํากัดเพิ่มเติม 2 รายการที่เพิ่มเข้ามา ได้แก่ Start → StartOfParent (0dp) และ End → EndOfParent (0dp) ซึ่งหมายความว่าButton
จะมีจุดศูนย์กลางอยู่ที่ConstraintLayout
ในระดับบนสุด
- เรียกใช้แอปที่ได้ ภาพหน้าจอควรมีลักษณะดังนี้ คลิกที่
Button
ได้ แต่ก็ยังทําอะไรไม่ได้ มาลุยกันต่อเลย
เปลี่ยนข้อความของปุ่ม
คุณจะทําการเปลี่ยนแปลง UI อีก 2-3 รายการในเครื่องมือแก้ไขเลย์เอาต์
แทนที่จะให้ป้ายกํากับ Button
แสดง "Button" ให้เปลี่ยนเป็นสิ่งที่บ่งชี้ว่าปุ่มจะทํา: "Roll"
- ในเลย์เอาต์เลย์เอาต์ที่เลือก
Button
ไว้ ให้ไปที่แอตทริบิวต์ เปลี่ยนข้อความเป็นRoll และกดแป้นEnter
(Return
ใน Mac)
- ในแผนผังคอมโพเนนต์ สามเหลี่ยมคําเตือนสีส้มจะปรากฏถัดจาก
Button
หากวางเมาส์เหนือตัวชี้เหนือรูปสามเหลี่ยม จะมีข้อความปรากฏขึ้น Android Studio ตรวจพบสตริงฮาร์ดโค้ด ("Roll") ในโค้ดของแอป และแนะนําให้ใช้ทรัพยากรสตริงแทน
การมีสตริงแบบฮาร์ดโค้ดจะทําให้แอปแปลในภาษาอื่นได้ยากขึ้น และการนําสตริงในส่วนต่างๆ ของแอปมาใช้ซ้ําได้ยากขึ้น โชคดีที่ Android Studio มีการแก้ปัญหาให้คุณโดยอัตโนมัติ
- ในโครงสร้างคอมโพเนนต์ ให้คลิกสามเหลี่ยมสีส้ม
ข้อความเตือนฉบับเต็มจะเปิดขึ้น
- ที่ด้านล่างของข้อความ ให้คลิกปุ่มแก้ไขที่ด้านล่างของแก้ไขที่แนะนํา (อาจต้องเลื่อนลง)
- กล่องโต้ตอบแยกทรัพยากรจะเปิดขึ้น การแยกสตริงหมายถึงการใช้ข้อความ "Roll" และสร้างทรัพยากรสตริงชื่อ
roll
ในstrings.xml
(app > res > value > string.xml) ค่าเริ่มต้นจะถูกต้อง จากนั้นคลิกตกลง
- โปรดสังเกตว่าในแอตทริบิวต์ แอตทริบิวต์ text สําหรับ
Button
จะพูดว่า@string/roll
ซึ่งอ้างอิงถึงทรัพยากรที่คุณเพิ่งสร้าง
ในมุมมองการออกแบบ Button
ควรพูดว่าม้วน
จัดรูปแบบ TextView
"สวัสดีโลก!" ข้อความมีขนาดเล็กและมีข้อความสําหรับแอปของคุณไม่เพียงพอ ในขั้นตอนนี้ จะแทนที่ข้อความขนาดเล็ก &สวัสดี โลก!" ด้วยตัวเลขสําหรับแสดงค่าแบบเลื่อน และทําให้แบบอักษรมีขนาดใหญ่ขึ้นเพื่อให้มองเห็นได้ง่ายขึ้น
- ในตัวแก้ไขดีไซน์ ให้เลือก
TextView
เพื่อให้แอตทริบิวต์ปรากฏในหน้าต่างแอตทริบิวต์ - เปลี่ยน textSize ของ
TextView
เป็น 36sp เพื่อให้มีขนาดใหญ่และอ่านได้ง่าย คุณอาจต้องเลื่อนหา textSize
- ล้างแอตทริบิวต์ข้อความของ
TextView
คุณไม่จําเป็นต้องแสดงอะไรในTextView
จนกว่าผู้ใช้จะทอยลูกเต๋า
แต่การดูข้อความบางส่วนใน TextView
มีประโยชน์อย่างยิ่งเมื่อคุณแก้ไขเลย์เอาต์และโค้ดของแอป เพื่อวัตถุประสงค์นี้ คุณจะเพิ่มข้อความลงใน TextView
ที่ปรากฏเป็นตัวอย่างเลย์เอาต์เท่านั้นได้ แต่จะไม่เห็นเมื่อแอปทํางาน
.
- เลือก
TextView
ในแผนผังคอมโพเนนต์ - ใต้แอตทริบิวต์ทั่วไป ให้หาแอตทริบิวต์ข้อความและแอตทริบิวต์ข้อความอีกรายการที่มีไอคอนเครื่องมือ แอตทริบิวต์ text คือสิ่งที่จะแสดงแก่ผู้ใช้เมื่อแอปทํางานอยู่ แอตทริบิวต์ text ที่มีไอคอนเครื่องมือคือแอตทริบิวต์ "tools text" สําหรับนักพัฒนาซอฟต์แวร์เท่านั้น
- ตั้งค่าข้อความเครื่องมือเป็น "1" ใน
TextView
(เพื่อสมมติว่าคุณมีลูกเต๋า 1 ลูก) "1" จะปรากฏในตัวแก้ไขดีไซน์ภายใน Android Studio เท่านั้น แต่จะไม่ปรากฏในเมื่อคุณเรียกใช้แอปในอุปกรณ์หรือโปรแกรมจําลองจริง
โปรดทราบว่านักพัฒนาแอปเป็นผู้ดูข้อความนี้เท่านั้น คุณจึงไม่จําเป็นต้องสร้างทรัพยากรสตริง
- ดูที่แอปของคุณในหน้าตัวอย่าง "1" ปรากฏอยู่
- เรียกใช้แอป นี่คือลักษณะของแอปเมื่อทํางานบนโปรแกรมจําลอง "1" ไม่แสดง นี่คือลักษณะการทํางานที่ถูกต้อง
เยี่ยม คุณทําการเปลี่ยนแปลงเลย์เอาต์เรียบร้อยแล้ว
คุณมีแอปที่มีปุ่ม แต่ถ้าแตะปุ่มดังกล่าว ไม่มีอะไรเกิดขึ้น หากต้องการเปลี่ยนการตั้งค่านี้ คุณจะต้องเขียนโค้ด Kotlin จํานวนหนึ่งที่ทอยลูกเต๋าและอัปเดตหน้าจอเมื่อแตะปุ่ม
ในการเปลี่ยนแปลงนี้ คุณจําเป็นต้องทําความเข้าใจเพิ่มเติมเล็กน้อยเกี่ยวกับวิธีจัดโครงสร้างแอป Android
Activity
จะแสดงหน้าต่างที่แอปของคุณวาด UI โดยปกติ Activity
จะแสดงเต็มหน้าจอแอปที่ทํางานอยู่ ทุกแอปมีกิจกรรมอย่างน้อย 1 กิจกรรม กิจกรรมระดับบนสุดหรือกิจกรรมแรกมักจะเรียกว่า MainActivity
และนําเสนอโดยเทมเพลตโครงการ ตัวอย่างเช่น เมื่อผู้ใช้เลื่อนดูรายการแอปในอุปกรณ์และแตะไอคอนแอป "Dice Roller" ระบบ Android จะเริ่มต้นMainActivity
ของแอป
ในโค้ด MainActivity
คุณจะต้องระบุรายละเอียดเกี่ยวกับเลย์เอาต์ของ Activity
' และแนวทางที่ผู้ใช้ควรโต้ตอบด้วย
- ในแอปการ์ดวันเกิดจะมี
Activity
1 ข้อความซึ่งแสดงข้อความและรูปภาพวันเกิด - ในแอปลูกเต๋า มี
Activity
หนึ่งภาพที่แสดงเลย์เอาต์TextView
และButton
ที่คุณเพิ่งสร้าง
แต่สําหรับแอปที่ซับซ้อนมากขึ้นอาจมีหลายหน้าจอและ Activity
มากกว่า 1 จอ Activity
แต่ละรายการมีวัตถุประสงค์ที่เฉพาะเจาะจง
เช่น ในแอปแกลเลอรีรูปภาพ คุณอาจมี Activity
สําหรับแสดงตารางกริดรูปภาพ Activity
ที่สองสําหรับการดูรูปภาพแต่ละรูป และ Activity
รายการที่ 3 สําหรับแก้ไขรูปภาพแต่ละรูป
เปิดไฟล์ MainActivity.kt
คุณจะต้องเพิ่มโค้ดเพื่อตอบสนองต่อการแตะปุ่มใน MainActivity
คุณต้องเข้าใจเพิ่มเติมเกี่ยวกับโค้ด MainActivity
ที่อยู่ในแอปอยู่แล้วเพื่อให้ดําเนินการดังกล่าวได้ถูกต้อง
- ไปที่และเปิดไฟล์
MainActivity.kt
(app > java > com.example.diceroller > MainActivity.kt) ข้อมูลที่คุณควรเห็นมีดังต่อไปนี้ หากคุณเห็นimport...
ให้คลิก...
เพื่อขยายการนําเข้า
package com.example.diceroller
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
คุณไม่จําเป็นต้องเข้าใจทุกคําข้างต้นของโค้ดข้างต้น แต่จะต้องมีแนวคิดกว้างๆ ว่าต้องทําอย่างไร ยิ่งคุณทํางานกับโค้ด Android มากเท่าใด ก็ยิ่งคุ้นเคยมากขึ้นเท่านั้น และจะเข้าใจโค้ดดังกล่าวมากขึ้น
- ดูโค้ด Kotlin สําหรับคลาส
MainActivity
ซึ่งระบุโดยคีย์เวิร์ดclass
ตามด้วยชื่อ
class MainActivity : AppCompatActivity() {
...
}
- โปรดทราบว่าไม่มีฟังก์ชัน
main()
ในMainActivity
ก่อนหน้านี้ คุณได้ทราบว่าโปรแกรม Kotlin ทุกโปรแกรมต้องมีฟังก์ชันmain()
แอป Android ทํางานแตกต่างออกไป แทนที่จะเรียกใช้ฟังก์ชันmain()
ระบบ Android จะเรียกใช้เมธอดonCreate()
ของMainActivity
เมื่อแอปของคุณเปิดเป็นครั้งแรก - ค้นหาเมธอด
onCreate()
ซึ่งมีลักษณะเหมือนโค้ดด้านล่าง
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
คุณจะเรียนรู้เกี่ยวกับ override
ใน Codelab ถัดไป (ไม่ต้องกังวลอีกต่อไปตอนนี้) เมธอด onCreate()
ที่เหลือจะตั้งค่า MainActivity
โดยใช้โค้ดจากการนําเข้าและตั้งค่าเลย์เอาต์เริ่มต้นด้วย setContentView()
- สังเกตเส้นที่ขึ้นต้นด้วย
import
Android มีกรอบการทํางานของคลาสต่างๆ มากมายเพื่อให้การเขียนแอป Android ง่ายขึ้น แต่จําเป็นต้องรู้ว่าคุณหมายถึงชั้นเรียนใด คุณระบุคลาสในเฟรมเวิร์กที่จะใช้ในโค้ดได้โดยใช้คําสั่ง import
ตัวอย่างเช่น ระบบกําหนดคลาส Button
ใน android.widget.Button
เปิดใช้การนําเข้าอัตโนมัติ
คุณอาจต้องเพิ่มคําแถลง import
รายการเมื่อใช้ชั้นเรียนเพิ่มเติม โชคดีที่ Android Studio ช่วยคุณเลือกการนําเข้าที่ถูกต้องได้เมื่อคุณใช้ชั้นเรียนที่ผู้อื่นให้ไว้ ในขั้นตอนนี้ คุณจะต้องกําหนดค่า Android Studio เพื่อเพิ่มการนําเข้าโดยอัตโนมัติเมื่อเป็นไปได้ และนําการนําเข้าที่ไม่ได้ใช้ออกจากโค้ดโดยอัตโนมัติ
- ใน Android Studio ให้เปิดการตั้งค่าโดยไปที่ File > Other Settings > Preferences for New Projects
- ขยายการตั้งค่าอื่นๆ > นําเข้าอัตโนมัติ ในส่วน Java และ Kotlin ให้เลือกเพิ่มการนําเข้าได้ทันทีได้ทันทีและเพิ่มประสิทธิภาพการนําเข้าได้ทันที (สําหรับโปรเจ็กต์ปัจจุบัน) โปรดทราบว่าแต่ละส่วนจะมีช่องทําเครื่องหมาย 2 ช่อง
การตั้งค่าการนําเข้าที่ไม่ชัดเจนจะบอกให้ Android Studio เพิ่มใบแจ้งยอดการนําเข้าโดยอัตโนมัติ ตราบใดที่ระบุได้ว่ารายการใดควรใช้ การตั้งค่าเพิ่มประสิทธิภาพการนําเข้าจะบอกให้ Android Studio นําการนําเข้าที่ไม่ได้ใช้โดยโค้ดของคุณออก - บันทึกการเปลี่ยนแปลงและปิดการตั้งค่าโดยกดตกลง
เมื่อทราบข้อมูลเพิ่มเติมเล็กน้อยเกี่ยวกับ MainActivity
แล้ว คุณจะต้องแก้ไขแอปเพื่อให้คลิก Button
ทําสิ่งต่างๆ ในหน้าจอ
แสดงข้อความเมื่อคลิกปุ่ม
ในขั้นตอนนี้ คุณจะระบุว่าเมื่อมีการคลิกปุ่ม ข้อความสั้นๆ จะแสดงที่ด้านล่างของหน้าจอ
- เพิ่มโค้ดต่อไปนี้ลงในเมธอด
onCreate()
หลังจากการเรียกsetContentView()
เมธอดfindViewById()
จะค้นหาButton
ในเลย์เอาต์R.id.button
คือรหัสทรัพยากรของButton
ซึ่งเป็นตัวระบุที่ไม่ซ้ํากัน โค้ดจะบันทึกการอ้างอิงออบเจ็กต์Button
ในตัวแปรชื่อrollButton
ไม่ใช่ออบเจ็กต์Button
เอง
val rollButton: Button = findViewById(R.id.button)
โค้ดจะบันทึกการอ้างอิงไปยังออบเจ็กต์ Button
ในตัวแปรชื่อ rollButton
ไม่ใช่ออบเจ็กต์ Button
เอง
โดยเมธอด onCreate()
ควรมีลักษณะดังนี้
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
}
- ตรวจสอบว่า Android Studio เพิ่มคําสั่ง
import
สําหรับButton
โดยอัตโนมัติแล้ว
โปรดทราบว่ามีคําสั่งนําเข้า 3 รายการในขณะนี้ คําสั่งที่ 3 จะถูกเพิ่มโดยอัตโนมัติ
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
ถัดไปคุณต้องเชื่อมโยงโค้ดกับ Button
เพื่อให้สามารถเรียกใช้โค้ดเมื่อแตะ Button
ได้ Listener การคลิกคือโค้ดสําหรับสิ่งที่ต้องทําเมื่อแตะหรือคลิก โดยคุณอาจมองว่าโค้ดนี้เป็นโค้ดแบบนั่งและฟัง ก็ได้ เพื่อให้ผู้ใช้คลิก ซึ่งในกรณีนี้คือใน Button
- ใช้ออบเจ็กต์
rollButton
และตั้งค่า Listener การคลิกบนออบเจ็กต์โดยเรียกเมธอดsetOnClickListener()
rollButton.setOnClickListener {
}
ขณะที่พิมพ์ Android Studio อาจแสดงคําแนะนําหลายรายการ ในกรณีนี้ ให้เลือกตัวเลือก setOnClickListener {...}
ภายในวงเล็บปีกกา ให้ใส่คําแนะนําถึงสิ่งที่จะเกิดขึ้นเมื่อแตะปุ่ม ในตอนนี้ คุณควรให้แอปของคุณแสดง Toast
ซึ่งเป็นข้อความสั้นๆ ที่ผู้ใช้จะเห็น
- สร้าง
Toast
ที่มีข้อความ"Dice Rolled!"
โดยโทรไปที่Toast.makeText()
val toast = Toast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT)
- จากนั้นบอกให้
Toast
แสดงตัวเองโดยเรียกเมธอดshow()
toast.show()
คลาส MainActivity
ที่คุณอัปเดตมีลักษณะเช่นนี้ คําสั่ง package
และ import
จะยังแสดงอยู่ที่ด้านบนของไฟล์
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
val toast = Toast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT)
toast.show()
}
}
}
คุณอาจรวม 2 บรรทัดนี้ใน Listener การคลิกให้เป็นบรรทัดเดียวโดยไม่มีตัวแปร ซึ่งเป็นรูปแบบที่คุณอาจพบในโค้ดอื่นๆ
Toast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT).show()
- เรียกใช้แอปและคลิกปุ่มม้วน ข้อความโทสต์จะปรากฏขึ้นมาที่ด้านล่างของหน้าจอและจะหายไปในไม่ช้า
ไชโย การคลิกปุ่มนี้จะทําให้ข้อความปรากฏขึ้น นี่เป็นครั้งแรกที่คุณเขียนโค้ด Kotlin สําหรับ Android
อัปเดต TextView เมื่อมีการคลิกปุ่ม
แทนการแสดงข้อความ Toast
ชั่วคราว คุณจะต้องเขียนโค้ดเพื่ออัปเดต TextView
บนหน้าจอเมื่อคลิกปุ่มม้วน
- กลับไปที่
activity_main.xml
(app > res >Layout >activity_main.xml) - คลิกที่
TextView
- โปรดทราบว่ารหัส [id] คือ textView
- เปิด
MainActivity.kt
(app > java > com.example.diceroller > MainActivity.kt) - ลบบรรทัดของโค้ดที่สร้างและแสดง
Toast
rollButton.setOnClickListener {
}
- ในตําแหน่งดังกล่าว ให้สร้างตัวแปรใหม่ที่เรียกว่า
resultTextView
เพื่อจัดเก็บTextView
- ใช้
findViewById()
เพื่อค้นหาtextView
ในเลย์เอาต์โดยใช้รหัสและจัดเก็บการอ้างอิงไว้
val resultTextView: TextView = findViewById(R.id.textView)
- ตั้งค่าข้อความใน
resultTextView
เป็น "6" ในเครื่องหมายคําพูด
resultTextView.text = "6"
วิธีนี้คล้ายกับที่คุณทําโดยตั้งค่า text ใน Attributes แต่ตอนนี้อยู่ในโค้ดแล้ว ข้อความจึงต้องอยู่ในเครื่องหมายคําพูด การตั้งค่านี้หมายความว่าขณะนี้ TextView
จะแสดง 6 เสมอ คุณจะเพิ่มโค้ดเพื่อทอยลูกเต๋าและแสดงค่าต่างๆ ในงานถัดไป
คลาส MainActivity
ควรมีลักษณะดังนี้
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = "6"
}
}
}
- เรียกใช้แอป คลิกที่ปุ่ม ควรอัปเดต
TextView
เป็น "6"
สิ่งเดียวที่หายไปคือลูกเต๋าจริง คุณนําคลาส Dice
มาใช้ซ้ําได้จาก Codelab ก่อนหน้า ซึ่งจะจัดการกับตรรกะสําหรับทอยลูกเต๋า
เพิ่มชั้นเรียนลูกเต๋า
- หลังจากวงเล็บปีกกาล่าสุดใน
MainActivity
ชั้นเรียน ให้สร้างชั้นเรียนDice
ด้วยเมธอดroll()
class Dice(val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
- สังเกตเห็นว่า Android Studio ขีดเส้นใต้
numSides
ด้วยเส้นสีเทา (อาจใช้เวลาสักครู่) - วางเมาส์ไว้เหนือ
numSides
และป๊อปอัปจะปรากฏขึ้นว่า Property 'numSides' อาจเป็นส่วนตัว
การทําเครื่องหมาย numSides
เป็น private
จะทําให้เข้าถึงได้ภายในชั้นเรียน Dice
เท่านั้น เนื่องจากโค้ดเดียวที่จะใช้ numSides
จะอยู่ภายในคลาส Dice
คุณจึงสร้างอาร์กิวเมนต์นี้ private
สําหรับคลาส Dice
ได้ คุณจะได้ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปร private
เทียบกับ public
รายการในหน่วยถัดไป
- เริ่มทําการแก้ไขที่แนะนําจาก Android Studio โดยคลิก Make 'numSides' 'private'
สร้างเมธอด RollDice()
เมื่อเพิ่มชั้นเรียน Dice
ลงในแอปแล้ว คุณจะต้องอัปเดต MainActivity
เพื่อใช้งาน เพื่อจัดระเบียบโค้ดให้ดีขึ้น ใส่ตรรกะทั้งหมดเกี่ยวกับการทอยลูกเต๋าเป็นฟังก์ชันเดียว
- แทนที่โค้ดใน Listener การคลิกซึ่งกําหนดข้อความเป็น "6" ด้วยการเรียก
rollDice()
rollButton.setOnClickListener {
rollDice()
}
- เนื่องจาก
rollDice()
ยังไม่ได้กําหนดขึ้น Android Studio จึงแจ้งข้อผิดพลาดและแสดงสถานะrollDice()
เป็นสีแดง - หากคุณวางเมาส์เหนือตัวชี้เหนือ
rollDice()
แล้ว Android Studio จะแสดงปัญหาและวิธีแก้ไขที่เป็นไปได้บางอย่าง
- คลิกการทํางานเพิ่มเติม... เพื่อเปิดเมนูขึ้นมา Android Studio ช่วยให้คุณทํางานได้มากขึ้น
- เลือกสร้างฟังก์ชัน 'rollDice' Android Studio จะสร้างคําจํากัดความที่ว่างเปล่าสําหรับฟังก์ชันใน
MainActivity
private fun rollDice() {
TODO("Not yet implemented")
}
สร้างอินสแตนซ์ออบเจ็กต์ลูกเต๋าใหม่
ในขั้นตอนนี้ คุณจะสร้างเมธอด rollDice()
แล้วทอยลูกเต๋า แล้วแสดงผลลัพธ์ใน TextView
- ภายใน
rollDice()
ให้ลบสายที่TODO()
- เพิ่มโค้ดเพื่อสร้างลูกเต๋า 6 ด้าน
val dice = Dice(6)
- ทอยลูกเต๋าโดยเรียกเมธอด
roll()
และบันทึกผลลัพธ์ในตัวแปรชื่อdiceRoll
val diceRoll = dice.roll()
- ค้นหา
TextView
ด้วยการโทรfindViewById()
val resultTextView: TextView = findViewById(R.id.textView)
ตัวแปร diceRoll
เป็นตัวเลข แต่ TextView
จะใช้ข้อความ คุณสามารถใช้เมธอด toString()
ใน diceRoll
เพื่อแปลงเป็นสตริงได้
- แปลง
diceRoll
เป็นสตริงและใช้เพื่ออัปเดตข้อความของresultTextView
resultTextView.text = diceRoll.toString()
เมธอด rollDice()
จะมีลักษณะดังนี้
private fun rollDice() {
val dice = Dice(6)
val diceRoll = dice.roll()
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = diceRoll.toString()
}
- เรียกใช้แอป ผลลัพธ์ลูกเต๋าควรเปลี่ยนไปเป็นค่าอื่นๆ นอกเหนือจาก 6! เนื่องจากเป็นตัวเลขที่สุ่มจาก 1 ถึง 6 ค่า 6 จึงอาจปรากฏเป็นครั้งคราวด้วย
ไชโย คุณเยี่ยมไปเลย
เป็นเรื่องปกติที่โค้ดของคุณจะดูยุ่งเหยิงเล็กน้อยหลังจากที่คุณปรับแต่งส่วนต่างๆ ที่นี่ และเพื่อให้แอปของคุณทํางานได้ แต่ก่อนที่จะเดินออกจากโค้ด คุณควรล้างข้อมูลง่ายๆ จากนี้ไปแอปจะมีรูปร่างที่ดีและดูแลรักษาแอปได้ง่ายขึ้น
พฤติกรรมเหล่านี้คือสิ่งที่นักพัฒนาซอฟต์แวร์ Android มืออาชีพจะฝึกหัดเขียนโค้ด
คู่มือรูปแบบ Android
ในการทํางานร่วมกับทีม เหมาะกับการเขียนโค้ดในทีมที่คล้ายกันเพื่อให้ความสม่ําเสมอของทั้งโค้ดตรงกัน นั่นคือเหตุผลที่ Android มี Style Guide สําหรับการเขียนโค้ด Android เช่น รูปแบบการตั้งชื่อ การจัดรูปแบบ และแนวทางปฏิบัติแนะนําอื่นๆ ปฏิบัติตามหลักเกณฑ์เหล่านี้เมื่อเขียนโค้ด Android: Kotlin Style Guide สําหรับนักพัฒนาแอป Android
ด้านล่างนี้คือ 2-3 วิธีที่คุณสามารถทําตามคู่มือรูปแบบได้
ล้างโค้ด
จํากัดโค้ดของคุณ
คุณสามารถทําให้โค้ดสั้นกระชับมากขึ้นโดยการย่อโค้ดให้มีจํานวนบรรทัดน้อยลง ตัวอย่างเช่น โค้ดที่ตั้งค่า Listener การคลิกใน Button
rollButton.setOnClickListener {
rollDice()
}
เนื่องจากวิธีการสําหรับ Listener การคลิกมีความยาวเพียง 1 บรรทัด คุณจึงจํากัดการเรียกเมธอด rollDice()
และวงเล็บปีกกาทั้งหมดให้อยู่ในบรรทัดเดียวได้ มีลักษณะดังนี้ หนึ่งบรรทัดแทนที่จะเป็นสามบรรทัด
rollButton.setOnClickListener { rollDice() }
เปลี่ยนรูปแบบโค้ด
ตอนนี้คุณจะจัดรูปแบบโค้ดใหม่เพื่อให้เป็นไปตามรูปแบบการจัดรูปแบบโค้ดที่แนะนําสําหรับ Android
- ในชั้นเรียน
MainActivity.kt
ให้เลือกข้อความทั้งหมดในไฟล์ด้วยแป้นพิมพ์ลัดControl+A
ใน Windows (หรือCommand+A
ใน Mac) หรือคุณอาจไปที่เมนูใน Android Studio แก้ไข > เลือกทั้งหมด - เมื่อเลือกข้อความทั้งหมดในไฟล์ ให้ไปที่เมนู Android Studio Code > Reformat Code หรือใช้แป้นพิมพ์ลัด
Ctrl+Alt+L
(หรือCommand+Option+L
ใน Mac)
ซึ่งจะอัปเดตการจัดรูปแบบของโค้ด ซึ่งรวมถึงช่องว่าง การเยื้อง และอื่นๆ คุณอาจไม่เห็นการเปลี่ยนแปลงใดๆ ซึ่งก็ไม่มีปัญหา โค้ดของคุณมีรูปแบบที่ถูกต้องอยู่แล้ว
แสดงความคิดเห็นในรหัส
เพิ่มความคิดเห็นลงในโค้ดเพื่ออธิบายสิ่งที่เกิดขึ้นในโค้ดที่คุณเขียน เนื่องจากโค้ดมีความซับซ้อนมากขึ้น คุณจึงควรจดเหตุผลที่คุณเขียนโค้ดไว้ด้วยเพื่อให้ทํางานตามที่คุณต้องการ หากกลับมาเปลี่ยนแปลงโค้ดในภายหลัง โค้ดอาจจะยังชัดเจนอยู่ แต่คุณจะจําไม่ได้ว่าเหตุใดจึงเขียนแบบที่คุณทํา
โดยปกติแล้วการเพิ่มความคิดเห็นไปยังแต่ละชั้นเรียน (MainActivity
และ Dice
เป็นคลาสเดียวที่คุณมีในแอป) และวิธีการเขียนทั้งหมด ใช้สัญลักษณ์ /**
และ **/
ในตอนต้นและตอนท้ายของความคิดเห็น เพื่อแจ้งระบบว่านี่ไม่ใช่โค้ด ระบบจะไม่สนใจบรรทัดเหล่านี้เมื่อระบบเรียกใช้โค้ด
ตัวอย่างความคิดเห็นในชั้นเรียน
/**
* This activity allows the user to roll a dice and view the result
* on the screen.
*/
class MainActivity : AppCompatActivity() {
ตัวอย่างความคิดเห็นในเมธอด
/**
* Roll the dice and update the screen with the result.
*/
private fun rollDice() {
ภายในเมธอด คุณจะเพิ่มความคิดเห็นได้อิสระหากความคิดเห็นนั้นมีประโยชน์ต่อผู้อ่านโค้ดของคุณ โปรดทราบว่าคุณสามารถใช้สัญลักษณ์ //
ในตอนต้นของความคิดเห็นได้ ทุกสิ่งที่อยู่หลังสัญลักษณ์ //
บนบรรทัดจะถือว่าเป็นความคิดเห็น
ตัวอย่างความคิดเห็น 2 รายการในเมธอด
private fun rollDice() {
// Create new Dice object with 6 sides and roll it
val dice = Dice(6)
val diceRoll = dice.roll()
// Update the screen with the dice roll
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = diceRoll.toString()
}
- ลองใช้เวลาสักครู่เพื่อเพิ่มความคิดเห็นลงในโค้ด
- การเปลี่ยนแปลงที่มีการแสดงความคิดเห็นและการจัดรูปแบบเหล่านี้ถือเป็นแนวทางปฏิบัติที่ดีเพื่อเรียกใช้แอปอีกครั้งเพื่อให้แน่ใจว่าแอปจะยังทํางานตามที่คาดหวัง
ดูโค้ดโซลูชันสําหรับวิธีที่คุณอาจแสดงความคิดเห็นเกี่ยวกับโค้ดได้
โค้ดโซลูชันสําหรับ Codelab นี้อยู่ในโปรเจ็กต์และโมดูลที่แสดงด้านล่าง
หากต้องการรับรหัสสําหรับ Codelab นี้จาก GitHub และเปิดใน Android Studio ให้ทําตามขั้นตอนต่อไปนี้
- เริ่ม Android Studio
- คลิกดูโปรเจ็กต์จากการควบคุมเวอร์ชันในหน้าต่างยินดีต้อนรับสู่ Android Studio
- เลือก Git
- ในกล่องโต้ตอบโคลนที่เก็บ ให้วาง URL ของโค้ดที่ให้ไว้ลงในช่อง URL
- คลิกปุ่มทดสอบ แล้วตรวจสอบว่ามีลูกโป่งป๊อปอัปสีเขียวที่ระบุว่าเชื่อมต่อสําเร็จแล้ว
- คุณเปลี่ยนไดเรกทอรีเป็นอย่างอื่นที่ไม่ใช่ค่าเริ่มต้นที่แนะนําได้
- คลิกโคลน Android Studio จะเริ่มดึงโค้ดของคุณ
- ในป๊อปอัปชําระเงินจากการควบคุมเวอร์ชัน ให้คลิกใช่
- รอให้ Android Studio เปิด
- เลือกโมดูลที่ถูกต้องสําหรับโค้ดเริ่มต้นสําหรับ Codelab หรือโค้ดโซลูชัน
- คลิกปุ่มเรียกใช้
เพื่อสร้างและเรียกใช้โค้ด
- เพิ่ม
Button
ในแอป Android โดยใช้เครื่องมือแก้ไขเลย์เอาต์ - แก้ไขคลาส
MainActivity.kt
เพื่อเพิ่มลักษณะการทํางานแบบอินเทอร์แอกทีฟในแอป - แสดงข้อความ
Toast
เป็นโซลูชันชั่วคราวเพื่อยืนยันว่าคุณอยู่ในเส้นทางที่ถูกต้อง - ตั้งค่า Listener การคลิกสําหรับ
Button
โดยใช้setOnClickListener()
เพื่อเพิ่มลักษณะการทํางานเมื่อคลิกButton
- เมื่อแอปทํางาน คุณสามารถอัปเดตหน้าจอโดยเรียกเมธอดใน
TextView
,Button
หรือองค์ประกอบ UI อื่นๆ ในเลย์เอาต์ - แสดงความคิดเห็นเกี่ยวกับโค้ดเพื่อช่วยให้ผู้อื่นที่อ่านรหัสของคุณได้ทราบว่าแนวทางของคุณเป็นอย่างไร
- เปลี่ยนรูปแบบโค้ดและล้างโค้ด
- ชั้นเรียน
Button
- ชั้นเรียน
Toast
- ชั้นเรียน
TextView
- คู่มือรูปแบบ Kotlin สําหรับนักพัฒนาแอป Android
สิ่งที่คุณทําได้มีดังนี้
- เพิ่มลูกเต๋าอื่นในแอป การคลิกปุ่มกลิ้งควรทอยลูกเต๋า 2 ลูก ผลลัพธ์ควรแสดงใน
TextViews
ที่แตกต่างกัน 2 รายการบนหน้าจอ
ตรวจสอบงาน
แอปที่สร้างเสร็จแล้วควรจะทํางานโดยไม่มีข้อผิดพลาดและแสดงลูกเต๋า 2 ลูกในแอป