หากแอปพลิเคชันของคุณต้องใช้คอมโพเนนต์มุมมองที่กำหนดเอง คุณต้องทำให้มุมมองเข้าถึงได้มากขึ้น ขั้นตอนต่อไปนี้จะช่วยปรับปรุงการช่วยเหลือพิเศษของมุมมองที่กำหนดเอง ตามที่อธิบายไว้ในหน้านี้
- จัดการการคลิกตัวควบคุมทิศทาง
- ใช้เมธอด Accessibility API
- ส่งออบเจ็กต์
AccessibilityEventที่เฉพาะเจาะจงกับมุมมองที่กําหนดเอง - ป้อนข้อมูล
AccessibilityEventและAccessibilityNodeInfoสำหรับข้อมูลพร็อพเพอร์ตี้
จัดการการคลิกตัวควบคุมทิศทาง
ในอุปกรณ์ส่วนใหญ่ การคลิกมุมมองโดยใช้ตัวควบคุมทิศทางจะส่ง
KeyEventพร้อม
KEYCODE_DPAD_CENTER
ไปยังมุมมองที่โฟกัสอยู่ มุมมอง Android มาตรฐานทั้งหมดจะจัดการ
KEYCODE_DPAD_CENTERได้อย่างเหมาะสม เมื่อสร้างตัวควบคุมที่กำหนดเอง
View
โปรดตรวจสอบว่าเหตุการณ์นี้มีผลเช่นเดียวกับการแตะมุมมองบนหน้าจอสัมผัส
ตัวควบคุมที่กำหนดเองต้องถือว่าเหตุการณ์
KEYCODE_ENTER
เหมือนกับ KEYCODE_DPAD_CENTER ซึ่งจะช่วยให้ผู้ใช้โต้ตอบกับแป้นพิมพ์แบบเต็มได้ง่ายขึ้น
ใช้เมธอด Accessibility API
เหตุการณ์การช่วยเหลือพิเศษคือข้อความเกี่ยวกับการโต้ตอบของผู้ใช้กับคอมโพเนนต์อินเทอร์เฟซภาพของแอป
บริการการช่วยเหลือพิเศษจะจัดการข้อความเหล่านี้ ซึ่งจะใช้ข้อมูลในเหตุการณ์เหล่านี้เพื่อสร้างความคิดเห็นและพรอมต์เสริม วิธีการช่วยเหลือพิเศษ
เป็นส่วนหนึ่งของชั้นเรียน View และ
View.AccessibilityDelegate
โดยมีวิธีดังนี้
dispatchPopulateAccessibilityEvent()onPopulateAccessibilityEvent() สำหรับมุมมองนี้
แล้วเรียกเมธอด dispatchPopulateAccessibilityEvent() สำหรับแต่ละรายการย่อยของมุมมองนี้
onInitializeAccessibilityEvent()TextView หรือ
Button ให้ลบล้างเมธอดนี้
และตั้งค่าข้อมูลเพิ่มเติมเกี่ยวกับมุมมอง เช่น ประเภทช่องรหัสผ่าน ประเภทช่องทำเครื่องหมาย
หรือสถานะที่ให้การโต้ตอบของผู้ใช้หรือความคิดเห็นลงในเหตุการณ์ โดยใช้เมธอดนี้ หากคุณลบล้างเมธอดนี้ ให้เรียกใช้การติดตั้งใช้งานระดับบนสุดและแก้ไขเฉพาะพร็อพเพอร์ตี้
ที่ไม่ได้ตั้งค่าโดยคลาสระดับบนสุดonInitializeAccessibilityNodeInfo()Viewมีชุดพร็อพเพอร์ตี้ของมุมมองมาตรฐาน แต่หากมุมมองที่กำหนดเอง
มีการควบคุมแบบอินเทอร์แอกทีฟนอกเหนือจาก TextView หรือ
Button ให้ลบล้างเมธอดนี้และตั้งค่าข้อมูลเพิ่มเติมเกี่ยวกับมุมมองของคุณ
ในออบเจ็กต์ AccessibilityNodeInfo ที่เมธอดนี้จัดการonPopulateAccessibilityEvent()AccessibilityEvent สำหรับมุมมองของคุณ
นอกจากนี้ ระบบจะเรียกใช้เมธอดนี้หากมุมมองเป็นมุมมองย่อยของมุมมองที่สร้างเหตุการณ์การช่วยเหลือพิเศษ
onRequestSendAccessibilityEvent()AccessibilityEvent ขั้นตอนนี้ช่วยให้มุมมองสำหรับพ่อแม่ดูและแก้ไขเหตุการณ์การช่วยเหลือพิเศษ
พร้อมข้อมูลเพิ่มเติมได้ ใช้เมธอดนี้เฉพาะในกรณีที่มุมมองที่กำหนดเองมี
มุมมองย่อย และหากมุมมองระดับบนสามารถให้ข้อมูลบริบทแก่เหตุการณ์การช่วยเหลือพิเศษ
ซึ่งเป็นประโยชน์ต่อบริการช่วยเหลือพิเศษsendAccessibilityEvent()- ระบบจะเรียกใช้เมธอดนี้เมื่อผู้ใช้ดำเนินการกับมุมมอง ระบบจะจัดประเภทเหตุการณ์ด้วย
ประเภทการดำเนินการของผู้ใช้ เช่น
TYPE_VIEW_CLICKEDโดยทั่วไป คุณต้องส่งAccessibilityEventทุกครั้งที่เนื้อหาของมุมมองที่กำหนดเองมีการเปลี่ยนแปลง sendAccessibilityEventUnchecked()- ใช้วิธีนี้เมื่อโค้ดที่เรียกใช้ต้องควบคุมการตรวจสอบโดยตรงว่า
มีการเปิดใช้การช่วยเหลือพิเศษในอุปกรณ์หรือไม่
(
AccessibilityManager.isEnabled()) หากใช้วิธีนี้ ให้เรียกใช้ราวกับว่ามีการเปิดใช้การช่วยเหลือพิเศษ ไม่ว่าการตั้งค่าระบบจะเป็นอย่างไรก็ตาม โดยปกติแล้ว คุณไม่จำเป็นต้องใช้วิธีนี้สำหรับมุมมองที่กำหนดเอง dispatchPopulateAccessibilityEvent()onInitializeAccessibilityEvent()onInitializeAccessibilityNodeInfo()onPopulateAccessibilityEvent()TYPE_VIEW_CLICKEDTYPE_VIEW_FOCUSEDTYPE_VIEW_HOVER_ENTERTYPE_VIEW_HOVER_EXITTYPE_VIEW_LONG_CLICKEDTYPE_VIEW_SCROLLED- สร้าง
AccessibilityEventที่เหมาะสมสำหรับการดำเนินการคลิกที่ตีความ - เปิดใช้บริการการช่วยเหลือพิเศษเพื่อดำเนินการคลิกที่กำหนดเองสำหรับผู้ใช้ที่ไม่สามารถใช้หน้าจอสัมผัส ได้
หากต้องการรองรับการช่วยเหลือพิเศษ ให้ลบล้างและใช้วิธีการช่วยเหลือพิเศษข้างต้นโดยตรงในคลาสของมุมมองที่กำหนดเอง
อย่างน้อย ให้ใช้เมธอดการช่วยเหลือพิเศษต่อไปนี้สำหรับคลาสมุมมองที่กำหนดเองของคุณ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้เมธอดเหล่านี้ได้ที่ส่วนเกี่ยวกับ การป้อนข้อมูลเหตุการณ์การช่วยเหลือพิเศษ
ส่งเหตุการณ์การช่วยเหลือพิเศษ
ขึ้นอยู่กับรายละเอียดของมุมมองที่กําหนดเอง คุณอาจต้องส่งออบเจ็กต์ AccessibilityEvent ในเวลาที่ต่างกันหรือสําหรับเหตุการณ์ที่การติดตั้งใช้งานเริ่มต้นไม่ได้จัดการ คลาส View มีการติดตั้งใช้งานเริ่มต้นสำหรับประเภทเหตุการณ์ต่อไปนี้
โดยทั่วไป คุณต้องส่ง AccessibilityEvent ทุกครั้งที่เนื้อหาของมุมมองที่กำหนดเองมีการเปลี่ยนแปลง ตัวอย่างเช่น หากคุณกําลังใช้แถบเลื่อนที่กําหนดเองซึ่งช่วยให้ผู้ใช้เลือกค่าตัวเลขได้โดยการกดปุ่มลูกศรซ้ายหรือขวา มุมมองที่กําหนดเองจะต้องปล่อยเหตุการณ์ของ
TYPE_VIEW_TEXT_CHANGED
ทุกครั้งที่ค่าแถบเลื่อนเปลี่ยนแปลง ตัวอย่างโค้ดต่อไปนี้แสดงการใช้เมธอด
sendAccessibilityEvent() เพื่อรายงานเหตุการณ์นี้
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when(keyCode) { KeyEvent.KEYCODE_DPAD_LEFT -> { currentValue-- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) true } ... } }
Java
@Override public boolean onKeyUp (int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { currentValue--; sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); return true; } ... }
ป้อนข้อมูลกิจกรรมการช่วยเหลือพิเศษ
แต่ละ AccessibilityEvent มีชุดพร็อพเพอร์ตี้ที่จำเป็นซึ่งอธิบายสถานะปัจจุบันของมุมมอง พร็อพเพอร์ตี้เหล่านี้รวมถึงสิ่งต่างๆ เช่น ชื่อคลาสของมุมมอง คำอธิบายเนื้อหา และสถานะที่เลือก พร็อพเพอร์ตี้ที่เฉพาะเจาะจงซึ่งจำเป็นสำหรับเหตุการณ์แต่ละประเภทจะอธิบายไว้ใน
AccessibilityEvent
เอกสารอ้างอิง
การติดตั้งใช้งาน View จะระบุค่าเริ่มต้นสำหรับพร็อพเพอร์ตี้ที่ต้องระบุเหล่านี้
ค่าเหล่านี้หลายค่า รวมถึงชื่อคลาสและการประทับเวลาของเหตุการณ์ จะระบุโดยอัตโนมัติ หากสร้างคอมโพเนนต์มุมมองที่กำหนดเอง คุณต้องระบุข้อมูล
เกี่ยวกับเนื้อหาและลักษณะของมุมมอง ข้อมูลนี้อาจเป็นเพียงป้ายกำกับปุ่ม
และอาจรวมถึงข้อมูลสถานะเพิ่มเติมที่คุณต้องการเพิ่มลงในเหตุการณ์
ใช้วิธีการ
onPopulateAccessibilityEvent()
และ
onInitializeAccessibilityEvent()
เพื่อป้อนหรือแก้ไขข้อมูลใน AccessibilityEvent ใช้
onPopulateAccessibilityEvent()เมธอดสำหรับการเพิ่มหรือแก้ไขข้อความ
เนื้อหาของเหตุการณ์โดยเฉพาะ ซึ่งจะเปลี่ยนเป็นข้อความแจ้งที่ได้ยินโดยบริการช่วยเหลือพิเศษ เช่น
TalkBack ใช้เมธอด onInitializeAccessibilityEvent() เพื่อป้อนข้อมูลเพิ่มเติม
เกี่ยวกับเหตุการณ์ เช่น สถานะการเลือกของมุมมอง
นอกจากนี้ ให้ใช้เมธอด
onInitializeAccessibilityNodeInfo()
บริการการช่วยเหลือพิเศษใช้AccessibilityNodeInfoออบเจ็กต์ที่สร้างขึ้นโดยเมธอดนี้ เพื่อตรวจสอบลำดับชั้นการแสดงผลที่สร้างเหตุการณ์การช่วยเหลือพิเศษหลังจากได้รับ และให้ความคิดเห็นที่เหมาะสมแก่ผู้ใช้
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีลบล้างเมธอดทั้ง 3 นี้ในมุมมอง
Kotlin
override fun onPopulateAccessibilityEvent(event: AccessibilityEvent?) { super.onPopulateAccessibilityEvent(event) // Call the super implementation to populate its text for the // event. Then, add text not present in a super class. // You typically only need to add the text for the custom view. if (text?.isNotEmpty() == true) { event?.text?.add(text) } } override fun onInitializeAccessibilityEvent(event: AccessibilityEvent?) { super.onInitializeAccessibilityEvent(event) // Call the super implementation to let super classes // set appropriate event properties. Then, add the new checked // property that is not supported by a super class. event?.isChecked = isChecked() } override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo?) { super.onInitializeAccessibilityNodeInfo(info) // Call the super implementation to let super classes set // appropriate info properties. Then, add the checkable and checked // properties that are not supported by a super class. info?.isCheckable = true info?.isChecked = isChecked() // You typically only need to add the text for the custom view. if (text?.isNotEmpty() == true) { info?.text = text } }
Java
@Override public void onPopulateAccessibilityEvent(AccessibilityEvent event) { super.onPopulateAccessibilityEvent(event); // Call the super implementation to populate its text for the // event. Then, add the text not present in a super class. // You typically only need to add the text for the custom view. CharSequence text = getText(); if (!TextUtils.isEmpty(text)) { event.getText().add(text); } } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); // Call the super implementation to let super classes // set appropriate event properties. Then, add the new checked // property that is not supported by a super class. event.setChecked(isChecked()); } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); // Call the super implementation to let super classes set // appropriate info properties. Then, add the checkable and checked // properties that are not supported by a super class. info.setCheckable(true); info.setChecked(isChecked()); // You typically only need to add the text for the custom view. CharSequence text = getText(); if (!TextUtils.isEmpty(text)) { info.setText(text); } }
คุณสามารถใช้วิธีการเหล่านี้ได้โดยตรงในคลาสมุมมองที่กำหนดเอง
ระบุบริบทการช่วยเหลือพิเศษที่ปรับแต่งแล้ว
บริการการช่วยเหลือพิเศษสามารถตรวจสอบลำดับชั้นการแสดงผลของมุมมองที่ประกอบด้วยคอมโพเนนต์อินเทอร์เฟซผู้ใช้ที่สร้างเหตุการณ์การช่วยเหลือพิเศษ ซึ่งจะช่วยให้บริการการช่วยเหลือพิเศษให้ข้อมูลตามบริบทที่ละเอียดยิ่งขึ้นเพื่อช่วยเหลือผู้ใช้ได้
มีบางกรณีที่บริการการช่วยเหลือพิเศษไม่ได้รับข้อมูลที่เพียงพอจากลำดับชั้นของมุมมอง ตัวอย่างขององค์ประกอบนี้คือตัวควบคุมอินเทอร์เฟซที่กำหนดเองซึ่งมีพื้นที่ที่คลิกได้แยกกันตั้งแต่ 2 พื้นที่ขึ้นไป เช่น ตัวควบคุมปฏิทิน ในกรณีนี้ บริการจะไม่ได้รับข้อมูลที่เพียงพอ เนื่องจากส่วนย่อยที่คลิกได้ไม่ได้เป็นส่วนหนึ่งของลำดับชั้นการแสดงผล
รูปที่ 1 มุมมองปฏิทินที่กำหนดเองซึ่งมีองค์ประกอบวันให้เลือก
ในตัวอย่างในรูปที่ 1 ปฏิทินทั้งหมดได้รับการติดตั้งใช้งานเป็นมุมมองเดียว ดังนั้นบริการช่วยเหลือพิเศษ จึงไม่ได้รับข้อมูลเพียงพอเกี่ยวกับเนื้อหาของมุมมองและการเลือกของผู้ใช้ ภายในมุมมอง เว้นแต่ว่านักพัฒนาแอปจะให้ข้อมูลเพิ่มเติม ตัวอย่างเช่น หากผู้ใช้คลิกวันที่ที่ติดป้ายกำกับว่า 17 เฟรมเวิร์กการช่วยเหลือพิเศษจะได้รับข้อมูลคำอธิบาย สำหรับตัวควบคุมปฏิทินทั้งหมดเท่านั้น ในกรณีนี้ บริการการช่วยเหลือพิเศษของ TalkBack จะประกาศว่า "ปฏิทิน" หรือ "ปฏิทินเดือนเมษายน" และผู้ใช้จะไม่ทราบว่ามีการเลือกวันใด
เฟรมเวิร์กมีวิธีระบุลำดับชั้นการแสดงผลเสมือนเพื่อให้ข้อมูลบริบทที่เพียงพอสำหรับบริการการช่วยเหลือพิเศษในสถานการณ์เช่นนี้ ลำดับชั้นการแสดงผลเสมือนจริงเป็นวิธีที่นักพัฒนาแอปใช้เพื่อจัดเตรียมลำดับชั้นการแสดงผลเสริมให้กับบริการการช่วยเหลือพิเศษ ซึ่งจะตรงกับข้อมูลบนหน้าจอมากขึ้น แนวทางนี้ช่วยให้บริการช่วยเหลือพิเศษสามารถให้ข้อมูลบริบทที่เป็นประโยชน์มากขึ้นแก่ผู้ใช้ได้
อีกสถานการณ์ที่อาจต้องใช้ลำดับชั้นการแสดงผลเสมือนคืออินเทอร์เฟซผู้ใช้ที่มี ชุดViewตัวควบคุมที่มีฟังก์ชันที่เกี่ยวข้องอย่างใกล้ชิด ซึ่งการดำเนินการในตัวควบคุมหนึ่ง จะส่งผลต่อเนื้อหาขององค์ประกอบอย่างน้อย 1 รายการ เช่น ตัวเลือกตัวเลขที่มีปุ่มขึ้น และลงแยกกัน ในกรณีนี้ บริการช่วยเหลือพิเศษจะไม่ได้รับข้อมูลที่เพียงพอเนื่องจาก
การดำเนินการในตัวควบคุมหนึ่งจะเปลี่ยนเนื้อหาในอีกตัวควบคุมหนึ่ง และความสัมพันธ์ของตัวควบคุมเหล่านั้นอาจไม่
ชัดเจนสำหรับบริการ
หากต้องการจัดการกับสถานการณ์นี้ ให้จัดกลุ่มการควบคุมที่เกี่ยวข้องกับมุมมองที่ประกอบอยู่ และระบุลำดับชั้นการแสดงผลเสมือนจากคอนเทนเนอร์นี้เพื่อแสดงข้อมูลและลักษณะการทำงานที่การควบคุมระบุไว้อย่างชัดเจน
หากต้องการระบุลำดับชั้นการแสดงผลเสมือนสำหรับมุมมอง ให้ลบล้างเมธอด
getAccessibilityNodeProvider()
ในมุมมองที่กำหนดเองหรือกลุ่มการแสดงผล แล้วส่งคืนการใช้งานของ
AccessibilityNodeProvider
คุณสามารถใช้ลำดับชั้นมุมมองเสมือนได้โดยใช้ Support Library กับเมธอด
ViewCompat.getAccessibilityNodeProvider()
และระบุการติดตั้งใช้งานด้วย
AccessibilityNodeProviderCompat
หากต้องการลดความซับซ้อนของงานในการให้ข้อมูลแก่บริการการช่วยเหลือพิเศษและการจัดการโฟกัสการช่วยเหลือพิเศษ คุณสามารถใช้ExploreByTouchHelperแทนได้
โดยจะให้ AccessibilityNodeProviderCompat และสามารถแนบเป็น AccessibilityDelegateCompat ของมุมมองได้โดยการเรียกใช้
setAccessibilityDelegate
ดูตัวอย่างได้ที่
ExploreByTouchHelperActivity
ExploreByTouchHelper ยังใช้โดยวิดเจ็ตเฟรมเวิร์ก เช่น
CalendarView ผ่าน
มุมมองย่อย
SimpleMonthView
จัดการเหตุการณ์การสัมผัสที่กำหนดเอง
การควบคุมมุมมองที่กำหนดเองอาจต้องใช้ลักษณะการทำงานของการโต้ตอบแบบสัมผัสที่ไม่เป็นไปตามมาตรฐาน ดังที่แสดงใน ตัวอย่างต่อไปนี้
กำหนดการกระทำที่อิงตามการคลิก
หากวิดเจ็ตใช้อินเทอร์เฟซ
OnClickListener หรือ
OnLongClickListener
ระบบจะจัดการการดำเนินการ
ACTION_CLICK
และ
ACTION_LONG_CLICK
ให้คุณ หากแอปใช้วิดเจ็ตที่ปรับแต่งมากขึ้นซึ่งอาศัยอินเทอร์เฟซ
OnTouchListener
ให้กำหนดตัวแฮนเดิลที่กำหนดเองสำหรับการดำเนินการเพื่อการช่วยเหลือพิเศษที่อิงตามการคลิก โดยเรียกใช้เมธอด
replaceAccessibilityAction()
สําหรับการกระทําแต่ละอย่าง ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... // Assumes that the widget is designed to select text when tapped, and selects // all text when tapped and held. In its strings.xml file, this app sets // "select" to "Select" and "select_all" to "Select all". ViewCompat.replaceAccessibilityAction( binding.textSelectWidget, ACTION_CLICK, getString(R.string.select) ) { view, commandArguments -> selectText() } ViewCompat.replaceAccessibilityAction( binding.textSelectWidget, ACTION_LONG_CLICK, getString(R.string.select_all) ) { view, commandArguments -> selectAllText() } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { ... // Assumes that the widget is designed to select text when tapped, and select // all text when tapped and held. In its strings.xml file, this app sets // "select" to "Select" and "select_all" to "Select all". ViewCompat.replaceAccessibilityAction( binding.textSelectWidget, ACTION_CLICK, getString(R.string.select), (view, commandArguments) -> selectText()); ViewCompat.replaceAccessibilityAction( binding.textSelectWidget, ACTION_LONG_CLICK, getString(R.string.select_all), (view, commandArguments) -> selectAllText()); }
สร้างเหตุการณ์คลิกที่กำหนดเอง
ตัวควบคุมที่กำหนดเองสามารถใช้onTouchEvent(MotionEvent)เมธอด Listener เพื่อตรวจหาเหตุการณ์ACTION_DOWNและACTION_UP และทริกเกอร์กิจกรรมการคลิกพิเศษ โค้ดที่จัดการกิจกรรมการคลิกที่กำหนดเองนี้ต้องทำสิ่งต่อไปนี้เพื่อให้ยังคงใช้งานร่วมกับบริการการช่วยเหลือพิเศษได้
หากต้องการจัดการข้อกำหนดเหล่านี้อย่างมีประสิทธิภาพ โค้ดของคุณต้องลบล้างเมธอด
performClick()
ซึ่งต้องเรียกใช้การติดตั้งใช้งานระดับบนสุดของเมธอดนี้ แล้วจึงดำเนินการใดก็ตามที่
กิจกรรมการคลิกกำหนด เมื่อตรวจพบการคลิกที่กำหนดเอง โค้ดนั้นจะต้องเรียกใช้เมธอด performClick() ของคุณ ตัวอย่างโค้ดต่อไปนี้แสดงรูปแบบนี้
Kotlin
class CustomTouchView(context: Context) : View(context) { var downTouch = false override fun onTouchEvent(event: MotionEvent): Boolean { super.onTouchEvent(event) // Listening for the down and up touch events. return when (event.action) { MotionEvent.ACTION_DOWN -> { downTouch = true true } MotionEvent.ACTION_UP -> if (downTouch) { downTouch = false performClick() // Call this method to handle the response and // enable accessibility services to // perform this action for a user who can't // tap the touchscreen. true } else { false } else -> false // Return false for other touch events. } } override fun performClick(): Boolean { // Calls the super implementation, which generates an AccessibilityEvent // and calls the onClick() listener on the view, if any. super.performClick() // Handle the action for the custom click here. return true } }
Java
class CustomTouchView extends View { public CustomTouchView(Context context) { super(context); } boolean downTouch = false; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); // Listening for the down and up touch events switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downTouch = true; return true; case MotionEvent.ACTION_UP: if (downTouch) { downTouch = false; performClick(); // Call this method to handle the response and // enable accessibility services to // perform this action for a user who can't // tap the touchscreen. return true; } } return false; // Return false for other touch events. } @Override public boolean performClick() { // Calls the super implementation, which generates an AccessibilityEvent // and calls the onClick() listener on the view, if any. super.performClick(); // Handle the action for the custom click here. return true; } }
รูปแบบก่อนหน้าช่วยให้มั่นใจได้ว่าเหตุการณ์คลิกที่กำหนดเองจะเข้ากันได้กับบริการการช่วยเหลือพิเศษ โดยใช้เมธอด performClick() เพื่อสร้างเหตุการณ์การช่วยเหลือพิเศษและระบุจุดแรกเข้าสำหรับบริการการช่วยเหลือพิเศษเพื่อดำเนินการในนามของผู้ใช้ที่ทำเหตุการณ์คลิกที่กำหนดเอง