Meskipun banyak aplikasi Android TV dibuat dengan komponen Android native, juga penting untuk mempertimbangkan aksesibilitas aplikasi pihak ketiga framework atau komponen, terutama saat menggunakan tampilan kustom.
Komponen tampilan kustom yang berinteraksi langsung dengan OpenGL atau Canvas mungkin tidak berfungsi dengan baik dengan layanan aksesibilitas seperti TalkBack dan Tombol Akses.
Pertimbangkan beberapa masalah berikut yang mungkin terjadi saat TalkBack diaktifkan pada:
- 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, meskipun kode Anda menanganinya.
Jika Anda melihat salah satu masalah ini di aplikasi, periksa apakah
aplikasi mengekspos AccessibilityNodeInfo
-nya
ke layanan aksesibilitas.
Bagian selanjutnya dari panduan ini memberikan beberapa solusi dan praktik terbaik untuk mengatasi masalah tersebut.
Peristiwa D-pad digunakan oleh layanan aksesibilitas
Akar masalah ini adalah peristiwa tombol digunakan oleh aksesibilitas layanan IT perusahaan mereka.
Seperti yang diilustrasikan dalam gambar 1, saat Talkback diaktifkan, peristiwa D-pad tidak diteruskan ke pengendali D-pad yang ditentukan oleh developer. Sebagai gantinya, layanan aksesibilitas menerima peristiwa utama sehingga mereka dapat memindahkan fokus aksesibilitas. Karena komponen Android kustom tidak secara default mengekspos informasi ke layanan aksesibilitas tentang posisinya di layar, layanan aksesibilitas tidak dapat memindahkan fokus aksesibilitas untuk menyorotnya.
Layanan aksesibilitas lainnya juga terpengaruh: Peristiwa D-pad mungkin juga yang dikonsumsi saat menggunakan Tombol Akses.
Karena peristiwa D-pad dikirimkan ke layanan aksesibilitas, dan
layanan itu tidak tahu di mana komponen UI berada dalam tampilan khusus,
Anda harus menerapkan AccessibilityNodeInfo
untuk aplikasi Anda guna meneruskan
peristiwa utama
dengan benar.
Mengekspos informasi ke layanan aksesibilitas
Untuk memberikan layanan aksesibilitas dengan informasi yang memadai tentang
lokasi dan deskripsi tampilan kustom, terapkan AccessibilityNodeInfo
untuk mengekspos detail setiap komponen.
Untuk mendefinisikan hubungan logis tampilan sehingga layanan aksesibilitas dapat
mengelola fokus, menerapkan ExploreByTouchHelper
dan menyetelnya menggunakan
ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat)
untuk tampilan kustom.
Saat mengimplementasikan ExploreByTouchHelper
, ganti keempat 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 -enabling Blind and Low-Vision Aksesibilitas 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 agar Talkback dapat diumumkan.Tentukan
AccessibilityNodeInfo.setClassName()
sehingga layanan dapat membedakan jenis komponen.Saat menerapkan
performAction()
, mencerminkan tindakan menggunakanAccessibilityEvent
yang sesuai.Untuk mengimplementasikan jenis tindakan lainnya, seperti
ACTION_CLICK
, panggilAccessibilityNodeInfo.addAction(ACTION_CLICK)
menggunakan logika yang sesuai diperformAction()
.Jika berlaku, mencerminkan status komponen untuk
setFocusable()
,setClickable()
,setScrollable()
, dan metode serupa.Tinjau dokumentasi untuk
AccessibilityNodeInfo
untuk mengidentifikasi cara lain agar layanan aksesibilitas dapat berinteraksi secara lebih baik komponen Anda.
Contoh
Lihat contoh aksesibilitas tampilan kustom untuk Android TV guna melihat praktik terbaik untuk menambahkan dukungan aksesibilitas ke aplikasi menggunakan tampilan kustom.