Completarea automată a formularului, adesea redusă la completarea automată, este o funcție pe care browserele au suportat de mulți ani. Cei mai mulți dintre noi o folosesc tot timpul. Eu, pentru unul, îl consider indispensabil în timpul sarcinilor cum ar fi completarea unui formular de înregistrare sau finalizarea unui proces de plată.
Cea mai recentă versiune de Android, Android O, aduce funcționalități similare aplicațiilor Android. Cu alte cuvinte, Android poate ajuta utilizatorii să completeze formularele care aparțin tuturor aplicațiilor pe care le-au instalat pe dispozitivele lor. Aceasta a fost o caracteristică mult așteptată, deoarece tastarea cu o tastatură virtuală pe un mic ecran tinde să fie destul de hassle.
În calitate de dezvoltator de aplicații, puteți utiliza noul Autofill Framework pentru a vă crea propriul serviciu de completare automată, un serviciu care decide cum să introduceți câmpurile de intrare ale unei aplicații. În acest tutorial, vă voi arăta cum.
Pentru a putea urma acest tutorial, veți avea nevoie de:
Activați Android Studio și creați un nou proiect cu o activitate goală. Trebuie, bineînțeles, să vă amintiți să alegeți Android 7+ în Direcționați dispozitive Android dialog.
Acest proiect va necesita câteva widget-uri care aparțin Bibliotecii de suport pentru proiect, deschideți astfel aplicaţia
ale modulului build.gradle fișier și adăugați următoarele compila
dependența de el:
compile 'com.android.support:design:26.+'
În cele din urmă, apăsați pe Sincronizați acum pentru actualizarea proiectului.
În acest tutorial, vom crea o aplicație care conține un serviciu de completare automată foarte simplu, care vizează numai acele câmpuri de intrare unde se așteaptă ca utilizatorul să scrie într-o adresă de e-mail. Deoarece aproape orice altă aplicație de pe Google Play cere astăzi o adresă de e-mail, acest serviciu va fi foarte util.
Serviciul nostru, evident, trebuie să știe care sunt adresele de e-mail ale utilizatorului. Prin urmare, să construim acum o activitate în care utilizatorul poate introduce și salva două adrese de e-mail.
Așa cum vă puteți aștepta, structura activității va conține două Editează textul
widget-uri pe care utilizatorul le poate introduce în adresele de e-mail. Dacă doriți să respecte instrucțiunile din Material Design, introduceți Editează textul
widget-uri înăuntru TextInputLayout
containerele reprezintă o idee bună.
În plus, aspectul trebuie să aibă a Buton
widget pe care utilizatorul îl poate apăsa pentru a salva adresele de e-mail.
Sunteți liberi să plasați widget-urile oriunde doriți. Cu toate acestea, pentru moment, vă sugerez să le plasați pe toate într-un LinearLayout
a cărei orientare este verticală.
În codul de mai sus, puteți vedea că Buton
widgetul are un onClick
atributul care indică o metodă. Faceți clic pe becul galben de lângă acest atribut din Android Studio pentru a genera un stub pentru el în asociat Activitate
clasă.
public void saveEmailAddresses (Vizualizare vedere) // Mai mult cod va fi adăugat aici
Vom folosi un fișier de preferințe partajat numit EMAIL_STORAGE pentru a salva datele noastre. Puteți utiliza funcția getSharedPreferences ()
metoda dvs. Activitate
pentru a accesa fișierul. În plus, pentru a putea scrie în fișier, trebuie să-i sunați Editați | ×()
metoda care generează a SharedPreferences.Editor
obiect.
În consecință, adăugați următorul cod în interiorul saveEmailAddresses ()
metodă:
Editorul SharedPreferences.Editor = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE) .edit ();
Pentru a prelua adresele de e-mail pe care le-a introdus utilizatorul Editează textul
widget-uri, va trebui să primiți mai întâi referințe la acestea utilizând findViewById ()
și apoi apelați-le getText ()
metode.
String primarEmailAddress = ((EditText) findViewById (R.id.primary)) .getText (). ToString (); Șirul secundarEmailAddress = ((EditText) findViewById (R.id.secondary)) .getText (). ToString ();
În acest moment, puteți apela putString ()
metoda editorului de a adăuga adresele de e-mail la fișierul de preferințe ca două perechi de valori cheie. După ce faceți acest lucru, nu uitați să apelați comite ()
pentru a vă face schimbările permanente.
editor.putString ("PRIMARY_EMAIL", primarAdresa de e-mail); editor.putString ("SECONDARY_EMAIL", secundarAdresa de e-mail); editor.commit ();
Activitatea de setări pe care am creat-o în pasul anterior este în prezent doar o activitate obișnuită. Pentru a permite platformei Android să știe că este o activitate de setări pentru un serviciu de completare automată, trebuie să creați un fișier XML meta-dată care să spună acest lucru.
Creați un nou fișier XML numit email_address_filler.xml în proiect res / xml pliant. Înăuntru, adăugați un
eticheta și setați valoarea acesteia settingsActivity
atribuiți numele dvs. Activitate
clasă.
Acum puteți rula aplicația, tastați două adrese de e-mail și apăsați pe Salvați pentru a le salva.
Orice clasă care extinde rezumatul AutoFillService
clasa poate servi ca serviciu de completare automată. Începeți prin a crea o nouă clasă Java cu Fișier> Nou> Clasa Java. În caseta de dialog care apare, denumiți clasa EmailAddressFiller și asigurați-vă că setați valoarea superclasei domeniu la AutoFillService
.
Android Studio vă va solicita acum să generați stub-uri pentru două metode abstracte: onSaveRequest ()
și onFillRequest ()
. În acest tutorial, vom concentra doar pe onFillRequest ()
, care se numește automat ori de câte ori utilizatorul deschide o activitate - a câmpurilor de introducere care conțin aplicații.
@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, AnulareSignal anulareSignal, FillCallback fillCallback) // Mai multe coduri aici
Un serviciu de completare automată trebuie să analizeze interfața de utilizator a unei aplicații și să identifice câmpurile de intrare pe care le poate completa. De aceea onFillRequest ()
metoda primește un AssistStructure
obiect, care conține detalii despre toate widgeturile care sunt vizibile în prezent pe ecran. Mai exact, conține un copac de ViewNode
obiecte.
Dacă nu ați văzut niciodată un astfel de copac, vă sugerez să folosiți uiautomatorviewer , care face parte din SDK-ul Android, pentru a analiza ierarhiile de layout ale câtorva aplicații. De exemplu, iată cum arată ierarhia de aspect a aplicației de e-mail implicită pentru Android:
Firește, pentru a analiza toate nodurile unui copac, aveți nevoie de o metodă recursivă. Să creați unul acum:
void identifyEmailFields (nod AssistStructure.ViewNode, listăemailFields) // Mai multe coduri aici
După cum puteți vedea, această metodă are o ViewNode
și a Listă
ca parametri. Vom folosi Listă
pentru a stoca toate câmpurile de intrare care așteaptă adrese de e-mail.
S-ar putea să vă întrebați cum puteți afla în mod programatic dacă un câmp de intrare așteaptă o adresă de e-mail. Ei bine, într-adevăr nu există o abordare sigură pe care să o poți urma. Pentru moment, vom presupune că toți dezvoltatorii de aplicații dau întotdeauna ID-uri de resurse semnificative pentru câmpurile lor de intrare. Pe baza acestei ipoteze, putem alege pur și simplu toate câmpurile de intrare ale căror coduri de identificare a resurselor conțin șiruri de caractere precum "e-mail" și "nume de utilizator".
În consecință, adăugați următorul cod la metodă:
dacă node.getClassName () conține ("EditText")) String viewId = node.getIdEntry (); dacă (viewId! = null && (viewId.contains ("email") || viewId.contains ("username"))) emailFields.add (nodul); întoarcere;
Apoi, ori de câte ori întâlnim a ViewNode
obiect care conține mai mult ViewNode
obiecte, trebuie să apelăm recursiv identifyEmailFields ()
metodă de analiză a tuturor copiilor săi. Următorul cod vă arată cum:
pentru (int i = 0; iÎn acest moment, putem apela
identifyEmailFields ()
în interiorul metodeionFillRequest ()
și să treacă prin nodul rădăcină al ierarhiei de vizualizare.// Creați o listă cu lista goalăemailFields = nou ArrayList <> (); // Populați lista identificaEmailFields (asistentStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields); Dacă serviciul nostru nu reușește să identifice câmpurile de intrare pentru e-mailuri, nu ar trebui să facă nimic. Prin urmare, adăugați următorul cod:
dacă (emailFields.size () == 0) retur;Pasul 2: Crearea și popularea vederilor la distanță
Dacă serviciul nostru identifică un câmp de intrare pe care îl poate umple, trebuie să populeze o listă derulantă care va fi afișată sub câmpul de introducere. Cu toate acestea, nu este simplu, deoarece nici câmpul de intrare, nici lista drop-down aparțin aplicației noastre.
Pentru a popula lista drop-down, trebuie să folosim
RemoteViews
obiecte. După cum sugerează și numele, aRemoteViews
Obiect este o colecție de vizualizări care pot fi afișate într-o altă aplicație.Pentru a inițializa o
RemoteViews
obiect, veți avea nevoie de un fișier XML de aspect. Să creați unul acum sunat email_suggestion.xml. Pentru moment, poate conține doar unaTextView
widget pentru a afișa o adresă de e-mail.În consecință, adăugați următorul cod la email_suggestion.xml:
Acum te poți întoarce la
onFillRequest ()
și creați douăRemoteViews
obiecte: unul pentru e-mailul principal și altul pentru secundar.RemoteViews rvPrimaryEmail = noi RemoteViews (getPackageName (), R.layout.email_suggestion); RemoteViews rvSecondaryEmail = noi RemoteViews (getPackageName (), R.layout.email_suggestion);
TextView
widget-uri în interiorulRemoteViews
obiectele trebuie să afișeze mai devreme cele două adrese de e-mail pe care le-am stocat într-un fișier de preferințe comune. Pentru a deschide fișierul, utilizațigetSharedPreferences ()
din nou. După ce se deschide, poți să-l foloseștigetString ()
pentru a prelua atât adresele de e-mail.În cele din urmă, pentru a seta conținutul telecomenzii
TextView
widget-uri, trebuie să utilizațisetTextViewText ()
metodă.// Încărcați adresele de e-mail din preferințele SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primarEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secundarEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Actualizare la distanță TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secundarEmail);Pasul 3: Creați seturi de date
Acum putem folosi vizualizările la distanță pentru a crea seturi de date de completare automată care pot fi trimise către orice aplicație. Pentru a păstra prea mult timp acest tutorial, vom crea seturi de date numai pentru primul câmp de intrare a e-mailului pe care îl întâlnim. Următorul cod arată cum se alege numai primul câmp de intrare a e-mailului:
AssistStructure.ViewNode adresa emailField = emailFields.get (0);Un set de date despre completarea automată nu este altceva decât o instanță a unui set de date
Setul de date
clasa, și poate fi construit folosindDataset.Builder
clasă.Când utilizatorul selectează una dintre adresele de e-mail pe care serviciul nostru le arată în lista derulantă, trebuie să seteze conținutul câmpului de intrare asociat utilizând
SetValue ()
metodă aDataset.Builder
clasă. Cu toate acestea, nu puteți trece aViewNode
obiecte față deSetValue ()
metodă. Se așteaptă, de fapt, un identificator de completare automată, care trebuie obținut prin apelareagetAutoFillId ()
metodă aViewNode
obiect.În plus, pentru a specifica textul care trebuie scris în câmpul de introducere, trebuie să utilizați
AutoFillValue.forText ()
metodă. Următorul cod vă arată cum:Setul de date primarEmailDataSet = nou Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Setul de date secundarEmailDataSet = nou Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secundarEmail)) .build ();Înainte de a trimite seturile de date unei aplicații, trebuie să le adăugați la o aplicație
FillResponse
obiect, care poate fi construit folosindFillResponse.Builder
clasă. Sună-laddDataset ()
de două ori pentru a adăuga atât seturile de date.Odata ce
FillResponse
obiect este gata, trece ca un argument laonSuccess ()
metodă aFillCallback
obiect, care este unul dintre parametriionFillRequest ()
metodă.Răspunsul FillResponse = noul FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (răspuns);Pasul 4: Actualizați Manifestul
Ca toate serviciile, serviciul de completare automată trebuie să fie declarat în proiect AndroidManifest.xml fişier. În timp ce faceți acest lucru, trebuie să vă asigurați că este protejat de
android.permission.BIND_AUTO_FILL
permisiune.Acest serviciu are nevoie și de un serviciu
care îi permite să răspundă la
android.service.autofill.AutoFillService
acțiune, și acare indică fișierul XML meta-date pe care l-am creat într-un pas anterior.
În consecință, adăugați următoarele fișiere în fișierul manifest:
Serviciul nostru de completare automată și aplicația sunt acum pregătite. Construiți proiectul și instalați aplicația pe dispozitiv.
4. Activați și utilizați serviciul Completare automată
Pentru a activa serviciul de completare automată, deschideți-l Setări app și navigați la Aplicații și notificări> Avansat> Aplicații implicite> Aplicație de completare automată. În ecranul următor, selectați aplicația din lista cu aplicațiile de completare automată disponibile.
Acum puteți deschide orice aplicație care solicită o adresă de e-mail pentru a vedea serviciul de completare automată în acțiune. De exemplu, iată ce ați vedea pe ecranele de conectare ale Instagram și Pinterest:
Concluzie
Acum știți cum să creați și să utilizați un serviciu personalizat de completare automată pentru Android. Simțiți-vă liber să îl extindeți pentru a suporta alte câmpuri obișnuite, cum ar fi numele de primire sau numărul de telefon. De asemenea, puteți încerca să identificați câmpurile de intrare utilizând alte atribute, cum ar fi etichetele și sugestiile.
Pentru a afla mai multe despre Autofill Framework, consultați documentația oficială. Între timp, verificați câteva dintre celelalte postări despre dezvoltarea aplicațiilor Android O și Android!