Beberapa orang yang menggunakan perangkat Android memiliki kebutuhan aksesibilitas yang berbeda dengan yang lainnya. Untuk membantu kelompok tertentu yang sama-sama membutuhkan fitur aksesibilitas, framework Android menyediakan kemampuan bagi developer untuk membuat layanan aksesibilitas, yang menyajikan konten aplikasi kepada mereka dan mengoperasikan aplikasi atas nama mereka.
Android menyediakan beberapa layanan aksesibilitas sistem, termasuk:
- TalkBack: Membantu orang-orang yang memiliki gangguan penglihatan atau tunanetra. Mengumumkan konten melalui suara yang disintesis, dan melakukan tindakan pada aplikasi sebagai respons atas gestur pengguna.
- Tombol Akses: Membantu orang-orang yang memiliki gangguan motorik. Menandai elemen interaktif, dan melakukan tindakan sebagai respons terhadap pengguna yang menekan tombol. Memungkinkan pengontrolan perangkat, hanya dengan 1 atau 2 tombol.
Untuk membantu pengguna yang membutuhkan fitur aksesibilitas agar dapat menggunakan aplikasi Anda, aplikasi Anda harus mengikuti praktik terbaik yang dijelaskan di halaman ini, yang disusun berdasarkan panduan utama sebagaimana tercantum dalam Menjadikan aplikasi lebih mudah diakses.
Setiap praktik terbaik berikut dapat makin meningkatkan aksesibilitas aplikasi Anda:
- Elemen label
- Pengguna harus dapat memahami konten dan tujuan setiap elemen UI yang interaktif dan bermanfaat dalam aplikasi Anda.
- Menggunakan atau memperluas widget sistem
- Buat elemen tampilan yang disertakan oleh framework, bukan tampilan kustom Anda sendiri. Class tampilan dan widget framework sudah menyediakan sebagian besar kemampuan aksesibilitas yang dibutuhkan aplikasi Anda.
- Menggunakan isyarat selain warna
- Pengguna harus dapat membedakan kategori elemen dalam UI dengan jelas. Untuk melakukannya, gunakan pola dan posisi serta warna untuk menunjukkan perbedaannya.
- Menjadikan konten media lebih mudah diakses
- Coba tambahkan deskripsi pada konten video atau audio aplikasi Anda, agar pengguna yang menikmati konten tersebut tidak perlu sepenuhnya mengandalkan isyarat visual atau aura.
Elemen label
Penting untuk menyediakan label yang deskriptif dan berguna kepada pengguna di setiap elemen UI interaktif aplikasi Anda. Setiap label harus menjelaskan arti dan tujuan elemen tertentu. Pembaca layar seperti TalkBack dapat membacakan label ini kepada pengguna yang mengandalkan layanan ini.
Umumnya, Anda menentukan deskripsi elemen UI tertentu dalam file resource
tata letak yang berisi elemen ini. Meskipun biasanya Anda menambahkan label menggunakan
atribut contentDescription
seperti dijelaskan dalam panduan menjadikan aplikasi
lebih mudah diakses, ada
beberapa teknik pelabelan lain yang perlu diperhatikan, seperti dijelaskan di
bagian berikut ini.
Elemen yang dapat diedit
Saat melabeli elemen yang dapat diedit, seperti
objek EditText
, sebaiknya tampilkan
teks yang memberikan contoh input yang valid dalam elemen itu sendiri, selain
menjadikan teks contoh ini tersedia bagi pembaca layar. Dalam situasi ini, Anda
dapat menggunakan atribut android:hint
, seperti ditunjukkan dalam cuplikan berikut:
<!-- The hint text for en-US locale would be "Apartment, suite, or building". --> <EditText android:id="@+id/addressLine2" android:hint="@string/aptSuiteBuilding" ... />
Dalam situasi ini, objek View
harus memiliki atribut android:labelFor
-nya yang disetel ke ID
elemen EditText
. Untuk detail selengkapnya, lihat bagian yang menjelaskan cara
menyambungkan label elemen yang salah satunya mendeskripsikan elemen lainnya.
Menyambungkan elemen yang salah satunya mendeskripsikan elemen lainnya
Sudah umum bagi elemen EditText
untuk memiliki objek View
yang sesuai dan mendeskripsikan konten yang
harus dimasukkan pengguna dalam elemen EditText
. Pada perangkat yang menjalankan Android
4.2 (API level 17) atau yang lebih tinggi, Anda dapat menunjukkan hubungan ini dengan menyetel
atribut android:labelFor
objek View
.
Contoh pelabelan untuk pasangan elemen tersebut ditunjukkan pada cuplikan berikut:
<!-- Label text for en-US locale would be "Username:" --> <TextView android:id="@+id/usernameLabel" ... android:text="@string/username" android:labelFor="@+id/usernameEntry" /> <EditText android:id="@+id/usernameEntry" ... /> <!-- Label text for en-US locale would be "Password:" --> <TextView android:id="@+id/passwordLabel" ... android:text="@string/password android:labelFor="@+id/passwordEntry" /> <EditText android:id="@+id/passwordEntry" android:inputType="textPassword" ... />
Elemen dalam koleksi
Saat menambahkan label ke elemen koleksi, setiap label harus unik. Dengan begitu, layanan aksesibilitas sistem dapat merujuk dengan tepat ke satu elemen di layar saat membacakan label. Hubungan ini memberi tahu pengguna kapan mereka menjelajahi UI atau kapan mereka memindahkan fokus ke elemen yang sudah mereka temukan.
Secara khusus, Anda harus menyertakan teks tambahan atau informasi kontekstual di
elemen dalam tata letak yang digunakan kembali, seperti
objek RecyclerView
,
sehingga setiap elemen turunannya diidentifikasi secara unik.
Untuk melakukannya, setel deskripsi konten sebagai bagian dari implementasi adaptor Anda, seperti ditunjukkan dalam cuplikan kode berikut:
Kotlin
data class MovieRating(val title: String, val starRating: Integer) class MyMovieRatingsAdapter(private val myData: Array<MovieRating>): RecyclerView.Adapter<MyMovieRatingsAdapter.MyRatingViewHolder>() { class MyRatingViewHolder(val ratingView: ImageView) : RecyclerView.ViewHolder(ratingView) override fun onBindViewHolder(holder: MyRatingViewHolder, position: Int) { val ratingData = myData[position] holder.ratingView.contentDescription = "Movie ${position}: " + "${ratingData.title}, ${ratingData.starRating} stars" } }
Java
public class MovieRating { private String title; private int starRating; // ... public String getTitle() { return title; } public int getStarRating() { return starRating; } } public class MyMovieRatingsAdapter extends RecyclerView.Adapter<MyAdapter.MyRatingViewHolder> { private MovieRating[] myData; public static class MyRatingViewHolder extends RecyclerView.ViewHolder { public ImageView ratingView; public MyRatingViewHolder(ImageView iv) { super(iv); ratingView = iv; } } @Override public void onBindViewHolder(MyRatingViewHolder holder, int position) { MovieRating ratingData = myData[position]; holder.ratingView.setContentDescription("Movie " + position + ": " + ratingData.getTitle() + ", " + ratingData.getStarRating() + " stars") } }
Grup konten terkait
Jika aplikasi Anda menampilkan beberapa elemen UI yang membentuk grup secara otomatis, seperti
detail lagu atau atribut pesan, atur elemen tersebut dalam
container, yang umumnya merupakan subclass ViewGroup
. Setel atribut
android:screenReaderFocusable
objek container
ke true
, dan setiap atribut
android:focusable
objek inti ke false
. Dengan demikian, layanan aksesibilitas dapat menyajikan deskripsi konten elemen
inti, satu per satu, dalam satu pembacaan.
Dengan menggabungkan elemen terkait ini, pengguna teknologi pendukung dapat
menemukan informasi yang ada di layar dengan lebih efisien.
Cuplikan berikut berisi bagian konten yang terkait satu
sama lain, sehingga elemen container, instance ConstraintLayout
, memiliki
atribut android:screenReaderFocusable
yang disetel ke true
, dan setiap elemen TextView
inti memiliki atribut android:focusable
yang disetel ke false
:
<!-- In response to a single user interaction, accessibility services announce both the title and the artist of the song. --> <ConstraintLayout android:id="@+id/song_data_container" ... android:screenReaderFocusable="true"> <TextView android:id="@+id/song_title" ... android:focusable="false" android:text="@string/my_song_title" /> <TextView android:id="@+id/song_artist" android:focusable="false" android:text="@string/my_songwriter" /> </ConstraintLayout>
Karena layanan aksesibilitas membacakan deskripsi elemen inti dalam satu kalimat, penting untuk membuat setiap deskripsi sesingkat mungkin tetapi tetap menyampaikan maksud elemen tersebut.
Label grup kustom
Jika diinginkan, Anda dapat mengganti pengelompokan dan pengurutan default platform untuk deskripsi elemen inti grup dengan memberikan deskripsi konten untuk grup tersebut.
Cuplikan berikut menampilkan contoh deskripsi grup yang disesuaikan:
<!-- In response to a single user interaction, accessibility services announce the custom content description for the group. --> <ConstraintLayout android:id="@+id/song_data_container" ... android:screenReaderFocusable="true" android:contentDescription="@string/title_artist_best_song"> <TextView android:id="@+id/song_title" ... <!-- Content ignored by accessibility services --> android:text="@string/my_song_title" /> <TextView android:id="@+id/song_artist" <!-- Content ignored by accessibility services --> android:text="@string/my_songwriter" /> </ConstraintLayout>
Grup bertingkat
Jika antarmuka aplikasi Anda menyajikan informasi multi-dimensi, seperti
daftar acara festival harian, gunakan atribut android:screenReaderFocusable
pada container grup inti. Skema pelabelan ini memberikan keseimbangan yang baik
antara jumlah pembacaan yang diperlukan untuk menemukan konten layar
dan durasi setiap pembacaan.
Cuplikan kode berikut menunjukkan satu metode untuk memberi label pada grup di dalam grup yang lebih besar:
<!-- In response to a single user interaction, accessibility services announce the events for a single stage only. --> <ConstraintLayout android:id="@+id/festival_event_table" ... > <ConstraintLayout android:id="@+id/stage_a_event_column" android:screenReaderFocusable="true"> <!-- UI elements that describe the events on Stage A. --> </ConstraintLayout> <ConstraintLayout android:id="@+id/stage_b_event_column" android:screenReaderFocusable="true"> <!-- UI elements that describe the events on Stage B. --> </ConstraintLayout> </ConstraintLayout>
Judul dalam teks
Beberapa aplikasi menggunakan judul untuk meringkas grup teks yang muncul di layar. Jika
elemen View
tertentu merepresentasikan judul, Anda dapat menunjukkan tujuan judul tersebut
untuk layanan aksesibilitas dengan menyetel atribut
android:accessibilityHeading
elemen ke
true
.
Pengguna layanan aksesibilitas dapat memilih untuk memilih opsi navigasi antar-judul, bukan antar-paragraf atau antar-kata. Fleksibilitas ini akan meningkatkan pengalaman navigasi teks.
Judul panel aksesibilitas
Di Android 9 (API level 28) dan yang lebih tinggi, Anda dapat memberikan judul yang mudah diakses untuk panel layar. Untuk tujuan aksesibilitas, panel adalah bagian jendela dengan tampilan visual yang mencolok, seperti konten suatu fragmen. Agar layanan aksesibilitas dapat memahami perilaku seperti jendela di panel, Anda harus memberikan judul yang deskriptif pada panel aplikasi Anda. Selanjutnya, layanan aksesibilitas dapat memberikan informasi yang lebih terperinci kepada pengguna saat tampilan atau konten panel berubah.
Untuk menentukan judul panel, gunakan
atribut android:accessibilityPaneTitle
,
seperti ditampilkan dalam cuplikan berikut:
<!-- Accessibility services receive announcements about content changes that are scoped to either the "shopping cart view" section (top) or "browse items" section (bottom) --> <MyShoppingCartView android:id="@+id/shoppingCartContainer" android:accessibilityPaneTitle="@string/shoppingCart" ... /> <MyShoppingBrowseView android:id="@+id/browseItemsContainer" android:accessibilityPaneTitle="@string/browseProducts" ... />
Elemen dekoratif
Jika elemen di UI Anda hanya ada untuk spacing visual atau tujuan tampilan
visual, setel
atribut android:contentDescription
ke "null"
.
Jika aplikasi Anda hanya mendukung perangkat yang menjalankan Android 4.1 (API level 16) atau
yang lebih tinggi, Anda dapat menyetel atribut android:importantForAccessibility
elemen-elemen
dekoratif ini ke "no"
.
Memperluas widget sistem
Poin penting: Saat Anda mendesain UI aplikasi, gunakan atau perluas
widget yang disediakan sistem dengan hierarki class Android
serendah mungkin. Widget yang disediakan sistem dengan hierarki paling rendah sudah
memiliki sebagian besar kemampuan aksesibilitas yang dibutuhkan aplikasi Anda. Memperluas
widget yang disediakan sistem ini lebih mudah daripada membuat widget sendiri dari class
View
,
ViewCompat
,
Canvas
, dan
CanvasCompat
yang lebih umum.
Jika Anda harus memperluas View
atau Canvas
secara langsung, yang
mungkin diperlukan untuk pengalaman yang sangat disesuaikan atau untuk tingkat game, lihat
Menjadikan tampilan kustom
lebih mudah diakses.
Bagian ini akan menjelaskan cara mengimplementasikan jenis khusus
Switch
yang disebut TriSwitch
. Cara kerja
objek TriSwitch
mirip dengan objek Switch
, kecuali bahwa setiap instance
TriSwitch
memungkinkan pengguna berganti-ganti di antara 3 kemungkinan status.
Memperluas dari hierarki class paling rendah
Objek Switch
mewarisi beberapa class UI framework dalam hierarki-nya:
View ↳ TextView ↳ Button ↳ CompoundButton ↳ Switch
Sebaiknya class TriSwitch
yang baru diperluas secara langsung dari class
Switch
. Dengan demikian, framework
aksesibilitas Android
menyediakan sebagian besar kemampuan aksesibilitas yang diperlukan class
TriSwitch
:
- Tindakan aksesibilitas: Memberi tahu sistem cara layanan aksesibilitas
mengemulasi setiap kemungkinan masukan pengguna yang dijalankan pada objek
TriSwitch
. (Diwarisi dariView
.) - Peristiwa aksesibilitas: Memberi tahu layanan aksesibilitas tentang setiap kemungkinan
cara agar tampilan objek
TriSwitch
dapat berubah saat layar dimuat ulang atau diperbarui. (Diwarisi dariView
.) - Karakteristik: Detail setiap objek
TriSwitch
, seperti konten teks yang ditampilkannya. (Diwarisi dariTextView
.) - Informasi status: Deskripsi tentang status objek
TriSwitch
saat ini, misalnya "dicentang" atau "tidak dicentang". (Diwarisi dariCompoundButton
.) - Deskripsi teks tentang status: Penjelasan berbasis teks tentang apa yang direpresentasikan oleh
setiap status. (Diwarisi dari
Switch
.)
Perilaku gabungan ini, dari Switch
dan superclass-nya, hampir sama dengan
perilaku yang diinginkan objek TriSwitch
. Oleh karena itu, implementasi Anda dapat
berfokus pada perluasan jumlah kemungkinan status dari 2 hingga 3.
Menentukan peristiwa kustom
Saat Anda memperluas widget sistem, Anda mungkin mengubah aspek tentang cara pengguna berinteraksi dengan widget tersebut. Penting untuk menentukan perubahan interaksi ini agar layanan aksesibilitas dapat memperbarui widget aplikasi Anda seolah-olah pengguna berinteraksi dengan widget secara langsung.
Pedoman umumnya adalah, untuk setiap callback berbasis tampilan yang Anda ganti,
Anda juga perlu menentukan ulang tindakan aksesibilitas yang sesuai dengan mengganti
ViewCompat.replaceAccessibilityAction()
.
Dalam pengujian aplikasi, Anda dapat memvalidasi perilaku tindakan yang dtentukan ulang tersebut dengan
memanggil
ViewCompat.performAccessibilityAction()
.
Cara kerja prinsip ini untuk objek TriSwitch
Tidak seperti objek Switch
biasa, mengetuk siklus objek TriSwitch
akan mengalami siklus lewat
3 kemungkinan status. Oleh karena itu, tindakan
aksesibilitas ACTION_CLICK
yang terkait perlu diperbarui:
Kotlin
class TriSwitch(context: Context) : Switch(context) { // 0, 1, or 2. var currentState: Int = 0 private set init { updateAccessibilityActions() } private fun updateAccessibilityActions() { ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK, action-label) { view, args -> moveToNextState() }) } private fun moveToNextState() { currentState = (currentState + 1) % 3 } }
Java
public class TriSwitch extends Switch { // 0, 1, or 2. private int currentState; public int getCurrentState() { return currentState; } public TriSwitch() { updateAccessibilityActions(); } private void updateAccessibilityActions() { ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK, action-label, (view, args) -> moveToNextState()); } private void moveToNextState() { currentState = (currentState + 1) % 3; } }
Menggunakan isyarat selain warna
Untuk membantu pengguna yang mengalami kekurangan daya penglihatan terhadap warna, gunakan isyarat selain warna untuk membedakan elemen UI dalam layar aplikasi Anda. Teknik ini dapat mencakup penggunaan berbagai bentuk atau ukuran, penyediaan pola teks atau visual, atau penambahan info berbasis audio atau sentuhan (info via sentuhan) untuk menandai perbedaan elemen.
Gambar 1 menunjukkan dua versi aktivitas. Versi pertama hanya menggunakan warna untuk membedakan antara dua kemungkinan tindakan dalam alur kerja. Versi kedua menggunakan praktik terbaik yang menyertakan bentuk dan teks selain warna untuk menandai perbedaan antara kedua opsi tersebut:
Menjadikan konten media lebih mudah diakses
Jika Anda mengembangkan aplikasi yang menyertakan konten media, seperti klip video atau rekaman audio, coba dukung pengguna dengan berbagai jenis aksesibilitas yang diperlukan untuk memahami materi ini. Secara khusus, sebaiknya Anda melakukan hal-hal berikut:
- Sertakan kontrol yang memungkinkan pengguna menjeda atau menghentikan media, mengubah volume, dan mengaktifkan atau menonaktifkan subtitel (teks).
- Jika video menyajikan informasi yang penting untuk menyelesaikan alur kerja, berikan konten yang sama dalam format alternatif, seperti transkrip.
Referensi tambahan
Untuk mempelajari lebih lanjut cara menjadikan aplikasi lebih mudah diakses, lihat referensi tambahan berikut: