Meskipun banyak aplikasi Android TV dibuat dengan komponen Android native, penting juga untuk mempertimbangkan aksesibilitas framework atau komponen pihak ketiga, terutama saat menggunakan tampilan kustom.
Komponen tampilan kustom yang berinteraksi langsung dengan OpenGL atau Canvas mungkin tidak berfungsi baik dengan layanan aksesibilitas seperti Talkback dan Tombol Akses.
Pertimbangkan beberapa masalah berikut yang mungkin terjadi saat Talkback diaktifkan:
- Fokus aksesibilitas (kotak hijau) mungkin hilang di aplikasi Anda.
- Fokus aksesibilitas mungkin memilih batas seluruh layar.
- Fokus aksesibilitas mungkin tidak dapat dipindahkan.
- Tombol empat arah pada D-pad mungkin tidak berpengaruh, bahkan jika kode menanganinya.
Jika Anda menemukan salah satu masalah ini di aplikasi, pastikan
aplikasi Anda mengekspos hierarki
AccessibilityNodeInfo
ke layanan aksesibilitas.
Bagian selanjutnya dari panduan ini memberikan beberapa solusi dan praktik terbaik untuk mengatasi masalah ini.
Peristiwa D-pad digunakan oleh layanan aksesibilitas
Akar masalah ini adalah peristiwa tombol digunakan oleh layanan aksesibilitas.
Seperti yang diilustrasikan dalam gambar 1, saat Talkback diaktifkan, peristiwa D-pad tidak akan diteruskan ke pengendali D-pad yang ditentukan oleh developer. Sebagai gantinya, layanan aksesibilitas menerima peristiwa utama sehingga dapat memindahkan fokus aksesibilitas. Karena komponen Android kustom secara default tidak mengekspos informasi ke layanan aksesibilitas tentang posisinya di layar, layanan aksesibilitas tidak dapat memindahkan fokus aksesibilitas untuk menandainya.
Layanan aksesibilitas lainnya juga terpengaruh: Peristiwa D-pad mungkin juga digunakan saat menggunakan Tombol Akses.
Karena peristiwa D-pad dikirimkan ke layanan aksesibilitas, dan
layanan tersebut tidak mengetahui lokasi komponen UI dalam tampilan kustom,
Anda harus mengimplementasikan AccessibilityNodeInfo
agar aplikasi dapat meneruskan
peristiwa tombol dengan benar.
Mengekspos informasi ke layanan aksesibilitas
Untuk memberikan layanan aksesibilitas dengan informasi yang memadai tentang
lokasi dan deskripsi tampilan kustom, implementasikan AccessibilityNodeInfo
untuk menampilkan detail setiap komponen.
Untuk menentukan hubungan logis tampilan sehingga layanan aksesibilitas dapat
mengelola fokus, implementasikan ExploreByTouchHelper
dan tetapkan menggunakan
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
untuk tampilan kustom.
Saat menerapkan ExploreByTouchHelper
, ganti empat metode abstraknya:
Kotlin
// Return the virtual view ID whose view is covered by the input point (x, y). protected fun getVirtualViewAt(x: Float, y: Float): Int // Fill the virtual view ID list into the input parameter virtualViewIds. protected fun getVisibleVirtualViews(virtualViewIds: List<Int>) // For the view whose virtualViewId is the input virtualViewId, populate the // accessibility node information into the AccessibilityNodeInfoCompat parameter. protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat) // Set the accessibility handling when perform action. protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean
Java
// Return the virtual view ID whose view is covered by the input point (x, y). protected int getVirtualViewAt(float x, float y) // Fill the virtual view ID list into the input parameter virtualViewIds. protected void getVisibleVirtualViews(List<Integer> virtualViewIds) // For the view whose virtualViewId is the input virtualViewId, populate the // accessibility node information into the AccessibilityNodeInfoCompat parameter. protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node) // Set the accessibility handling when perform action. protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)
Untuk detail selengkapnya, tonton Google I/O 2013 - Enable Blind and Low-Vision Accessibility di Android atau baca selengkapnya tentang mengisi peristiwa aksesibilitas.
Praktik terbaik
Wajib:
AccessibilityNodeInfo.getBoundsInScreen()
harus menentukan posisi komponen.Wajib:
AccessibilityNodeInfo.setVisibleToUser()
harus mencerminkan visibilitas komponen.Wajib:
AccessibilityNodeInfo.getContentDescription()
harus menentukan deskripsi konten untuk diumumkan oleh Talkback.Tentukan
AccessibilityNodeInfo.setClassName()
agar layanan dapat membedakan jenis komponen.Saat menerapkan
performAction()
, refleksikan tindakan menggunakanAccessibilityEvent
yang sesuai.Untuk mengimplementasikan jenis tindakan lainnya, seperti
ACTION_CLICK
, panggilAccessibilityNodeInfo.addAction(ACTION_CLICK)
menggunakan logika yang sesuai diperformAction()
.Jika ada, cerminkan status komponen untuk
setFocusable()
,setClickable()
,setScrollable()
, dan metode serupa.Tinjau dokumentasi
AccessibilityNodeInfo
guna mengidentifikasi cara lain yang dapat digunakan layanan aksesibilitas untuk berinteraksi lebih baik dengan komponen Anda.
Contoh
Lihat contoh aksesibilitas tampilan kustom untuk Android TV guna melihat praktik terbaik untuk menambahkan dukungan aksesibilitas ke aplikasi menggunakan tampilan kustom.