Automatisk formulär fyllning, ofta förkortad till bara autofyllning, är en funktion som webbläsare har stödt i flera år nu. De flesta av oss använder det hela tiden. Jag, för en, finner det oumbärligt under uppgifter som att fylla i ett registreringsformulär eller slutföra en kassaprocess.
Den senaste versionen av Android, Android O, ger liknande funktioner till Android-appar. Med andra ord kan Android nu hjälpa användare att fylla i formulär som hör till alla appar som de har installerat på sina enheter. Detta var en efterlängtad funktion eftersom det är ganska besvärligt att skriva med ett virtuellt tangentbord på en liten skärm.
Som apputvecklare kan du använda den nya autofyllningsramen för att skapa din egen anpassade autofylltjänst, en tjänst som bestämmer hur du fyller i en apps inmatningsfält. I denna handledning visar jag dig hur.
För att kunna följa denna handledning behöver du:
Avfyra Android Studio och skapa ett nytt projekt med en tom aktivitet. Du måste självklart komma ihåg att välja Android 7+ i Mål Android-enheter dialog.
Projektet behöver några widgets som hör till Design Support Library, så öppna app
modulens build.gradle fil och lägg till följande sammanställa
beroende av det:
kompilera 'com.android.support:design:26.+'
Slutligen, tryck på Synkronisera nu knappen för att uppdatera projektet.
I den här handledningen skapar vi en app som innehåller en mycket enkel autofyll tjänst som endast riktar sig till de inmatningsfält där användaren förväntas skriva in en e-postadress. Eftersom nästan alla andra apper på Google Play idag ber om en e-postadress kommer den här tjänsten vara ganska användbar.
Vår service behöver självklart veta vad användarens e-postadresser är. Låt oss nu bygga en aktivitet där användaren kan skriva in och spara två e-postadresser.
Som du kan förvänta sig kommer aktiviteten att innehålla två Redigera text
widgets där användaren kan skriva in sina e-postadresser. Om du vill att den ska följa riktlinjerna för Materialdesign, placerar du Redigera text
widgets inuti TextInputLayout
behållare är en bra idé.
Dessutom måste layouten ha en Knapp
widget som användaren kan trycka på för att spara e-postadresserna.
Du är fri att placera widgetsna vart du vill. Ändå föreslår jag för närvarande att du placerar dem alla inuti a Linear
vars orientering är vertikal.
I ovanstående kod kan du se att Knapp
widgeten har en onClick
attribut pekar på en metod. Klicka på den gula glödlampan bredvid det här attributet i Android Studio för att skapa en stub för den i den därtill hörande Aktivitet
klass.
public void saveEmailAddresses (View view) // Mer kod läggs till här
Vi använder en gemensam inställningsfil som heter EMAIL_STORAGE för att spara vår data. Du kan använda getSharedPreferences ()
metod för din Aktivitet
klass för att komma åt filen. För att kunna skriva till filen måste du också ringa redigera()
metod som genererar a SharedPreferences.Editor
objekt.
Följ därmed följande kod inuti saveEmailAddresses ()
metod:
SharedPreferences.Editor editor = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE) .edit ();
För att hämta e-postadresserna har användaren skrivit in i Redigera text
widgets, måste du först få referenser till dem med hjälp av findViewById ()
metod och ring sedan deras gettext ()
metoder.
String primaryEmailAddress = ((EditText) findViewById (R.id.primary)) .getText (). ToString (); String secondaryEmailAddress = ((EditText) findViewById (R.id.secondary)) .getText (). ToString ();
Vid denna tidpunkt kan du ringa putString ()
Metod för redaktören att lägga till e-postadresserna i preferensfilen som två nyckelvärdespar. När du gör det, glöm inte att ringa begå()
Metod för att göra dina ändringar permanenta.
editor.putString ("PRIMARY_EMAIL", primaryEmailAddress); editor.putString ("SECONDARY_EMAIL", secondaryEmailAddress); editor.commit ();
Inställningsaktiviteten som vi skapade i föregående steg är för närvarande bara en vanlig aktivitet. För att låta Android-plattformen veta att det är en inställningsaktivitet för en autofyll tjänst måste vi skapa en metadata XML-fil som säger det.
Skapa en ny XML-fil som heter email_address_filler.xml i projektets res / xml mapp. Inne i det, lägg till en
tag och ställ in värdet av dess settingsActivity
attribut till namnet på din Aktivitet
klass.
Nu kan du köra appen, skriva in två e-postadresser och trycka på Spara knappen för att spara dem.
Varje klass som utökar abstrakten AutoFillService
klassen kan fungera som en autofyll tjänst. Börja med att skapa en ny Java-klass med Arkiv> Ny> Java Class. I den dialog som dyker upp, namnge klassen EmailAddressFiller och se till att du ställer in värdet på super fält till AutoFillService
.
Android Studio kommer nu att be dig att skapa stubbar för två abstrakta metoder: onSaveRequest ()
och onFillRequest ()
. I denna handledning fokuserar vi bara på onFillRequest ()
metod som automatiskt kallas när användaren öppnar en aktivitet-av alla appinnehållande inmatningsfält.
@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, AvbrytelseSignal cancellationSignal, FillCallback fillCallback) // Mer kod går här
En autofyll tjänst behöver analysera en apps användargränssnitt och identifiera inmatningsfält som den kan fylla. Det är därför onFillRequest ()
Metoden tar emot en AssistStructure
objekt, som innehåller detaljer om alla widgets som för tillfället är synliga på skärmen. Mer exakt innehåller den ett träd av ViewNode
objekt.
Om du aldrig sett ett sådant träd, föreslår jag att du använder uiautomatorviewer verktyg, som ingår i Android SDK, för att analysera layouthierarkierna för några få appar. Till exempel, här är vad layouthierarkin för Android: s standardmailapp ser ut:
Naturligtvis, för att analysera alla noder av ett träd behöver du en rekursiv metod. Låt oss skapa en nu:
void identifyEmailFields (AssistStructure.ViewNode nod, ListemailFields) // Mer kod går här
Som du kan se har den här metoden en ViewNode
och a Lista
som dess parametrar. Vi ska använda Lista
för att lagra alla inmatningsfält som förväntar sig e-postadresser.
Du kanske nu undrar hur du kan programmera om ett inmatningsfält förväntar dig en e-postadress. Tja, det finns verkligen ingen idiotsäker tillvägagångssätt som du kan följa. För närvarande antar vi att alla apputvecklare alltid ger meningsfulla resurs-ID till sina inmatningsfält. Baserat på det antagandet kan vi helt enkelt välja alla inmatningsfält vars resurs-ID innehåller strängar som "e-post" och "användarnamn".
Följ således följande kod till metoden:
om (node.getClassName (). innehåller ("EditText")) String viewId = node.getIdEntry (); om (viewId! = null && (viewId.contains ("email") || viewId.contains ("användarnamn"))) emailFields.add (nod); lämna tillbaka;
Nästa gång vi stöter på a ViewNode
objekt som innehåller mer ViewNode
Objekt, vi måste rekursivt kalla identifyEmailFields ()
Metod för att analysera alla sina barn. Följande kod visar hur:
för (int i = 0; iVid denna tidpunkt kan vi ringa
identifyEmailFields ()
metod inutionFillRequest ()
metod och överför rootnoden i vyhierarkin till den.// Skapa en tom lista ListaemailFields = ny ArrayList <> (); // Fyll i listan identifyEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields); Om vår tjänst inte kan identifiera några inmatningsfält för e-postmeddelanden, ska det inte göra något. Lägg därför till följande kod på den:
om (emailFields.size () == 0) returnera;Steg 2: Skapa och befolka fjärranslutningar
Om vår tjänst identifierar ett inmatningsfält som det kan fylla måste det fyllas i en rullgardinslista som visas under inmatningsfältet. Att göra det är emellertid inte enkelt eftersom varken inmatningsfältet eller rullgardinsmenyn tillhör vår app.
För att fylla i listrutan måste vi använda
RemoteViews
objekt. Som namnet antyder, aRemoteViews
Objektet är en samling synvyer som kan visas i en annan app.För att initiera en
RemoteViews
objekt, du behöver en layout XML-fil. Låt oss skapa en nu kallad email_suggestion.xml. För nu kan det innehålla bara enTextview
widget för att visa en e-postadress.Följ således följande kod till email_suggestion.xml:
Du kan nu gå tillbaka till
onFillRequest ()
metod och skapa tvåRemoteViews
objekt: en för den primära e-posten, och en för sekundären.RemoteViews rvPrimaryEmail = nya RemoteViews (getPackageName (), R.layout.email_suggestion); RemoteViews rvSecondaryEmail = nya RemoteViews (getPackageName (), R.layout.email_suggestion);De
Textview
widgets inutiRemoteViews
Objekt måste visa de två e-postadresserna vi lagrade i en delad preferensfil tidigare. För att öppna filen, användgetSharedPreferences ()
metod igen. När det har öppnats kan du använda detgetString ()
metod för att hämta båda e-postadresserna.Slutligen, för att ställa in innehållet på fjärrkontrollen
Textview
widgets, du måste användasetTextViewText ()
metod.// Ladda e-postadresserna från inställningar SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Uppdatera avlägsna TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);Steg 3: Skapa dataset
Vi kan nu använda fjärrvyer för att skapa autofylla dataset som kan skickas till alla appar. För att hålla denna handledning från att bli för lång skapar vi endast dataset för det första inmatningsfältet för e-post som vi stöter på. Följande kod visar hur du bara väljer det första inmatningsfältet för e-post:
AssistStructure.ViewNode emailField = emailFields.get (0);En autofylldataset är ingenting annat än en förekomst av
dataset
klass, och kan byggas med hjälp avDataset.Builder
klass.När användaren väljer en av de e-postadresser som vår tjänst visar i listrutan måste den ställa in innehållet i det tillhörande inmatningsfältet med hjälp av
satt värde()
metod förDataset.Builder
klass. Du kan dock inte passera enViewNode
protestera motsatt värde()
metod. Det förväntar sig faktiskt en autofyllidentifierare, vilken måste erhållas genom att ringagetAutoFillId ()
metod förViewNode
objekt.För att ange texten som måste skrivas i inmatningsfältet måste du använda
AutoFillValue.forText ()
metod. Följande kod visar hur:Dataset primaryEmailDataSet = nytt Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Dataset secondaryEmailDataSet = nytt Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secondaryEmail)) .build ();Innan du skickar datasætten till en app måste du lägga till dem i en
FillResponse
objekt som kan byggas med hjälp avFillResponse.Builder
klass. Ring dessaddDataset ()
Metod två gånger för att lägga till båda dataseten.När
FillResponse
objektet är klart, skicka det som ett argument tillonSuccess ()
metod förFillCallback
objekt, vilket är en av parametrarna föronFillRequest ()
metod.FillResponse response = new FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (svar);Steg 4: Uppdatera manifestet
Liksom alla tjänster måste autofill-tjänsten också anges i projektets AndroidManifest.xml fil. Medan du gör det måste du se till att den är skyddad av
android.permission.BIND_AUTO_FILL
lov.Denna tjänst behöver också en
tagg som gör det möjligt att svara på
android.service.autofill.AutoFillService
åtgärd och atag som pekar på metadata XML-filen som vi skapade i ett tidigare steg.
Följ följande linjer till din manifestfil:
Vår autofyll service och app är nu redo. Bygg projektet och installera appen på din enhet.
4. Aktivera och använd autofyllstjänsten
För att aktivera autofyllningstjänsten öppnar du enhetens inställningar app och navigera till Appar och meddelanden> Avancerat> Standardprogram> Autofyll app. På nästa skärm markerar du din app från listan med tillgängliga autofill-appar.
Du kan nu öppna en app som begär en e-postadress för att se din autofyll tjänst i åtgärd. Till exempel, här är vad du skulle se på Instagram och Pinterest inloggningsskärmar:
Slutsats
Du vet nu hur man skapar och använder en anpassad autofyll tjänst för Android. Ta gärna ut det för att stödja andra vanliga fält, t.ex. förnamn eller telefonnummer. Du kan också försöka identifiera inmatningsfält med andra attribut, till exempel etiketter och tips.
Om du vill veta mer om Autofill Framework, hänvisar du till den officiella dokumentationen. Och under tiden, kolla in några av våra andra inlägg om Android O och Android apputveckling!