Le remplissage automatique, souvent abrégé en remplissage automatique, est une fonctionnalité prise en charge par les navigateurs depuis des années. La plupart d'entre nous l'utilisent tout le temps. Pour ma part, je le trouve indispensable lors de tâches telles que remplir un formulaire d'inscription ou compléter un processus de commande.
La dernière version d'Android, Android O, apporte des fonctionnalités similaires aux applications Android. En d'autres termes, Android peut désormais aider les utilisateurs à remplir des formulaires appartenant à toutes les applications qu'ils ont installées sur leurs appareils. C'était une fonctionnalité très attendue, car taper avec un clavier virtuel sur un petit écran a tendance à être assez compliqué.
En tant que développeur d'applications, vous pouvez utiliser le nouveau cadre de remplissage automatique pour créer votre propre service de remplissage automatique personnalisé, un service qui détermine comment remplir les champs de saisie d'une application. Dans ce tutoriel, je vais vous montrer comment.
Pour pouvoir suivre ce tutoriel, vous aurez besoin de:
Lancez Android Studio et créez un nouveau projet avec une activité vide. Vous devez bien sûr vous rappeler de choisir Android 7+ dans le Périphériques Android cibles dialogue.
Ce projet aura besoin de quelques widgets appartenant à la bibliothèque de support de conception. Ouvrez donc le app
modules build.gradle déposer et ajouter ce qui suit compiler
dépendance à elle:
compiler 'com.android.support:design:26.+'
Enfin, appuyez sur le Synchroniser maintenant bouton pour mettre à jour le projet.
Dans ce didacticiel, nous allons créer une application contenant un service de remplissage automatique très simple, qui cible uniquement les champs de saisie dans lesquels l'utilisateur est censé taper une adresse électronique. Parce que presque toutes les autres applications de Google Play demandent aujourd'hui une adresse e-mail, ce service sera très utile..
Notre service a évidemment besoin de savoir quelles sont les adresses électroniques de l'utilisateur. Par conséquent, laissez-nous maintenant construire une activité où l'utilisateur peut taper et enregistrer deux adresses e-mail.
Comme on pouvait s’y attendre, la présentation de l’activité contiendra deux Éditer le texte
widgets où l'utilisateur peut taper ses adresses e-mail. Si vous souhaitez qu’il adhère aux directives de Material Design, placez le Éditer le texte
widgets à l'intérieur TextInputLayout
les conteneurs est une bonne idée.
De plus, la mise en page doit avoir un Bouton
widget l'utilisateur peut appuyer sur pour enregistrer les adresses électroniques.
Vous êtes libre de placer les widgets où vous voulez. Néanmoins, pour le moment, je vous suggère de les placer tous dans un LinearLayout
dont l'orientation est verticale.
Dans le code ci-dessus, vous pouvez voir que le Bouton
widget a un sur clic
attribut pointant sur une méthode. Cliquez sur l'ampoule jaune située à côté de cet attribut dans Android Studio pour générer un raccord pour celui-ci dans le code associé. Activité
classe.
public void saveEmailAddresses (Afficher la vue) // D'autres codes seront ajoutés ici
Nous utiliserons un fichier de préférences partagé appelé EMAIL_STORAGE pour sauvegarder nos données. Vous pouvez utiliser le getSharedPreferences ()
méthode de votre Activité
classe pour accéder au fichier. De plus, pour pouvoir écrire dans le fichier, vous devez appeler son modifier()
méthode, qui génère un SharedPreferences.Editor
objet.
En conséquence, ajoutez le code suivant dans le répertoire saveEmailAddresses ()
méthode:
SharedPreferences.Editor editor = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE) .edit ();
Pour récupérer les adresses électroniques que l'utilisateur a saisies dans le champ Éditer le texte
widgets, vous devez d’abord obtenir des références à ceux-ci en utilisant le findViewById ()
méthode, puis appelez leur getText ()
les méthodes.
Chaîne primaryEmailAddress = ((EditText) findViewById (R.id.primary)) .getText (). ToString (); String secondaryEmailAddress = ((EditText) findViewById (R.id.secondary)) .getText (). ToString ();
À ce stade, vous pouvez appeler le putString ()
méthode de l'éditeur pour ajouter les adresses électroniques au fichier de préférences sous forme de deux paires de valeurs clés. Après cela, n’oubliez pas d’appeler le commettre()
méthode pour rendre vos modifications permanentes.
editor.putString ("PRIMARY_EMAIL", primaryEmailAddress); editor.putString ("SECONDARY_EMAIL", secondaryEmailAddress); editor.commit ();
L'activité de paramétrage que nous avons créée à l'étape précédente n'est actuellement qu'une activité ordinaire. Pour que la plate-forme Android sache qu'il s'agit d'une activité de paramétrage pour un service de remplissage automatique, nous devons créer un fichier XML de métadonnées qui l'indique..
Créez un nouveau fichier XML appelé email_address_filler.xml dans le projet res / xml dossier. À l'intérieur, ajoutez un
tag et définir la valeur de son paramètresActivité
attribuer au nom de votre Activité
classe.
Vous pouvez maintenant exécuter l'application, tapez deux adresses e-mail et appuyez sur le bouton sauvegarder bouton pour les sauvegarder.
Toute classe qui étend l'abrégé AutoFillService
La classe peut servir de service de remplissage automatique. Alors commencez par créer une nouvelle classe Java avec Fichier> Nouveau> Classe Java. Dans la boîte de dialogue qui s’affiche, nommez la classe. EmailAddressFiller et assurez-vous que vous définissez la valeur de la Superclasse champ à AutoFillService
.
Android Studio va maintenant vous demander de générer des stubs pour deux méthodes abstraites: onSaveRequest ()
et onFillRequest ()
. Dans ce tutoriel, nous allons nous concentrer uniquement sur les onFillRequest ()
méthode, qui est automatiquement appelée chaque fois que l'utilisateur ouvre une activité de tout champ de saisie contenant une application.
@Override public null onFillRequest (AssistStructure assistStructure, Bundle, Annulation du signal annulationSignal, FillCallback fillCallback) // D'autres codes vont ici
Un service de remplissage automatique doit analyser l'interface utilisateur d'une application et identifier les champs de saisie qu'elle peut remplir. C'est pourquoi le onFillRequest ()
méthode reçoit un AssistStructure
objet, qui contient des détails sur tous les widgets actuellement visibles à l'écran. Plus précisément, il contient un arbre de ViewNode
objets.
Si vous n'avez jamais vu un tel arbre, je vous suggère d'utiliser le uiautomatorviewer Cet outil, qui fait partie du SDK Android, permet d'analyser les hiérarchies de disposition de quelques applications. Par exemple, voici à quoi ressemble la hiérarchie de présentation de l'application de messagerie par défaut d'Android:
Naturellement, pour analyser tous les nœuds d'un arbre, vous avez besoin d'une méthode récursive. Créons-en un maintenant:
void identifierEmailFields (noeud AssistStructure.ViewNode, ListemailFields) // Plus de code va ici
Comme vous pouvez le constater, cette méthode a ViewNode
et un liste
comme ses paramètres. Nous allons utiliser le liste
pour stocker tous les champs de saisie attendus par des adresses électroniques.
Vous vous demandez peut-être maintenant comment indiquer par programme si un champ de saisie attend une adresse électronique. Eh bien, il n'y a vraiment aucune approche infaillible que vous pouvez suivre. Pour le moment, nous allons supposer que tous les développeurs d'applications attribuent toujours des identifiants de ressources significatifs à leurs champs d'entrée. Sur la base de cette hypothèse, nous pouvons simplement sélectionner tous les champs de saisie dont les identifiants de ressources contiennent des chaînes telles que "email" et "nom d'utilisateur"..
En conséquence, ajoutez le code suivant à la méthode:
if (node.getClassName (). contient ("EditText")) String viewId = node.getIdEntry (); if (viewId! = null && (viewId.contains ("email") || viewId.contains ("nomutilisateur"))) emailFields.add (noeud); revenir;
Ensuite, chaque fois que nous rencontrons un ViewNode
objet qui contient plus ViewNode
objets, nous devons appeler récursivement le identifierEmailFields ()
méthode pour analyser tous ses enfants. Le code suivant vous montre comment:
pour (int i = 0; iÀ ce stade, nous pouvons appeler le
identifierEmailFields ()
méthode à l'intérieur duonFillRequest ()
méthode et transmettez-lui le noeud racine de la hiérarchie de vues.// Créer une liste vide ListemailFields = new ArrayList <> (); // Remplit la liste identifierEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields); Si notre service ne parvient pas à identifier les champs de saisie des courriels, il ne devrait rien faire. Par conséquent, ajoutez-y le code suivant:
if (emailFields.size () == 0) renvoie;Étape 2: Créer et remplir des vues distantes
Si notre service identifie un champ de saisie qu'il peut remplir, il doit remplir une liste déroulante qui sera affichée sous le champ de saisie. Cela n'est toutefois pas simple, car ni le champ de saisie ni la liste déroulante n'appartiennent à notre application..
Pour remplir la liste déroulante, nous devons utiliser
Vues à distance
objets. Comme son nom l'indique, unVues à distance
objet est un ensemble de vues pouvant être affichées dans une autre application.Pour initialiser un
Vues à distance
objet, vous aurez besoin d'un fichier XML de mise en page. Créons un maintenant appelé email_suggestion.xml. Pour l'instant, il ne peut contenir qu'un seulAffichage
widget pour afficher une adresse email.En conséquence, ajoutez le code suivant à email_suggestion.xml:
Vous pouvez maintenant revenir à la
onFillRequest ()
méthode et créer deuxVues à distance
objets: un pour l'e-mail principal et un autre pour le secondaire.RemoteViews rvPrimaryEmail = new RemoteViews (getPackageName (), R.layout.email_suggestion); RemoteViews rvSecondaryEmail = new RemoteViews (getPackageName (), R.layout.email_suggestion);le
Affichage
widgets à l'intérieur duVues à distance
les objets doivent afficher les deux adresses électroniques que nous avons stockées précédemment dans un fichier de préférences partagé. Pour ouvrir le fichier, utilisez legetSharedPreferences ()
méthode à nouveau. Une fois ouvert, vous pouvez utiliser songetString ()
méthode pour récupérer les deux adresses e-mail.Enfin, pour définir le contenu de la télécommande
Affichage
widgets, vous devez utiliser lesetTextViewText ()
méthode.// Charge les adresses électroniques à partir des préférences SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Mise à jour de TextViews à distance rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);Étape 3: Créer des ensembles de données
Nous pouvons maintenant utiliser les vues distantes pour créer des ensembles de données de remplissage automatique pouvant être envoyés à n'importe quelle application. Pour éviter que ce didacticiel ne prenne trop de temps, nous allons créer des ensembles de données uniquement pour le premier champ de saisie de courrier électronique rencontré. Le code suivant montre comment sélectionner uniquement le premier champ de saisie du courrier électronique:
AssistStructure.ViewNode emailField = emailFields.get (0);Un ensemble de données de remplissage automatique n'est rien mais une instance de la
Ensemble de données
classe, et peut être construit en utilisant leDataset.Builder
classe.Lorsque l'utilisateur sélectionne l'une des adresses électroniques que notre service affiche dans la liste déroulante, il doit définir le contenu du champ de saisie associé à l'aide de la touche
setValue ()
méthode duDataset.Builder
classe. Cependant, vous ne pouvez pas passer unViewNode
objecter à lasetValue ()
méthode. Il attend en fait un identifiant de remplissage automatique, qui doit être obtenu en appelant legetAutoFillId ()
méthode duViewNode
objet.De plus, pour spécifier le texte qui doit être écrit dans le champ de saisie, vous devez utiliser le
AutoFillValue.forText ()
méthode. Le code suivant vous montre comment:Jeu de données primaryEmailDataSet = new Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Jeu de données secondaryEmailDataSet = new Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secondaryEmail)) .build ();Avant d’envoyer les ensembles de données à une application, vous devez les ajouter à une application.
FillResponse
objet, qui peut être construit en utilisant leFillResponse.Builder
classe. Appeler sonaddDataset ()
méthode deux fois pour ajouter les deux ensembles de données.Une fois la
FillResponse
l'objet est prêt, passez-le comme argument à laonSuccès ()
méthode duFillCallback
objet, qui est l'un des paramètres de laonFillRequest ()
méthode.FillResponse response = new FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (réponse);Étape 4: Mettre à jour le manifeste
Comme tous les services, le service de remplissage automatique doit également être déclaré dans le projet. AndroidManifest.xml fichier. Ce faisant, vous devez vous assurer qu'il est protégé par le
android.permission.BIND_AUTO_FILL
autorisation.Ce service nécessite également un
balise qui lui permet de répondre à la
android.service.autofill.AutoFillService
action, et unbalise qui pointe vers le fichier XML de méta-données créé précédemment.
En conséquence, ajoutez les lignes suivantes à votre fichier manifeste:
Notre service de remplissage automatique et notre application sont maintenant prêts. Construisez le projet et installez l'application sur votre appareil.
4. Activer et utiliser le service de saisie automatique
Pour activer le service de remplissage automatique, ouvrez le répertoire de votre appareil. Réglages application et accédez à Applications et notifications> Avancé> Applications par défaut> Application de remplissage automatique. Dans l'écran suivant, sélectionnez votre application dans la liste des applications de remplissage automatique disponibles..
Vous pouvez maintenant ouvrir n'importe quelle application demandant une adresse électronique pour voir votre service de remplissage automatique en action. Par exemple, voici ce que vous verriez sur les écrans de connexion d’Instagram et de Pinterest:
Conclusion
Vous savez maintenant comment créer et utiliser un service de remplissage automatique personnalisé pour Android. N'hésitez pas à l'étendre pour prendre en charge d'autres champs communs, tels que le prénom ou le numéro de téléphone. Vous pouvez également essayer d'identifier les champs de saisie à l'aide d'autres attributs, tels que des étiquettes et des astuces..
Pour en savoir plus sur le cadre de remplissage automatique, reportez-vous à sa documentation officielle. Et en attendant, consultez quelques-uns de nos autres articles sur Android O et le développement d'applications Android.!