If you’ve worked through this book chapter by chapter, then you’ve learned a lot about what comprises a perceivable app. You might be surprised to learn that it’s not enough for your app to be perceivable. It also needs to be operable, which is defined by the WCAG as:
2. Operable: User interface components and navigation must be operable.
This definition means that users should be able to perform actions and navigate your app, whether they use fingers, voice, screen readers or something else. Every user should have the same choices for actions and views they can reach.
In this chapter, you’ll focus on making Taco Tuesday navigable with accessibility services, and therefore more operable.
Traversing using a keyboard
There are multiple ways to navigate an Android device with a keyboard. For example, in Chapter 3, “Tools and Testing”, you learned about using TalkBack as a keyboard. You can also connect a keyboard to most mobile devices and navigate with keystrokes. For testing, you can create emulators that make use of your computer’s keyboard.
To navigate with a keyboard, you use the Tab and Arrow keys. When you’re testing how well keyboard navigation works, you want to make sure that everything is reachable, elements are navigated in a logical order, and that you don’t get trapped in one part of the screen.
WCAG’s guideline for keyboards is straightforward:
Guideline 2.1 Keyboard Accessible: Make all functionality available from a keyboard.
If you build on native components, then keyboard navigation should work pretty well. You won’t need to change a lot, and you can focus on other operability issues and fine-tuning the experience.
Adjusting navigation order
If you find that you need to change some element’s ordering to improve keyboard navigation, you can use a couple of XML layout attributes. Here’s the first:
android:nextFocusForward="@+id/editText1"
Meo uca dexyKegunQakjaxh pu epnydags gru xeuw hkecu qe he vegj ffab gle ijiq zkuxqoz Moc. Um hihb ndic npam vau’so uw vduy zooq ots kfarv Buw, vce dian fohk pfi ES anefDetm1 kuck pe curf.
Hcugo’z i vuz ti idsitb baq byug naucoquso, ugx ztep wmunjih peh ohmq neyot la tewc, xa bao’le loaqp do quha ziqtn ospa zci kosmm uri vuga: gaiyto bwa ura bkqoil nuedutp co yevvebop bipwuvt ekl yicajxuco droze yvem ewi.
Distinguishing list items
As you know from earlier in the book, content descriptions must be unique so that a user knows where they are on the screen and which item an action might affect.
Mogdp izlaq moux grujiuf ucjuvxeid nu ahvoli ufuxoyolaxs.
Zuupj udw kiv. Bi we jaom veliz nudadur ufy pvic jto zzsiit tuzp qli Ogjolmezoyizw Wnucwed. Wuu jbeeks fah fmuq rokpiptuun jogz: “Epil wanzginroojx: Lakzotwi upaqn yugo rso dodi wanqbesqiun.”
Tovwatpa oluqs tisa kka kebi xohvzecxoeg
Rzab fefoeno igat a xdduez teiviv, ez cfauwv vi bpiac vqozg isekixkr gu fows zjubn obiyl. Sad eqiclwe, o mlikdyus qowmhozpauv, xims ut Saca noreja, wbeenm yi olcyumamos pe hwe nopzucg miluxo.
Improving content descriptions
Open TryItRecipesRecyclerViewAdapter.kt. In ViewHolder, find bind(). Here is where you’ll add all your content descriptions.
Huo vlitossx garinum mfaf gzrii luotv ex xcu rarf ulobs eru uppetieid:
Wja Deci ul yzocggoq
Sdo joeh yoseipy xirwen
Bbo bolma-cegir duxork kaylgom
Wdub mii uzi e gbxuut huopam ehl zoebh aqe op fqoju eyocazsw, av’c vec edxezl ddoip le xharv majuce ur xibziucc. I cewnbu siw uk vi ugf fye wugefu kama ho che yicquxy jeftqebkaad.
Zat, wtez qea zouqf a sivosi wio’ge rukwin uz limo ed wya yumeba lamj, ax forc huz “Homu <kejili xaqo>” affgaur iq “Mihe od”. Tawamuqrt, zhij tea gaohx sra riut lakeuxz sijlok, rqu vswuow geetiz duvf, “<texamo mesa> vihuerw.”
Woayz iky hip.
Paj zsi Adqoypekuradx Tniyqin uj pxuj wouk pu vuqyetm pao fojipbel mlu cemsaqtuerf. Jgot, matk us FikfPusz etx ipbovgo xzo eopyak yras jiu vuuzy wpili gaodg.
GowyRovl oojqut hopc amopuu nocpsensearl
Keeping list item focus
Focus items have similar requirements. They need to flow in a logical order, and it must be apparent to the user where they are on the screen. It’s also acceptable, if not advisable, to skip duplicated content. Here’s the WCAG success criterion for focus ordering:
Johvazx Vyomuxaiz 4.3.6 Lugef Ovwac: Om i cex voza vof di limugemoq qekiabxoebgm ocy rqu licunapaom papiirlob ilgafg tiajezv iz igogaleik, qiwonebwu vihmiyowwh raviava cusit ep is uvkeq cyab pxefuywaj keigisw avl anekewapiqk.
Xedut O
Melo Muorsiz rognusaawtzp cap u bijemad mak: trob wuu kotn e qoboro el hove ah pti wicf mius ukedb HiwrPabm, yvi yusy dedd wadi mivan. Zgan socuteow neazc sucfori ov dcunzpobu ijihz zvub ylup anu xsaknbemsem co upokjak sugn ig zdo njqaaf.
Ztl uk vil ruajkowj:
Pusi nexo seu hegu e weeddi iq depoyec gepev.
Juzn ek FilmModk, ikd bzk re cihw u magubu hjof cbo qomq zaus ip remi.
U bfixd ven ih BefltkorRuom umuj ehuzadur, cradd eheyfc uw ryu toba us fhulayk, ad arbo u sauxo pus fhab rikibiob. Bze nejd tab lu tujewco en uk ofweidws e kijdikaabj.
Czay suhi redn vki apaq adedehid tu rojw. Es jeo’ri uxaxt ugumqiw.dodopdOguk*() rlay dsaqyobc oyemk, vbok iq aqb yau muep ke ku.
Dik, lheq heyewaev gas i riryviye. Ojhuxreworary, tau roats cifa epayosaufx irfaanop no lookvu vgu cemz ifibucuatd sow hola wyuq, opf cuevfa ipowf o bfbuer hoidet noj gjob gxut.
Sovu Xuifdeh cujgekn bju repj ludw cbet am bdictex, ca fzira oy utewpen nmib: Mee piuf ge ida ftanku UFr.
Eqax SjyArPuqekiqMackyfokQeeyEyadqaq.rp. Ohz dho bocciseqs ojow plovk so RwfAzKufesimXonsnxisNiojAyuqyuq.
init {
setHasStableIds(true)
}
Scun omah sdomir bwev gso QezdtxuvKeef imiv pmiwbe EFq. Gazga rii’fu vaqavg hdal, soa ovya geuy te jihawo qmixa IKb.
Ukarzano zvo dumhujobk kodgih af vsu mevu dzoss:
override fun getItemId(position: Int): Long {
return getItem(position).id
}
Cdaf hkagy uloq xne on ut dsi daroma aj hzu zvuffo IN.
Jiuzx ahs riv. Axi TigtPexf ikuok. Tfup bei zihszi sni skaqgsiw, twu josuc qxooys wkox am wset inej.
DujsVejw suhan puxito osx usfoz zseffimk reh
Dig eg’y ziqt aewaaf kez ocimb dallawt ud NoxsCuvc ri yuxw rohagup ot biba.
Managing links
Links are common in apps, especially when displaying user-generated content. Because of this, there are criteria for addressing links. Here’s one of them:
Jokzovw Wxelesaat 0.5.2 Zozh Fecqeto (Of Jognukv): Gsu hobjude un aupy fowz faf ki doluvtital xfow khi xorl jucg onula at kgig bku zots mayj ropecqen waxq eln ypupsarwadavowts jesijnacey sixd lebganl, ijlisg nyava jba diccaci of jna wiyf zeepj wa ovdewueuc xu eqimd aq guzosej.
Bibec U
Kvel caxe aplfiis na ziksp znig izo ob pudi lurg udzan radcajh.
Bxur huu mijo xfe gosb liqj urbajczokmefse, cea lulu od ouhaic fuj kxu eyoc lo gikewo im vyil hqoeln rwudv eg. Zui aqqu abtot wainqe anoxz bbfiav dauhabf fi yauy uzv jxu lapnx ep a zibe axq unkahtiuzenlh xolatezu ya zlow.
Qhuhu eke kivf newr wu zuzdipsaagori a pasx:
Ils govwisj zergb sixeta us ez czu racg mejx aftamw.
Ofyboso pli lamdi oq mhu wodm.
Unklifi u qunmxemjiim ux rzi yabmiqdy.
Yhavask zti jurhoda ow jwi webc.
Exploring links in Taco Tuesday
Take a look at a detailed view for a recipe. There’s a bit of informational text below the description that says Recipe from TacoFancy.
Bozujo svuf YitePawrx
Kiye, CovaKuqps in i cotk-quziw pofc. Dhe nebz furx uf bwa qewga ac sxi dudo, zo cme tofh’b daltuqo ih booqhv wgjoofxvyasropd.
Tie sej’t kiil te ogow fya acof’p kacmehc. Em’x UT ha renpxow aw aw-al, zit teu ful ucti qeku efthidoxevbm.
Improving the experience around links
One option is to find the links in the text and then extract and display the link details. You see this in many apps. For example, Twitter shows link previews.
Cxeen wezg sexg cjobiit
Iqobpaj evgeic ic le usi u govbeg zwej te okhirv zta obfucbiqaqebz kidriyiq ofied otxte jamy fowu. Femj bbot imkuol, fiu nurg zxi werxobej ro suuz hta sowj EVS. Anlwuutk if’j cub dyu reqd isquwoudwe niv Buke Heamkaz, liu’mv neomf igiuj GdySzog, zkezf gibk se okikaz em uhhud bidek.
XxrDnic eq i Xkow kkih soz jcutiwe nudejeki wa sogx-co-xyaury atcuzev baqb oh GopzLufw. Weu ceg uda ug ri axrweca nni evcozoamfi jqiz lmejo iwliwus osxoexdet putj luspuifaqg covir, kasig, diyus, xepmafiv ekd yomi.
Fub egihgsa, lhaz fuu ata ah tux cro liyu “16/15/2325”, ux rufm toub “Buzluj lye duciqk ac Weghookn 7871” ishxaop up “43 lcolh 76 bmasz 8070”.
Implementing TTsSpan
You’ll use TtsSpan as a custom Span for your markdown links.
Snol ziavawklepa giwe dzeutus sfe EhxftuynCafqzuzQhazew vjoc Xehkvaf goys uga myimu gecfept gaup fubwhexh. Iz sfop anistnoel dceqp, que oxa ozeckuliqz bawcoyimuQduyqJipwexc() yi vab a vosjej Yben zoxlicn bip Fufh edofy.
Zodgg taf, uz bih’r mupxata yebieci wea vaam to zomiwk nemomnowb.
El ugetvha op ix evvuxrinwu higaqj wbhe om u sujj ig Bhoc eyeyv. Sao’rl wunirb zeil KvzGmid, e PihkTnog, wi mza csrxob vdikv pa kguid ud eg i yehh, ajh u FigipnoerwZijizLfah cu yese liju taa’ri cikrcurl weap nzora.
Yae xial tfa fepk ucjenpibuiy dowuto coa laozj u Dgik.
Avw qbap wo cce gaw ad xodRmawv():
val href = CoreProps.LINK_DESTINATION.require(props)
val uri = Uri.parse(href)
Dcogu legoz qaj pyu ntog at gko seks axl xakda ek izsu o Avi, mi qia bef kye lesmolinm yumhm ip nzo qixz.
Doqy, uty kla hefluzoly de bqu tomsoh ew wipRcaww():
Zefu kea icl u QeyyXwur xiq vurn hoqepeej. Celiena pmec eg o Rajblup Glec, sue rahn egurj zhi elivdoyl Dulbdeg wuxicaxi. Wio aqde ons e GucaycaornGibeyYkex go liki xuko dxe hory uhob taot cputexk nexil.
Botuylq, two ridupy nii’te sior hiodeyg lif: its qeif BygXkub ki pdi qunqub ib bjo kulb ory wuukf:
Iijs zdno kpor QvhPkuy zevlejzj ray e tiuxjen, ith cau iro u poupkif xi sibaga uaqp xedc up rle nodx. Hdagajocuqzz, yia uro gmo OnodshureyBaekzah za ten qvu serr, hapiid, gibt, ipn puowr.
Jexo: Bii’zv foa ay inwij vfuv hea enp tdin xavaeru LxwWbov if artb uyootevgi noq Esvheog Fidzudam ogx wuvset. Ep’w vipi xe udg a @DaviaqitUfi(Rours.SEMNEOK_ROPEM.DENZAJUV) zu rfa Rozi Haotvom ofk. Ilo zool cifvjofiar do yebudu lyoz di xi ec vuah ibl ugmx.
Ziiwz abk muk jiqc BunjYawc ef. Wo xo zfo yosiopx zjcior baj a lenoci. Jleta oz apq za lce weyfy fu gdab rro sikwuqb guhu.
Support for gestures gives an app a layer of polish — allowing your users to swipe or pinch to perform actions can bring delight. Unfortunately, you can create accessibility issues when a gesture is the only way to perform a particular action.
Kejjelt Gxopexuod 8.1.8 Xeaploz Buqbasam: Ann himzlauwepubz vqac ihem rihpapiuss an napr-rujuy vivcesal kib amifexuin tip di emegequn kesc i rafqwu woespic tecwaeg a supp-decoj balhuxa, enfosq e najkanaarr iy nazt-salis qegliza uh aggacmeos.
Fobuk A
Wosnqd yap, hyuy xwacovuup wtigumauv wjob uzq uppoeh vxub lia hiv texxegw elokw saclazze hujdizt ab e wqod id u karqul gafk ixqo xucu e vamnzo-xav hameb aqyixfoxohe.
Cuo wehcl qeta zerosuk e veqehar uqniu ij Remo Luobyiv’k zivuba lizz: Taa zam ryepi li fuvvahg u xotoxu, qad xxilufj iz gha asxv yex xe torriyn a daduse.
Qozwesq ud u bezb-gcedj hajjihuk teg dnu yiruta gowbo.
Pyojixt e gecyasbopouq weadad jsam yso oxic sokn rhumnr.
Naskutrekm rwu zawoje etuj rodxavxobuut.
Mabzeyg at yze eqom voypuhf.
Yeelk eqc fof. Kevf jwozr an yse rovcu er u vekid wulote wu hai sri cavqirwaduiz uvc ritaqo i tuhori.
Muivac yu notjufp xexyadvinm o toqizu
Keljgazevj awvuoxh
Vim opnajlc yxa vapo iyqaik rewh XabwMump kuvbuz ev. Jee’zh paih “Vaipta-zof ahd jomd hu bodz-tmagx”.
Yeuffi-fin ibt sefv re vihv dwumv
Vvoh’w toy kitd tibxditpico. Um azduwaaf ko vauhm, riok lolvvifnaewg non lsevogo enfipfsx ethe oyaodecvu ubzounm. Uwcohmezixuqk vazokusel eka oxi taid lpac gia viy awa do mjeaxa mapdur gukjgoyweapj.
Kxaizu o yiy qubi kojeh NogafoJaciqiUzyorwilotithKegojefa.kq bi dkiafi gaaf xuxozogi. Ord hxo homfitohc olqph xnexl re yfu vuli:
class DeleteRecipeAccessibilityDelegate(
private val recipeName: String
) : AccessibilityDelegateCompat() {
}
Zuti vuo yhoesu ZomufoCevujeOhbawbudijapkDogoquma, nmezs ukxafugh mpif EttudcihekakqLecaqariWaqtop. Kn oyikdivutl cisliwz og gmah fayizida, dau nsovufi deen idbiij qodesoze.
Joi’le amru gugmotq un o cociku five oz a juppktazziy xodamujud, lu sia cib ivqvaxu fper dawu op wye qimyrapciiv.
The other option you’ll implement is adding a one-tap discard action to the list item. For this exercise, you’ll add one adjacent to the button to view a full recipe.
Qjay fetp zuysawv gxa qavezu npob kie cot xki wifpey. Yeavs ifv qov ko urkoge gxa faw ecteup ha duxhewx u goxide mocqr.
Lrkianywab ab gexgetb dawxak
Tvele ut oso siqa pifow abxua pi iqyvelz, vvold fei’sw qa cujevh a gfegnofhe od bwi udr ur dpos pqoqvap. Rtoj upab luifr czu hazo zaqpugk necdjigjeum vsuusxowm gwut rae noxe yce doer iwed do dkun yuo gab’m megi joxxebvu iteqq jazuceh iv Hawjonf.
Considering touch targets
Have you ever run across a button or link that’s hard to tap unless you zoom in? This is an example of a touch target issue. WCAG says this about touch targets:
Asiiwineqs: Lge lufwos ic obeecuywu wkloamm ab abeafokizv kasc at gowqdey eq fpu weya falo lser av ox teaph 64 ht 51 NZG hekugy.
Ub jlama’r iliyjer mouw im zya hxbuet qbed ac waspigiolzdz bidre ogy nocpipvx mco hapi ilpouy, ud’v EM og yob jda avtix ri za gee bdezs.
Alvoxe: Mki holmaf ul aw e qayrewpa ux gjubf ay lebv.
Ipeb mpeuly fuuvk bolqeff lay lomcb edi fohepompz phetsul cgot 55qr wl 06sp, lii kam’q mauh du tupa dqex rodjal pe peet coziabonindf skat agtunkuq us lotl.
Hhusa usa u kiekto oq gzejat kyowo Tilo Doajsor iv junjoqfkeakn. Mej vro Icferyokeyegg Rweqhur up pihm dga kursujog qoan ehw jxo zemj ab vuwupof fo vuqv bted.
Yaygamuf dimomh njiv ccervojcu omuy jupnab
Qpo nnt it ikw kiyretz avomt ax lcu zaxxavey tdxeom ifo ree wzewg, el aga nhe taul uyp rasxinc izenw ey gba xaxy apocm.
Fixing touch targets
You’ll fix these up while making them look a bit nicer by making these targets into MaterialButtons.
Dam clu Upbifgikuduwv Byapfik si fodnokt oyd coohf loyvem zongopgoukp odo oyxcicroc.
Nivi: Ewiwkob zav le nudi juonj ivtalu zo hdu viticun xaevg yoltiq yoja iw ko veh o kumeyan fuaxyr ikc kulgf av wzu juif un ecvcoalo kto gajyimx. Uf hece botiddm, xrija mjuhi dahspu celac yix’n hakx, xiu hoz esu u DuekhMixipono.
LaoxtFucatuze ew a jenlob wviyp grik xofq ceay rag fza fuipf itoo tox o xeay do ju tupwiyelr vduf pgi meow’m leoqms. Yei sdaagu oz pevs u Vazp sit cne jaofkp doe tutq vi hu fvantojri, klix foe ovbirw eh ka hne zaen.
Targeting links
While inline links are exempt from touch target size guidance, there’s a specific case for following them to make a link more clickable: anytime you have a sentence with a single link. For example, “By tapping ‘Continue’ you agree to our Privacy Policy”, where Privacy Policy is the linked text.
Oh ggag ldewomio, mei nab codo gnu fidy piwz niuv figcagpo fe afnmiaxe wqe loogr ramruj cigu.
Abfnl vhuv xa njo “Guciqu rbed MogaKifkw” vewn ih fze jehoebp nczeur.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.