Comment valider un nom d’URL / site Web dans EditText dans Android?

Je veux saisir des données, une URL ou simplement un nom de site Web tel que www.google.com depuis EditText dans Android et sur userclick sur le bouton à envoyer ou lorsque EditText perd le focus, l’URL doit être validée, comme dans format “www.anyURL.com” …

Comment puis-je faire ceci? existe-t-il des fonctionnalités intégrées disponibles sur Android?

Réponse courte

Utiliser le modèle WEB_URL dans la classe Patterns

Patterns.WEB_URL.matcher(potentialUrl).matches() 

Il retournera True si l’URL est valide et false si l’URL n’est pas valide .

Longue réponse

À partir du niveau 8 de l’API Android, il existe un modèle WEB_URL . Citant la source, il “correspond à la plus grande partie de la RFC 3987”. Si vous ciblez un niveau d’API inférieur, vous pouvez simplement copier le modèle à partir de la source et l’inclure dans votre application. Je suppose que vous savez utiliser des patterns et des matchers, alors je ne vais pas entrer dans plus de détails ici.

La classe URLUtil fournit également des méthodes utiles, par exemple:

  • isHttpUrl ()
  • isValidUrl ()

Les descriptions des méthodes ne sont pas très élaborées. Par conséquent, vous êtes probablement le mieux placé pour examiner la source et déterminer laquelle correspond le mieux à votre objective.

Quant au déclenchement de la validation, il existe plusieurs possibilités: vous pouvez utiliser les fonctions de rappel EditText

  • onFocusChanged () , ou
  • onTextChanged ()

ou utiliser un TextWatcher , ce que je pense serait mieux.

N’UTILISEZ PAS URLUtil pour valider l’URL ci-dessous.

  URLUtil.isValidUrl(url) 

car il donne des chaînes comme “http: //” comme URL valide qui n’est pas vraie

 /** * This is used to check the given URL is valid or not. * @param url * @return true if url is valid, false otherwise. */ private boolean isValidUrl(Ssortingng url) { Pattern p = Patterns.WEB_URL; Matcher m = p.matcher(url.toLowerCase()); return m.matches(); } 

URLUtil.isValidUrl fonctionnera car elle existe depuis le niveau api 1.

Ou vous pouvez simplement utiliser le bon vieux Regex

 Pattern urlRegex = Pattern.comstack("((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?‌​(?:[\w]*))?)"); 

Je ne dis pas que Patterns.WEB_URL est mauvais, il permet simplement de tester ce qui est mis en correspondance et ce qui ne l’est pas.