我想输入一个URL,或者只是一个网站名称,例如Android中的www.google.com,EditText
然后在用户单击上Button
提交,或者在EditText
失去焦点时应验证URL,例如格式为“ www.anyURL.com “ ...
我怎样才能做到这一点?android有内置功能吗?
Answers:
在Patterns类中使用WEB_URL模式
Patterns.WEB_URL.matcher(potentialUrl).matches()
如果URL有效,则返回True;如果URL无效,则返回false。
从Android API级别8开始,具有WEB_URL模式。引用源,它“与RFC 3987的大部分匹配”。如果您定位较低的API级别,则可以简单地从源代码中复制模式并将其包含在您的应用程序中。我假设您知道如何使用模式和匹配器,因此在此不再赘述。
URLUtil类还提供了一些有用的方法,例如:
方法的描述不是很详尽,因此您最好查看源代码并找出最适合您目的的方法。
至于何时触发验证检查,有多种可能性:您可以使用EditText回调函数
或使用TextWatcher,我认为效果会更好。
请勿使用 URLUtil 验证URL,如下所示。
URLUtil.isValidUrl(url)
因为它会提供诸如“ http://”之类的字符串作为有效网址,这是不正确的
/**
* 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(String url) {
Pattern p = Patterns.WEB_URL;
Matcher m = p.matcher(url.toLowerCase());
return m.matches();
}
如果在UnitTest中,您得到了 NullPointerException
使用PatternsCompat
代替Patterns
。
fun isFullPath(potentialUrl: String): Boolean {
return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches()
}
另外,我意识到此方法true
在传递时会返回Photo.jpg
。我的期望是false
。因此,我建议采用以下方法代替上述方法。
fun isFullPath(potentialUrl: String): Boolean {
try {
URL(potentialUrl).toURI()
return true
} catch (e: Exception) {
e.printStackTrace()
}
return false
}
URLUtil.isValidUrl将起作用,因为它自api级别1开始就存在。
在您的网站验证中使用此正则表达式
String WebUrl = "^((ftp|http|https):\\/\\/)?(www.)?(?!.*(ftp|http|https|www.))[a-zA-Z0-9_-]+(\\.[a-zA-Z]+)+((\\/)[\\w#]+)*(\\/\\w+\\?[a-zA-Z0-9_]+=\\w+(&[a-zA-Z0-9_]+=\\w+)*)?$";
//TODO for website validation
private boolean isValidate()
{
String website = txtWebsite.getText().toString().trim();
if (website.trim().length() > 0) {
if (!website.matches(WebUrl)) {
//validation msg
return false;
}
}
return true;
}