คุณจัดกลุ่มเป้าหมายโฟกัสหลายรายการเข้าด้วยกันได้โดยใช้ตัวแก้ไข focusGroup
การจัดกลุ่มช่วยให้คุณจัดการลำดับชั้นของโฟกัส แยกภูมิภาค UI เชิงตรรกะ (เช่น
แถบเครื่องมือ การดำเนินการในกล่องโต้ตอบ หรือรายการการ์ด) และสกัดกั้นเมื่อโฟกัสเข้าหรือ
ออกจากภูมิภาค
แนวคิดการสนทนากลุ่ม: เข้า ออก และการไปยังส่วนต่างๆ เริ่มต้น
การสนทนากลุ่มจะสร้างขอบเขตการนำทางที่สอดคล้องกันรอบเป้าหมายโฟกัสย่อย การทำความเข้าใจวิธีที่โฟกัสเคลื่อนที่ข้ามขอบเขตนี้ขึ้นอยู่กับแนวคิดสำคัญ 2 ประการต่อไปนี้
- เข้า: เหตุการณ์ที่เกิดขึ้นเมื่อโฟกัสเปลี่ยนจากองค์ประกอบใดก็ตาม นอกกลุ่มโฟกัสไปยังองค์ประกอบภายในกลุ่ม
- ออก: เหตุการณ์ที่เกิดขึ้นเมื่อโฟกัสออกจากองค์ประกอบภายในสุดท้ายของ กลุ่มและเปลี่ยนไปเป็นเป้าหมายโฟกัสภายนอก
ลักษณะการทำงานเริ่มต้นของการย้ายโฟกัส
โดยค่าเริ่มต้น เมื่อการสนทนากลุ่มได้รับโฟกัสจากภายนอก จะเกิดสิ่งต่อไปนี้
- การเข้าสู่กลุ่ม: Compose จะเลือกเป้าหมายโฟกัสภายในที่เป็นเด็กโดยอัตโนมัติ สำหรับการไปยังส่วนต่างๆ แบบมิติเดียว (Tab) ระบบจะเลือกองค์ประกอบย่อยแรกตามลำดับการแสดงผล สำหรับการไปยังส่วนต่างๆ แบบ 2 มิติ (ปุ่มลูกศรหรือ D-pad) ระบบจะเลือกองค์ประกอบย่อยที่อยู่ใกล้กับทิศทาง ที่เข้ามามากที่สุด
- การไปยังส่วนต่างๆ ภายในกลุ่ม: การกดปุ่มนำทางซ้ำๆ จะย้ายโฟกัส ไปยังเป้าหมายโฟกัสที่อยู่ระดับเดียวกันซึ่งอยู่ในกลุ่ม
- ออกจากกลุ่ม: เมื่อผู้ใช้ไปยังเป้าหมายโฟกัสสุดท้าย ภายในกลุ่มแล้ว การกดแป้นครั้งถัดไปจะออกจากกลุ่มและย้ายโฟกัสไปยัง เป้าหมายโฟกัสที่อยู่ติดกันนอกกลุ่ม
ปรับแต่งการเปลี่ยนเส้นทางเมื่อเข้าสู่โหมดโฟกัส
ในการออกแบบ UI หลายๆ แบบ เป้าหมายเริ่มต้น (เช่น องค์ประกอบย่อยแรกในลำดับการแสดง) ไม่ใช่ตัวเลือกที่สมเหตุสมผลหรือสะดวกที่สุดสำหรับผู้ใช้
เจตนาและกรณีการใช้งาน
พิจารณากล่องโต้ตอบการยืนยันที่มีปุ่ม "ยกเลิก" ทางด้านซ้ายและปุ่ม "ยืนยัน" หลักทางด้านขวา เมื่อผู้ใช้ไปยังแถบปุ่มจากช่องแบบฟอร์ม
- ลักษณะการทำงานเริ่มต้น: โฟกัสจะไปที่ "ยกเลิก" เนื่องจากเป็นปุ่มแรก ตามลำดับการแสดงผล
- ลักษณะการทำงานที่ต้องการ: เนื่องจาก "ยืนยัน" เป็นการดำเนินการที่แนะนำหลัก คุณอาจต้องการให้โฟกัสไปที่ "ยืนยัน" โดยตรงเมื่อเข้าสู่กลุ่มปุ่ม จากก่อนหน้าในลำดับโฟกัส ขณะเดียวกันก็ยังอนุญาตให้ผู้ใช้ กดซ้ายเพื่อเลือก "ยกเลิก" ได้หากต้องการ
กรณีการใช้งานอื่นๆ ที่พบบ่อยมีดังนี้
- ย้ายโฟกัสไปยังแท็บที่เลือกอยู่ในปัจจุบันโดยตรงเมื่อป้อน
TabRow - ย้ายโฟกัสไปยังตัวควบคุม "เล่น / หยุดชั่วคราว" โดยตรงเมื่อเข้าสู่แถบการเล่นสื่อ
การใช้งานด้วย onEnter และ FocusRequester
วิธีเปลี่ยนเส้นทางโฟกัสเมื่อเข้าสู่การสนทนากลุ่ม
- ใช้ตัวแก้ไข
focusGroupกับคอนเทนเนอร์หลัก ที่ครอบคลุมเป้าหมายโฟกัสที่เกี่ยวข้อง - ใช้ตัวแก้ไข
focusPropertiesกับคอนเทนเนอร์ และกำหนดค่าการเรียกกลับonEnter - ใน
onEnterการเรียกกลับ (กำหนดขอบเขตเป็นFocusEnterExitScope) เรียกใช้requestFocus()ในFocusRequesterที่เชื่อมโยงกับ ค่าเริ่มต้นของบุตรหลานที่ต้องการโดยใช้focusRequester
val defaultChildRequester = remember { FocusRequester() } Row( modifier = Modifier .focusGroup() .focusProperties { // Intercept entry into this group and redirect focus to the primary action onEnter = { defaultChildRequester.requestFocus() } } ) { Button(onClick = { /* Cancel action */ }) { Text("Cancel") } Button( onClick = { /* Confirm action */ }, modifier = Modifier.focusRequester(defaultChildRequester) ) { Text("Confirm (Default)") } }
ภายใน onEnter และ onExit คุณยังเรียกใช้ cancelFocusChange() เพื่อ
บล็อกการเปลี่ยนโฟกัสข้ามขอบเขตโดยสมบูรณ์ หรือตรวจสอบ
requestedFocusDirection เพื่อปรับแต่งการกำหนดเส้นทางตามว่าผู้ใช้
ไปยังส่วนต่างๆ โดยใช้ Tab, Down หรือ Left หรือไม่
คอนเทนเนอร์ที่เลื่อนได้จะเป็นกลุ่มโฟกัสโดยค่าเริ่มต้น
ใน Jetpack Compose คอนเทนเนอร์ที่เลื่อนได้ เช่น LazyRow, LazyColumn และ LazyVerticalGrid จะทําหน้าที่เป็นกลุ่มโฟกัสโดยอัตโนมัติ
คุณไม่จำเป็นต้องใช้ตัวแก้ไข focusGroup กับองค์ประกอบเหล่านั้นอย่างชัดเจนเพื่อตั้งค่าการเรียกกลับ onEnter หรือ onExit
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- เป้าหมายโฟกัส
- ลำดับการส่งผ่านโฟกัส
- โฟกัสในช่องข้อความ
- คืนค่าโฟกัส
- ขอโฟกัสโดยใช้โปรแกรม
- ทดสอบการไปยังส่วนต่างๆ โดยใช้โฟกัส