Création d'un écran de connexion à l'aide de TextInputLayout

Ce que vous allez créer

introduction

Dans ce tutoriel, je parlerai de nouveau de Material Design. Google I / O 2015 était un événement important pour tous les développeurs Android et la conception faisait bien sûr partie des discussions..

Google a compris que la compatibilité en amont est la partie la plus délicate de la mise en œuvre de la conception matérielle. Bien sûr, les bibliothèques de support, telles que appcompat-v4 et appcompat-v7, font partie de la solution. toutefois, Theme.AppCompat n'implémente pas tous les éléments matériels utilisés dans les applications officielles de Google. Une des caractéristiques qui n’est pas présente dans le AppCompat Le thème est la possibilité de positionner une étiquette flottante sur un Éditer le texte widget. Vous pouvez voir ce que je veux dire dans l'exemple ci-dessous.

Au cours de Google I / O 2015, l’équipe Android a publié une toute nouvelle bibliothèque de support, le Bibliothèque de support de conception. C'est très pratique pour ce genre de problème. Ce tutoriel va vous montrer comment utiliser le nouveau TextInputLayout widget qui est inclus dans le Bibliothèque de support de conception.

1. Mise en œuvre TextInputLayout

Étape 1: Créer un nouveau projet

Dans Android Studio, choisissez Nouveau> Nouveau projet du Fichier menu. Entrez les informations requises pour configurer le projet et créer le projet. Dans mon exemple, j'ai ciblé le projet sur API 7, qui correspond au niveau minimal d'API pris en charge par la bibliothèque de support de conception. En ciblant un niveau d'API aussi bas, votre application s'exécutera sur presque tous les appareils Android. J'ai nommé l'activité principale LoginActivité et son fichier de mise en page activity_login.xml.

Après avoir configuré le projet, supprimez de l’activité principale le onCreateOptionsMenuet onOptionsItemSelected méthode générée automatiquement par Android Studio. L'écran de connexion que nous sommes sur le point de créer ne nécessite pas de menu, il est donc bon de supprimer ces méthodes. Pensez aussi à supprimer le fichier de menu XML qui réside dans le res / menu dossier.

Étape 2: Importer les bibliothèques de support

Pour utiliser le TextInputLayout widget, vous devez importer deux bibliothèques. Le premier est appcompat-v7, ce qui garantit que les styles de matériaux sont compatibles avec les versions antérieures. Le second est le Bibliothèque de support de conception.

Dans votre projet build.gradle fichier, ajoutez les lignes suivantes dans les dépendances du projet:

dependencies compile fileTree (dir: 'libs', include: ['* .jar']) compiler 'com.android.support:design:22.2.0' compiler 'com.android.support:appcompat-v7:22.2.0 '

Si Gradle ne vous demande pas automatiquement de synchroniser votre projet, choisissez Faire le module 'app' du Construire menu ou appuyez sur F9. Ce faisant, le système de compilation Android Studio récupérera automatiquement les ressources nécessaires et vous pourrez importer toutes les classes requises..

Étape 3: Conception de l'interface utilisateur

L'interface utilisateur de ce projet est très simple. Il affiche une étiquette de bienvenue (qui peut être facilement remplacée par un logo si vous en avez un) et deux Éditer le texte éléments, un pour le nom d'utilisateur et un pour le mot de passe. La mise en page comprend également un bouton qui déclenche la séquence de connexion. La couleur de fond est un joli gris plat.

Un autre détail important à retenir est le réglage correct de la type d'entrée attribut du Éditer le texte éléments. le type d'entrée du premier Éditer le texte l'élément doit être réglé sur textEmail tandis que celui du second devrait être réglé sur textPassword. Voici à quoi devrait ressembler la mise en page.

       

Vous voudrez peut-être également vous débarrasser de la barre d'applications, connue auparavant sous le nom de barre d'action, en modifiant le style.xml fichier comme indiqué ci-dessous.

Étape 4: Utilisation TextInputLayout

Nous sommes enfin arrivés à la partie la plus intéressante de ce tutoriel. UNE TextInputLayout widget se comporte exactement comme un LinearLayout fait, c'est juste un emballage. TextInputLayout accepte qu'un seul élément enfant, semblable à un ScrollView. L'élément enfant doit être un Éditer le texte élément.

  

Notez que j'ai spécifié un autre paramètre dans le Éditer le texte article, un allusion. Comme vous le savez déjà, cet attribut vous permet d’afficher un indice personnalisé s’il n’ya pas de contenu dans le Éditer le texte. Une fois que l'utilisateur commence à taper, l'indice disparaît. Ce n'est pas génial, car ils perdent le contexte des informations qu'ils saisissent.

Grâce à TextInputLayout, ce ne sera plus un problème. Tandis que le Éditer le texte seul masquera l’indice après la saisie du premier caractère, lorsqu'il est enveloppé dans un TextInputLayout l'indice va devenir une étiquette flottante au-dessus de la Éditer le texte. Une belle animation matérielle est également incluse.

Ensuite, faisons de même pour le champ mot de passe.

  

Si vous exécutez l'application maintenant, rien ne se passera. Bien sûr, le Éditer le texte L'attribut indice se comportera comme prévu. Cependant, il n'y a pas d'animation matérielle ni d'étiquettes flottantes. Pourquoi donc? Il nous manque encore du code pour que tout fonctionne.

Étape 5: Définition des astuces

Sous le setContentView méthode, initialiser les références à la TextInputLayout vues.

final TextInputLayout usernameWrapper = (TextInputLayout) findViewById (R.id.usernameWrapper); final TextInputLayout passwordWrapper = (TextInputLayout) findViewById (R.id.passwordWrapper);

Pour animer l’étiquette flottante, il vous suffit de définir un indice, en utilisant le setHint méthode.

usernameWrapper.setHint ("Nom d'utilisateur"); passwordWrapper.setHint ("Mot de passe");

Et tu as fini. Votre écran de connexion suit maintenant correctement les directives de conception du matériel. Lancez l'application pour voir votre magnifique écran de connexion.

2. Gestion des erreurs

Une autre fonctionnalité intéressante de TextInputLayout est la façon dont il peut gérer les erreurs. En validant la saisie, vous empêchez les utilisateurs de mal épeler leur adresse e-mail ou de saisir un mot de passe trop court..

Avec la validation des entrées, des informations d'identification incorrectes seraient traitées par le backend, des erreurs seraient générées et envoyées au client, puis affichées à l'utilisateur (en attente). Une perte de temps considérable et une expérience utilisateur médiocre. Vous devriez vérifier l'entrée de l'utilisateur avant de l'envoyer au backend.

Étape 1: Mise en œuvre du sur clic Méthode

Vous devez d'abord gérer le clic du bouton. Il existe de nombreuses façons de gérer les clics de bouton. L’un d’eux consiste à écrire une méthode personnalisée et à la spécifier dans votre fichier XML via le sur clic attribut. je préfère setOnClickListener, mais c'est vraiment juste une question de goût personnel.

btn.setOnClickListener (new View.OnClickListener () @Override public void onClick (Affichage v) // STUB);

Nous savons que si cette méthode est appelée, l'utilisateur n'a plus besoin du clavier. Malheureusement, Android ne cache pas automatiquement le clavier virtuel, sauf indication contraire de votre part. Appel hideKeyboard dans le sur clic corps de la méthode.

private void hideKeyboard () Vue de vue = getCurrentFocus (); if (view! = null) ((InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE)). hideSoftInputFromWindow (view.getWindowToken (), InputMethodManager.HIDE_NOT_ALWAYS); 

Étape 2: validation de la saisie

Avant de définir les étiquettes d'erreur, nous devons définir ce qui est une erreur et ce qui ne l'est pas. Nous supposons que le nom d'utilisateur doit être une adresse électronique et nous voulons empêcher les utilisateurs d'entrer une adresse électronique non valide..

Valider une adresse email est un peu complexe. Nous devons compter sur des expressions régulières. Vous pouvez aussi utiliser la bibliothèque Apache Commons si vous le souhaitez..

J'ai écrit l'expression régulière suivante à l'aide des instructions suggérées par Wikipedia sur la validité des e-mails..

/^[a-zA-Z0-9#_~!$&'()*++,;=:."(),:;<>@\[\\\\\++@[a-zA-Z0 -9 -] + (\. [A-zA-Z0-9 -] +) * /

Le sens de cette expression régulière est assez simple. Il est composé de trois groupes de capture. Le premier correspond aux lettres de l'alphabet (majuscules et minuscules), aux nombres et à une série de symboles acceptés. En raison de l + quantificateur, ce groupe correspond à une chaîne composée d'au moins un caractère.

Ensuite, il y a la @ symbole, ce qui est bien sûr requis dans chaque adresse e-mail. Le deuxième groupe accepte uniquement les lettres, les chiffres et les traits d'union. La longueur doit également être d'au moins un (]+).

Enfin, il y a le dernier groupe, qui contient un point et dont le but est de faire correspondre les sous-domaines et le TLD. Son quantificateur est une étoile, *, ce qui signifie que ce groupe recherche une chaîne dont la longueur peut être zéro ou plus. En fait, les adresses e-mail avec un domaine, mais pas de TLD, sont réellement valides.

Puisque nous voulons valider un Chaîne, nous devons compter sur Modèle et Matcher cours, inclus dans le java.util.regex paquet. Importez ces classes dans votre activité, puis implémentez la méthode suivante:

private static final Chaîne EMAIL_PATTERN = "^ [a-zA-Z0-9 # _ ~! $ & '() * +,; =:. \" (),:; <> @ \\ [\\] \\ \\] + @ [a-zA-Z0-9 -] + (\\. [a-zA-Z0-9 -] +) $ "; private Pattern pattern = Pattern.compile (EMAIL_PATTERN); matcher privé Matcher ; public boolean validateEmail (email string) matcher = pattern.matcher (email); return matcher.matches ();

La validation du champ mot de passe est beaucoup plus simple. La plupart des organisations implémentent différentes stratégies pour la validité des mots de passe, mais tout le monde impose une longueur minimale. Une règle raisonnable est que le mot de passe ne doit jamais être inférieur à six caractères.

public boolean validatePassword (Mot de passe de la chaîne) return password.length ()> 5; 

Étape 3: Récupération des données

Comme j'ai dit, TextInputLayout est juste une enveloppe, mais contrairement à LinearLayout et ScrollView, vous pouvez obtenir son élément enfant en utilisant une méthode spécifique, getEditText. Il n'y a pas besoin d'utiliser findViewById.

Si TextInputLayout ne contient pas de Éditer le textegetEditText résultats nul alors méfiez-vous d'un NullPointException.

vide publique onClick (Afficher v) hideKeyboard (); String username = usernameWrapper.getEditText (). GetText (). ToString (); String password = usernameWrapper.getEditText (). GetText (). ToString (); // TODO: Vérifications // TODO: Connexion

Étape 4: Affichage des erreurs

TextInputLayout la gestion des erreurs est facile et rapide. Les méthodes requises sont setErrorEnabled et setError.

setError définit un message d'erreur rouge qui sera affiché sous le Éditer le texte. Si le paramètre passé est nul, le message d'erreur est effacé. Cela change aussi la couleur de l'ensemble Éditer le texte widget à rouge.

setErrorEnabled active la fonctionnalité d'erreur. Cela affecte directement la taille de la mise en page, en augmentant le remplissage inférieur pour laisser de la place au libellé d'erreur. Activer cette fonctionnalité avant de définir un message d'erreur via setError signifie que cette disposition ne changera pas de taille lorsqu'une erreur est affichée. Vous devriez faire des tests en combinant ces deux méthodes afin de voir réellementde quoi je parle.

Un autre fait intéressant est que si la fonctionnalité d'erreur n'a pas encore été activée et que vous appelez setError passer un paramètre non nul, puis setErrorEnabled (true) sera appelé automatiquement.

Maintenant que nous avons défini ce qui est juste et ce qui ne va pas, et que nous savons comment récupérer des données et afficher les erreurs possibles, la mise en œuvre de la sur clic la méthode devient triviale.

vide publique onClick (Afficher v) hideKeyboard (); String username = usernameWrapper.getEditText (). GetText (). ToString (); String password = usernameWrapper.getEditText (). GetText (). ToString (); if (! validateEmail (nom d'utilisateur)) usernameWrapper.setError ("Adresse électronique non valide!");  else if (! validatePassword (password)) passwordWrapper.setError ("Ce n'est pas un mot de passe valide!");  else usernameWrapper.setErrorEnabled (false); passwordWrapper.setErrorEnabled (false); doLogin (); 

J'ai ajouté un doLogin méthode, mais elle est actuellement vide, car elle dépasse le cadre de ce tutoriel..

public void doLogin () Toast.makeText (getApplicationContext (), "OK! Je suis en train de me connecter.", Toast.LENGTH_SHORT) .show (); // TODO: procédure de connexion; pas dans le cadre de ce tutoriel. 

3. style

Vous voudrez peut-être faire une dernière chose, changer la couleur de la TextInputLayout widget. Par défaut, le AppCompact le thème le met au vert, mais assez souvent cette couleur est en conflit avec votre palette de couleurs.

Google a très bien écrit la Design Support Library. La couleur de chaque widget est tirée directement des couleurs du thème, spécifiées dans votre style.xml fichier. Ouvrez-le et ajoutez le colorAccent élément de votre thème actif pour changer la palette de couleurs du formulaire.


Conclusion

Dans ce tutoriel, nous avons vu comment implémenter le nouvel élément de présentation TextInputLayout, grâce à la bibliothèque de support à la conception récemment introduite. 

Le paradigme de conception mis en œuvre par ce widget permet aux utilisateurs de ne jamais perdre le contexte des informations qu'ils saisissent. Il a en fait été introduit par Google l'année dernière, avec Material Design..

À ce moment-là, il n'existait aucune bibliothèque de support offrant aux développeurs la possibilité de mettre ce widget en action dans leurs projets, jusqu'à Google I / O 2015. Désormais, si votre application attend une sorte de saisie de données, vous serez enfin véritablement conforme à la conception..