У меня есть TextWatcher, который проверяет правильность URL-адреса. URL-адрес действителен, если он соответствует формату URL-адреса, где «http», «https», «www» и т. д. являются необязательными. Это также допустимо, если это пустая строка. EditText отобразит сообщение об ошибке, если URL-адрес недействителен. Это моя текущая реализация:
private TextWatcher websiteLinkWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(websiteLayout.getError() != null) websiteLayout.setErrorEnabled(false);
}
@Override
public void afterTextChanged(Editable s) {
String websiteFormat = "^(|https?:\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?){0,140}$";
if(s.toString().trim().length() > 140 || !s.toString().matches(websiteFormat)) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
websiteLayout.setErrorEnabled(true);
websiteLayout.setError("The provided website is not valid.");
}
}, 2000);
saveEnabled.setBackgroundColor(getResources().getColor(R.color.grey200));
saveEnabled.setClickable(false);
// disable
}
else {
saveEnabled.setBackgroundColor(getResources().getColor(R.color.blue500));
saveEnabled.setClickable(true);
// enable
}
return;
}
};
Регулярное выражение очень противоречиво. Его единственное преимущество в том, что он работает с пустой строкой (т.е. сообщение об ошибке не отображается). В настоящее время принимаются http://example.com
, https://example.com
, пустая строка. https://www.example.com
иногда принимается или отклоняется. www.example.com
и example.com
отклоняются.