Automatisk skjema fylling, ofte forkortet til bare autofyll, er en funksjon nettlesere har støttet i mange år nå. De fleste av oss bruker det hele tiden. Jeg, for en, finner det uunnværlig under oppgaver som å fylle ut et registreringsskjema eller fullføre en kasseprosess.
Den nyeste versjonen av Android, Android O, gir lignende funksjonalitet til Android-apper. Med andre ord kan Android nå hjelpe brukere å fylle ut skjemaer som tilhører alle appene de har installert på sine enheter. Dette var en etterlengtet funksjon fordi å skrive med et virtuelt tastatur på en liten skjerm har en tendens til å være ganske stresset.
Som en apputvikler kan du bruke det nye Autofyll-rammeverket til å lage din egen tilpassede autofylltjeneste, en tjeneste som bestemmer hvordan du fyller inn en apps innfeltfelt. I denne veiledningen vil jeg vise deg hvordan.
For å kunne følge denne opplæringen må du:
Brann opp Android Studio og opprett et nytt prosjekt med en tom aktivitet. Du må selvfølgelig huske å velge Android 7+ i Mål Android-enheter dialog.
Dette prosjektet trenger noen widgets som tilhører Design Support Library, så åpne app
modulens build.gradle fil og legg til følgende kompilere
avhengighet av det:
kompilere 'com.android.support:design:26.+'
Til slutt, trykk på Synkroniser nå knappen for å oppdatere prosjektet.
I denne opplæringen lager vi en app som inneholder en veldig enkel autofyllt tjeneste som bare retter seg mot de inputfeltene der brukeren forventes å skrive inn en e-postadresse. Fordi nesten alle andre apper på Google Play i dag ber om en e-postadresse, vil denne tjenesten være ganske nyttig.
Vår tjeneste trenger åpenbart å vite hva brukerens e-postadresser er. Derfor, la oss nå bygge en aktivitet der brukeren kan skrive inn og lagre to e-postadresser.
Som du kanskje forventer, vil oppsettet av aktiviteten inneholde to EditText
widgets der brukeren kan skrive inn hans eller hennes e-postadresser. Hvis du vil at den skal overholde retningslinjene for Material Design, plasserer du EditText
widgets inni TextInputLayout
beholdere er en god ide.
I tillegg må oppsettet ha en Knapp
widget brukeren kan trykke for å lagre e-postadressene.
Du er fri til å plassere widgets hvor som helst du vil. Likevel foreslår jeg for øyeblikket at du plasserer dem alle inne i a LinearLayout
hvis orientering er vertikal.
I ovennevnte kode kan du se at Knapp
Widget har en ved trykk
attributt som peker på en metode. Klikk på den gule lyspæren ved siden av dette attributtet i Android Studio for å generere en stub for den i tilknyttede Aktivitet
klasse.
offentlig tomgang saveEmailAddresses (View view) // Mer kode vil bli lagt til her
Vi bruker en delt preferansefil som heter EMAIL_STORAGE for å lagre dataene våre. Du kan bruke getSharedPreferences ()
metode for din Aktivitet
klasse for å få tilgang til filen. I tillegg, for å kunne skrive til filen, må du ringe den redigere()
metode, som genererer en SharedPreferences.Editor
gjenstand.
Følgelig legger du til følgende kode inne i saveEmailAddresses ()
metode:
SharedPreferences.Editor editor = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE) .edit ();
For å hente e-postadressene har brukeren skrevet inn i EditText
widgets, må du først få referanser til dem ved hjelp av findViewById ()
metode, og deretter ringe deres GetText ()
fremgangsmåter.
String primaryEmailAddress = ((EditText) findViewById (R.id.primary)) .getText (). ToString (); String secondaryEmailAddress = ((EditText) findViewById (R.id.secondary)) .getText (). ToString ();
På dette punktet kan du ringe putString ()
Metoden til redaktøren for å legge til e-postadressene i preferansefilen som to nøkkelparpar. Når du gjør det, ikke glem å ringe begå()
Metode for å gjøre endringene dine permanente.
editor.putString ("PRIMARY_EMAIL", primaryEmailAddress); editor.putString ("SECONDARY_EMAIL", secondaryEmailAddress); editor.commit ();
Innstillingsaktiviteten vi opprettet i forrige trinn er for tiden bare en vanlig aktivitet. For å la Android-plattformen vite at det er en innstillingsaktivitet for en autofyllt tjeneste, må vi opprette en metadata-XML-fil som sier det.
Opprett en ny XML-fil kalt email_address_filler.xml i prosjektets res / xml mappe. Inne i det, legg til en
merk og sett verdien av dens settingsActivity
Tilordne navnet på din Aktivitet
klasse.
Du kan nå kjøre appen, skrive inn to e-postadresser, og trykk på Lagre knappen for å lagre dem.
Enhver klasse som utvider abstraktet AutoFillService
klassen kan fungere som en autofyll tjeneste. Så start med å lage en ny Java-klasse med Fil> Ny> Java Class. I dialogboksen som dukker opp, oppgi klassen EmailAddressFiller og sørg for at du angir verdien av super~~POS=TRUNC feltet til AutoFillService
.
Android Studio vil nå be deg om å generere stubber for to abstrakte metoder: onSaveRequest ()
og onFillRequest ()
. I denne opplæringen fokuserer vi bare på onFillRequest ()
metode, som automatisk kalles når brukeren åpner en aktivitet - av alle app-inneholdende inndatafelt.
@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, AvbestillingSignal avbestillingSignal, FillCallback fillCallback) // Mer kode går her
En autofyll tjeneste må analysere en apps brukergrensesnitt og identifisere innsendingsfelter den kan fylle. Det er derfor onFillRequest ()
Metoden mottar en AssistStructure
objekt, som inneholder detaljer om alle widgets som nå er synlige på skjermen. Nærmere bestemt inneholder den et tre av ViewNode
objekter.
Hvis du aldri har sett et slikt tre, foreslår jeg at du bruker uiautomatorviewer verktøyet, som er en del av Android SDK, for å analysere layouthierarkiene for noen få apps. For eksempel, her ser du hva layouthierarkiet for Android standard e-postapplikasjon ser ut:
Naturligvis, for å analysere alle noder av et tre, trenger du en rekursiv metode. La oss lage en nå:
void identifyEmailFields (AssistStructure.ViewNode node, ListemailFields) // Mer kode går her
Som du kan se, har denne metoden en ViewNode
og a Liste
som parametere. Vi skal bruke Liste
å lagre alle feltene som forventer e-postadresser.
Du kan nå lure på hvordan du programmatisk kan fortelle om et inntastingsfelt forventer en e-postadresse. Vel, det er virkelig ingen idiotsikker tilnærming du kan følge. For nå skal vi anta at alle apputviklere alltid gir meningsfulle ressurs-IDer til deres innfeltfelt. Basert på den antakelsen, kan vi ganske enkelt velge alle inntaksfelt hvis ressurs-ID inneholder strenge som "e-post" og "brukernavn".
Følg derfor følgende kode til metoden:
hvis (node.getClassName (). inneholder ("EditText")) String viewId = node.getIdEntry (); hvis (viewId! = null && (viewId.contains ("email") || viewId.contains ("brukernavn"))) emailFields.add (node); komme tilbake;
Deretter når vi møter a ViewNode
objekt som inneholder mer ViewNode
Objekter, vi må rekursivt kalle identifyEmailFields ()
Metode for å analysere alle sine barn. Følgende kode viser deg hvordan:
for (int i = 0; iPå dette punktet kan vi ringe til
identifyEmailFields ()
metode inne ionFillRequest ()
metode og pass rotnoden av visningshierarkiet til den.// Opprett en tom liste ListeemailFields = ny ArrayList <> (); // Populere listen identifyEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields); Hvis tjenesten vår ikke klarer å identifisere noen innskrivingsfelter for e-post, bør den ikke gjøre noe. Legg derfor til følgende kode på den:
hvis (emailFields.size () == 0) returnere;Trinn 2: Opprett og populær eksterne visninger
Hvis vår tjeneste identifiserer et inntastingsfelt som det kan fylle, må det fylle ut en rullegardinliste som vises under inntastingsfeltet. Å gjøre det er imidlertid ikke greit fordi verken inngangsfeltet eller rullegardinlisten tilhører vår app.
For å fylle ut rullegardinlisten, må vi bruke
RemoteViews
objekter. Som navnet antyder, aRemoteViews
Objektet er en samling av visninger som kan vises i en annen app.For å initialisere en
RemoteViews
objekt, du trenger en layout XML-fil. La oss lage en nå kalt email_suggestion.xml. For nå kan det bare inneholde enTextView
widget for å vise en e-postadresse.Følg deretter følgende kode til email_suggestion.xml:
Du kan nå gå tilbake til
onFillRequest ()
metode og lage toRemoteViews
objekter: en for den primære e-posten, og en annen for den sekundære.RemoteViews rvPrimaryEmail = nye RemoteViews (getPackageName (), R.layout.email_suggestion); RemoteViews rvSecondaryEmail = nye RemoteViews (getPackageName (), R.layout.email_suggestion);De
TextView
widgets inne iRemoteViews
objekter må vise de to e-postadressene vi lagret i en delt preferansefil tidligere. For å åpne filen, brukgetSharedPreferences ()
metode igjen. Når det er åpnet, kan du bruke detgetString ()
Metode for å hente begge e-postadressene.Til slutt, for å angi innholdet på fjernkontrollen
TextView
widgets, du må brukesetTextViewText ()
metode.// Last e-postadressene fra preferanser SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Oppdater ekstern TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);Trinn 3: Opprett datasett
Vi kan nå bruke de eksterne visningene for å lage autofyll datasett som kan sendes til alle apper. For å holde denne opplæringen fra å bli for lang, oppretter vi bare datasett for det første e-postfeltet vi møter. Følgende kode viser hvordan du velger bare det første e-postfeltet:
AssistStructure.ViewNode emailField = emailFields.get (0);Et autofyll datasett er ingenting annet enn en forekomst av
datasett
klasse, og kan bygges ved hjelp avDataset.Builder
klasse.Når brukeren velger en av e-postadressene som vår tjeneste viser i rullegardinlisten, må den sette inn innholdet i det tilhørende inntastingsfeltet ved hjelp av
SetValue ()
metode avDataset.Builder
klasse. Du kan imidlertid ikke passere enViewNode
protestere motSetValue ()
metode. Det forventer faktisk en autofyll-ID, som må hentes ved å ringegetAutoFillId ()
metode avViewNode
gjenstand.I tillegg, for å spesifisere teksten som må skrives inn i inntastingsfeltet, må du bruke
AutoFillValue.forText ()
metode. Følgende kode viser deg hvordan:Datasett primaryEmailDataSet = nytt Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Datasett secondaryEmailDataSet = nytt Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secondaryEmail)) .build ();Før du sender datasettene til en app, må du legge dem til en
FillResponse
objekt, som kan bygges ved hjelp avFillResponse.Builder
klasse. Ring detaddDataset ()
Metode to ganger for å legge til begge datasettene.Først når
FillResponse
objektet er klart, send det som et argument tilonSuccess ()
metode avFillCallback
objekt, som er en av parametrene tilonFillRequest ()
metode.FillResponse respons = ny FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (respons);Trinn 4: Oppdater manifestet
Som alle tjenester, må også autofyll tjenesten bli erklært i prosjektets AndroidManifest.xml fil. Mens du gjør det, må du sørge for at den er beskyttet av
android.permission.BIND_AUTO_FILL
tillatelse.Denne tjenesten trenger også en
tag som tillater det å svare på
android.service.autofill.AutoFillService
handling og atag som peker på metadata XML-filen vi opprettet i et tidligere trinn.
Følg derfor følgende linjer til manifestfilen din:
Vår autofyll tjeneste og app er nå klar. Bygg prosjektet og installer appen på enheten din.
4. Aktiver og bruk Autofyll-tjenesten
For å aktivere autofyll tjenesten, åpne enheten innstillinger app og navigere til Apper og varsler> Avansert> Vanlige apper> Autofyll app. I neste skjermbilde velger du appen din i listen over tilgjengelige autofyll-apper.
Du kan nå åpne en app som ber om en e-postadresse for å se autofyll tjenesten din i gang. For eksempel, her er det du vil se på innloggingsskjermene til Instagram og Pinterest:
Konklusjon
Du vet nå hvordan du lager og bruker en egendefinert autofyll-tjeneste for Android. Du kan utvide den til å støtte andre vanlige felt, for eksempel fornavn eller telefonnummer. Du kan også prøve å identifisere inntastingsfelter ved hjelp av andre attributter, for eksempel etiketter og hint.
Hvis du vil vite mer om Autofill Framework, kan du se den offisielle dokumentasjonen. Og i mellomtiden, sjekk ut noen av våre andre innlegg om Android O og Android app utvikling!