Programare pentru Android, accesibilizare aplicatii
Scris: 30 Iul 2014, 17:24
După cum am spus în topicul Simulator de zaruri pentru Android, am reuşit să învăţ cum se fac programe pentru acest sistem de operare.
Deschid acest topic pentru diverse informaţii legate de programarea pentru Android, la început prezentând succint felul în care se creează o aplicaţie şi modul de accesibilizare a acesteia.
Deşi la început părea complicat şi aparte faţă de ceea ce am făcut până acum, pot spune că în cele din urmă sunt familiarizat cu Java aplicat cu Android SDK.
Pentru a începe, este nevoie de un IDE cu Android SDK. Ei au ales Eclipse ca IDE, exista varianta Eclipse ADT Bundle (Android Development Tools).
Acest pachet care conţine IDE-ul şi SDK-ul poate fi găsit la:
https://developer.android.com/sdk/insta ... ml?pkg=adt
În prezent Google lucrează la un alt IDE numit Android Studio, acesta fiind încă la o versiune 0.x, dar toate informaţiile de pe internet sunt prezentate pentru Eclipse, el fiind deja de ani de zile de bază în acest caz.
După ce se instalează totul conform instrucţiunilor, după ce se reuşeşte activarea opţiunlor dezvoltator pe telefon şi se activează USB Debugging pentru lansarea aplicaţiei pe telefon ca terminal de testare, se poate demara programarea propriu-zisă.
Paşii sunt următorii, nu intru în detalii de programare:
- Dupa instalarea uneltelor, se creează un proiect Android nou.
- Se scrie codul şi se are în vedere ca mesajele, string-urile să fie plasate într-un fişier XML din folder-ul Values aflat in Resources, interfaţa se află într-un folder Layout, tot din Resources, la fel imaginile în folderul Drawable, meniurile in Menu etc.
- Dupa finalizarea aplicaţiei, trebuie generat cu KeyTools un certificat unic cu parola, acesta trebuie păstrat cu grijă, o aplicaţie nu poate fi semnată cu alt certificat fara să fie considerată ca una nouă.
- La semnare se mai fac nişte retuşări pentru eficientizare, e vorba de un proces numit Zipalign. Îl face IDE-ul.
- Se pune aplicaţia în magazin, unde este nevoie de tot felul de capturi de ecran, pictogramă de înaltă rezoluţie, descrieri şi, desigur, fişierul APK de uploadat.
- În câteva ore, aplicaţia poate fi găsită la o căutare în magazin.
Pentru a deschide un cont de dezvoltator la developer.android.com, trebuie achitată o taxă iniţială de 25 de dolari; se plăteşte o singură dată la început, apoi totul este gratuit. Fără acest cont, nu se pot distribui aplicaţii prin magazin, ci doar fişiere APK prin modalităţi proprii de promovare.
Revenind la detalii, scriu puţin despre interfaţă, lucrul care ne interesează în general, mai ales dacă suntem utilizatori de cititor de ecran (screen reader).
Interfaţa de obicei este partea care diferă cel mai mult de la un sistem de operare la altul, Android alegând un mod practic, dupa părerea mea, uşor de întreţinut şi de modificat.
Sunt două modalităţi de a realiza interfaţă - static (fişier XML) şi programatic / dinamic (direct în cod Java).
Interfaţă în XML
O fereastră în Android, de cele mai multe ori reprezintă o aşa-zisă activitate. Fiecare astfel de activitate are în spate un fişier XML care conţine interfaţa sub formă de elemente părinte - copil. De exemplu, părintele este un layout linear, iar in el pot fi butoane, check-box-uri, radio-butoane, etichete de text sau chiar alte layout-uri etc.
Un exemplu schematic ar fi:
Toate aceste elemente au o mulţime de atribute de forma android:attribute="value".
Am adus prezentarea aici pentru a explica faptul că, dacă printre acele elemente se află de exemplu o imagine, foarte uşor i se poate pune un atribut special pentru Talkback, astfel încât atunci când se ajunge la ea prin navigare, acea descriere să fie anunţată.
Nu trebuie decât scris:
android:contentDescription="Descrierea mea"
Talkback va anunţa "Descrierea mea" când se ajunge pe imagine sau orice alt element ar fi. Nu apare absolut nimic pe ecran pentru a strica design-ul, deci e foarte simplu şi practic, doar programatorul să ştie ce are de făcut ca să ofere accesibilitate.
În cazul elementelor pe care apare text, cum ar fi TextView sau Button, există desigur atributul
android:text care primeşte ca valoare un text oarecare, de obicei unul declarat în alt XML care este în folderul values.
De exemplu:
android:text="@string/my_text"
Acel my_text este numele stringului din Strings.xml.
De multe ori cel care creează programul pune la butoane imagini, fapt care face sa omită atributul android:text sau poate intenţionat nu vrea să apară şi text. În acest caz, merge din nou atributul android:contentDescription care face ca utilizatorul nevăzător să audă un text ca şi cum ar fi scris acolo.
Un buton din interfaţa zarurilor mele arată aşa, nu are nevoie de contentDescription pentru Talkback:
Acel @string/button_throw face referire la un string cu numele button_throw care are la limba română valoarea "Aruncă!".
Fişierul XML cu stringurile este în folderul Values din Resources, daca se creează tot acolo un folder numit values-ro şi este copiat acelaşi string.xml tradus, interfaţa va apărea în română atunci când telefonul este setat ca limbă pe română.
Interfaţa în mod programatic
Toate elementele UI pot fi create şi într-un mod programatic, direct în cod cu tot felul de metode, fiecare element fiind un obiect.
În acest caz, cele două atribute din XML android:text şi android:contentDescription au metodele corespunzătoare:
.setText() şi .setContentDescription().
Astfel cum zarurile sunt generate dinamic ca imagini şi se plasează doar într-un LinearLayout din fişierul XML, va trebui pentru a fi citite de Talkback să fie aplicată metoda .setContentDescription cu descrierea (numărul zarului) ca string la parametru.
Pun mai jos codul aproximativ de generare a zarului cu numărul 6 în aplicaţia mea:
Pe penultimul rând nu am făcut decât să accesibilizez zarul.
Codul pare poate greoi, dar l-am pus doar ca exemplu pentru cine programează, să vadă ce uşor poate fi accesibilizat un element de interfaţă.
Sunt multe de spus, în mesajul următor voi scrie concis strict despre acel contentDescription, mesaj ca să poată fi trimis dezvoltatorilor ca solicitare de accesibilizare.
Sunt de exemplu jocuri de Yahtzee accesibile, singurul lucru care nu este citit fiind zarurile. Ei bine, daca dezvoltatorul ar avea chef 5-10 minute, ar adăuga acel .setContentDescription() la ImageiView şi jocul ar deveni accesibil în totalitate.
Daca se mai apucă cineva de Android, aici putem discuta, ne putem da sfaturi etc.
Deschid acest topic pentru diverse informaţii legate de programarea pentru Android, la început prezentând succint felul în care se creează o aplicaţie şi modul de accesibilizare a acesteia.
Deşi la început părea complicat şi aparte faţă de ceea ce am făcut până acum, pot spune că în cele din urmă sunt familiarizat cu Java aplicat cu Android SDK.
Pentru a începe, este nevoie de un IDE cu Android SDK. Ei au ales Eclipse ca IDE, exista varianta Eclipse ADT Bundle (Android Development Tools).
Acest pachet care conţine IDE-ul şi SDK-ul poate fi găsit la:
https://developer.android.com/sdk/insta ... ml?pkg=adt
În prezent Google lucrează la un alt IDE numit Android Studio, acesta fiind încă la o versiune 0.x, dar toate informaţiile de pe internet sunt prezentate pentru Eclipse, el fiind deja de ani de zile de bază în acest caz.
După ce se instalează totul conform instrucţiunilor, după ce se reuşeşte activarea opţiunlor dezvoltator pe telefon şi se activează USB Debugging pentru lansarea aplicaţiei pe telefon ca terminal de testare, se poate demara programarea propriu-zisă.
Paşii sunt următorii, nu intru în detalii de programare:
- Dupa instalarea uneltelor, se creează un proiect Android nou.
- Se scrie codul şi se are în vedere ca mesajele, string-urile să fie plasate într-un fişier XML din folder-ul Values aflat in Resources, interfaţa se află într-un folder Layout, tot din Resources, la fel imaginile în folderul Drawable, meniurile in Menu etc.
- Dupa finalizarea aplicaţiei, trebuie generat cu KeyTools un certificat unic cu parola, acesta trebuie păstrat cu grijă, o aplicaţie nu poate fi semnată cu alt certificat fara să fie considerată ca una nouă.
- La semnare se mai fac nişte retuşări pentru eficientizare, e vorba de un proces numit Zipalign. Îl face IDE-ul.
- Se pune aplicaţia în magazin, unde este nevoie de tot felul de capturi de ecran, pictogramă de înaltă rezoluţie, descrieri şi, desigur, fişierul APK de uploadat.
- În câteva ore, aplicaţia poate fi găsită la o căutare în magazin.
Pentru a deschide un cont de dezvoltator la developer.android.com, trebuie achitată o taxă iniţială de 25 de dolari; se plăteşte o singură dată la început, apoi totul este gratuit. Fără acest cont, nu se pot distribui aplicaţii prin magazin, ci doar fişiere APK prin modalităţi proprii de promovare.
Revenind la detalii, scriu puţin despre interfaţă, lucrul care ne interesează în general, mai ales dacă suntem utilizatori de cititor de ecran (screen reader).
Interfaţa de obicei este partea care diferă cel mai mult de la un sistem de operare la altul, Android alegând un mod practic, dupa părerea mea, uşor de întreţinut şi de modificat.
Sunt două modalităţi de a realiza interfaţă - static (fişier XML) şi programatic / dinamic (direct în cod Java).
Interfaţă în XML
O fereastră în Android, de cele mai multe ori reprezintă o aşa-zisă activitate. Fiecare astfel de activitate are în spate un fişier XML care conţine interfaţa sub formă de elemente părinte - copil. De exemplu, părintele este un layout linear, iar in el pot fi butoane, check-box-uri, radio-butoane, etichete de text sau chiar alte layout-uri etc.
Un exemplu schematic ar fi:
Cod: Selectaţi tot
<LinearLayout>
<TextView />
<Button />
<CheckBox />
</linearLayout>
Am adus prezentarea aici pentru a explica faptul că, dacă printre acele elemente se află de exemplu o imagine, foarte uşor i se poate pune un atribut special pentru Talkback, astfel încât atunci când se ajunge la ea prin navigare, acea descriere să fie anunţată.
Nu trebuie decât scris:
android:contentDescription="Descrierea mea"
Talkback va anunţa "Descrierea mea" când se ajunge pe imagine sau orice alt element ar fi. Nu apare absolut nimic pe ecran pentru a strica design-ul, deci e foarte simplu şi practic, doar programatorul să ştie ce are de făcut ca să ofere accesibilitate.
În cazul elementelor pe care apare text, cum ar fi TextView sau Button, există desigur atributul
android:text care primeşte ca valoare un text oarecare, de obicei unul declarat în alt XML care este în folderul values.
De exemplu:
android:text="@string/my_text"
Acel my_text este numele stringului din Strings.xml.
De multe ori cel care creează programul pune la butoane imagini, fapt care face sa omită atributul android:text sau poate intenţionat nu vrea să apară şi text. În acest caz, merge din nou atributul android:contentDescription care face ca utilizatorul nevăzător să audă un text ca şi cum ar fi scris acolo.
Un buton din interfaţa zarurilor mele arată aşa, nu are nevoie de contentDescription pentru Talkback:
Cod: Selectaţi tot
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="@dimen/button_size_buttons"
android:text="@string/button_throw"
android:gravity="center_vertical|center_horizontal"
android:onClick="throwDice" />
Fişierul XML cu stringurile este în folderul Values din Resources, daca se creează tot acolo un folder numit values-ro şi este copiat acelaşi string.xml tradus, interfaţa va apărea în română atunci când telefonul este setat ca limbă pe română.
Interfaţa în mod programatic
Toate elementele UI pot fi create şi într-un mod programatic, direct în cod cu tot felul de metode, fiecare element fiind un obiect.
În acest caz, cele două atribute din XML android:text şi android:contentDescription au metodele corespunzătoare:
.setText() şi .setContentDescription().
Astfel cum zarurile sunt generate dinamic ca imagini şi se plasează doar într-un LinearLayout din fişierul XML, va trebui pentru a fi citite de Talkback să fie aplicată metoda .setContentDescription cu descrierea (numărul zarului) ca string la parametru.
Pun mai jos codul aproximativ de generare a zarului cu numărul 6 în aplicaţia mea:
Cod: Selectaţi tot
String curDie = "6"; // numele fişierelor imagine este dX.gif, unde X este numărul zarului.
// Găsirea LinearLayout-ului care va conţine imaginea::
LinearLayout ll = (LinearLayout)findViewById(R.id.llDiceImages);
// Instanţierea unui ImageView:
ImageView mImage = new ImageView(getApplicationContext());
String uri = "@drawable/d"+curDie; // numele imaginii fără extensie, generat dinamic.
int imageResource = getResources().getIdentifier(uri, null, getPackageName());
Drawable res = getResources().getDrawable(imageResource);
mImage.setImageDrawable(res);
mImage.setContentDescription(curDie);
ll.addView(mImage); // adăugăm imaginea pe ecran în zona corespunzătoare.
Codul pare poate greoi, dar l-am pus doar ca exemplu pentru cine programează, să vadă ce uşor poate fi accesibilizat un element de interfaţă.
Sunt multe de spus, în mesajul următor voi scrie concis strict despre acel contentDescription, mesaj ca să poată fi trimis dezvoltatorilor ca solicitare de accesibilizare.
Sunt de exemplu jocuri de Yahtzee accesibile, singurul lucru care nu este citit fiind zarurile. Ei bine, daca dezvoltatorul ar avea chef 5-10 minute, ar adăuga acel .setContentDescription() la ImageiView şi jocul ar deveni accesibil în totalitate.
Daca se mai apucă cineva de Android, aici putem discuta, ne putem da sfaturi etc.