Android:Как я могу проверить ввод EditText?
Мне нужно сделать проверку ввода формы на серии EditTexts. Я использую OnFocusChangeListeners для запуска проверки после ввода пользователем каждого из них, но это не ведет себя так, как требуется для последнего EditText.
Если я нажимаю на кнопку "Готово" при вводе в окончательный EditText, то InputMethod отключается, но технически фокус никогда не теряется на EditText (и поэтому проверка никогда не происходит).
Что лучше решение?
должен ли я контролировать, когда InputMethod освобождается от каждого EditText, а не при изменении фокуса? Если да, то как?
14 ответов:
почему бы вам не использовать
TextWatcher?так как у вас есть ряд
EditTextкоробки для проверки, я думаю, что вам подойдет следующее:
- ваша деятельность осуществляет
android.text.TextWatcherинтерфейс- вы добавляете textchanged слушателей к вам EditText boxes
txt1.addTextChangedListener(this); txt2.addTextChangedListener(this); txt3.addTextChangedListener(this);
- из переопределенных методов, вы можете использовать
afterTextChanged(Editable s)метод следующим образом@Override public void afterTextChanged(Editable s) { // validation code goes here }The
Editable sне помогает найти какой текст EditText box изменяется. Но вы можете напрямую проверить содержимое полей EditText, таких какString txt1String = txt1.getText().toString(); // Validate txt1Stringв том же методе. Я надеюсь, что я ясно, и если я, это помогает! :)
EDIT: для более чистого подхода см. ответ Кристофера Перри ниже.
TextWatcher немного многословен на мой вкус, поэтому я сделал что-то немного легче проглотить:
public abstract class TextValidator implements TextWatcher { private final TextView textView; public TextValidator(TextView textView) { this.textView = textView; } public abstract void validate(TextView textView, String text); @Override final public void afterTextChanged(Editable s) { String text = textView.getText().toString(); validate(textView, text); } @Override final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ } @Override final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ } }просто используйте его так:
editText.addTextChangedListener(new TextValidator(editText) { @Override public void validate(TextView textView, String text) { /* Validation code here */ } });
для того, чтобы уменьшить многословие логики проверки я создал библиотека для Android. Он заботится о большинстве ежедневных проверок с помощью аннотаций и встроенных правил. Существуют такие ограничения, как
@TextRule,@NumberRule,@Required,@Regex,@IpAddress,@Passwordи т. д.,вы можете добавить эти аннотации к ссылкам виджета пользовательского интерфейса и выполнить проверки. Он также позволяет выполнять проверки асинхронно, что идеально подходит для такие ситуации, как проверка уникального имени пользователя с удаленного сервера.
есть пример на Домашняя страница проекта о том, как использовать аннотации. Вы также можете прочитать связанный пост в блоге где я написал примеры кодов о том, как писать пользовательские правила для проверки.
вот простой пример, который показывает использование библиотеки.
@Required(order = 1) @Email(order = 2) private EditText emailEditText; @Password(order = 3) @TextRule(order = 4, minLength = 6, message = "Enter at least 6 characters.") private EditText passwordEditText; @ConfirmPassword(order = 5) private EditText confirmPasswordEditText; @Checked(order = 6, message = "You must agree to the terms.") private CheckBox iAgreeCheckBox;библиотека расширяется, вы можете написать свои собственные правила, расширяя элемент
Ruleкласса.
Это было хорошее решение от здесь
InputFilter filter= new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { for (int i = start; i < end; i++) { String checkMe = String.valueOf(source.charAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter});
обновленный подход-TextInputLayout:
Google недавно запустил библиотеку поддержки дизайна, и есть один компонент под названием TextInputLayout и он поддерживает отображение ошибки через
setErrorEnabled(boolean)иsetError(CharSequence).как его использовать?
Шаг 1: оберните свой EditText с TextInputLayout:
<android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/layoutUserName"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="hint" android:id="@+id/editText1" /> </android.support.design.widget.TextInputLayout>Шаг 2: Проверка ввода
// validating input on a button click public void btnValidateInputClick(View view) { final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName); String strUsername = layoutLastName.getEditText().getText().toString(); if(!TextUtils.isEmpty(strLastName)) { Snackbar.make(view, strUsername, Snackbar.LENGTH_SHORT).show(); layoutUserName.setErrorEnabled(false); } else { layoutUserName.setError("Input required"); layoutUserName.setErrorEnabled(true); } }Я создал пример над моим репозиторий Github, проверьте пример, если вы хотите!
Я нахожу InputFilter более подходящим для проверки текстовых вводов на android.
вот простой пример: как использовать InputFilter для ограничения символов в EditText в Android?
вы можете добавить тост для обратной связи с пользователем о ваших ограничениях. Также проверьте тег android: inputType.
Я написал класс, который расширяет EditText, который поддерживает изначально некоторые методы проверки и на самом деле очень гибкий.
ток, как я пишу,изначально поддерживается через атрибуты XML методы проверки являются:
- Альфа
- Альфа-числовые
- цифровой
- общее регулярное выражение
- строка пустоту
вы можете проверить это здесь
Надеюсь, вам понравится :)
Мне нужно было выполнить проверку внутри поля, а не между полями, чтобы проверить, что мои значения были беззнаковыми значениями с плавающей запятой в одном случае и подписанными значениями с плавающей запятой в другом. Вот что, кажется, работает для меня:
<EditText android:id="@+id/x" android:background="@android:drawable/editbox_background" android:gravity="right" android:inputType="numberSigned|numberDecimal" />обратите внимание, что внутри "numberSigned|numberDecimal"не должно быть пробелов. Например:" numberSigned | numberDecimal " не будет работать. Я не знаю почему.
это выглядит действительно многообещающим и только то, что доктор заказал для меня:
public void onClickNext(View v) { FormEditText[] allFields = { etFirstname, etLastname, etAddress, etZipcode, etCity }; boolean allValid = true; for (FormEditText field: allFields) { allValid = field.testValidity() && allValid; } if (allValid) { // YAY } else { // EditText are going to appear with an exclamation mark and an explicative message. } }пользовательские валидаторы плюс эти встроенные:
- и: для пользовательского регулярного выражения
- цифровой: только для числового поля
- Альфа: только для Альфа-поля
- буквенно -: Угадай что?
- personName: проверяет, является ли введенный текст именем или фамилией человека.
- personFullName: проверяет, является ли введенное значение является полным ФИО.
- email: проверяет, что поле является допустимым электронной почтой
- кредитная карта: проверяет, что поле содержит действительную кредитную карту, используя Алгоритм Luhn
- телефон: проверяет, что поле содержит допустимый номер телефона
- имя_домена: проверяет, что поле содержит допустимое доменное имя (всегда проходит тест на уровне API
- ipAddress: проверяет, что поле содержит допустимый ip-адрес
- webUrl: проверяет, что поле содержит допустимый url (всегда проходит тест на уровне API
- дата: проверяет, что поле является допустимым формат даты / времени (если установлен customFormat, проверяет с помощью customFormat)
- nocheck: он не проверяет ничего, кроме пустоты поля.
в Main.xml-файл
вы можете поместить следующий attrubute для проверки только алфавитный символ может принимать в edittext.
этого :
android:entries="abcdefghijklmnopqrstuvwxyz"
вы можете получить желаемое поведение, слушая, когда пользователь нажимает кнопку "Готово" на клавиатуре, а также проверить другие советы о работе с EditText в моем посте "проверка формы Android-правильный путь"
пример кода:
mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { validateAndSubmit(); return true; } return false; }});
для проверки электронной почты и пароля попробуйте
if (isValidEmail(et_regemail.getText().toString())&&etpass1.getText().toString().length()>7){ if (validatePassword(etpass1.getText().toString())) { Toast.makeText(getApplicationContext(),"Go Ahead"..... } else{ Toast.makeText(getApplicationContext(),"InvalidPassword"..... } }else{ Toast.makeText(getApplicationContext(),"Invalid Email"..... } public boolean validatePassword(final String password){ Pattern pattern; Matcher matcher; final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.* [@#$%^&+=!])(?=\S+$).{4,}$"; pattern = Pattern.compile(PASSWORD_PATTERN); matcher = pattern.matcher(password); return matcher.matches(); } public final static boolean isValidEmail(CharSequence target) { if (target == null) return false; return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); }
Я создал эту библиотеку для android, где вы можете проверить материал Дизайн EditText внутри и EditTextLayout легко, как это:
compile 'com.github.TeleClinic:SmartEditText:0.1.0'тогда вы можете использовать его следующим образом:
<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText android:id="@+id/passwordSmartEditText" android:layout_width="match_parent" android:layout_height="wrap_content" app:setLabel="Password" app:setMandatoryErrorMsg="Mandatory field" app:setPasswordField="true" app:setRegexErrorMsg="Weak password" app:setRegexType="MEDIUM_PASSWORD_VALIDATION" /> <com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText android:id="@+id/ageSmartEditText" android:layout_width="match_parent" android:layout_height="wrap_content" app:setLabel="Age" app:setMandatoryErrorMsg="Mandatory field" app:setRegexErrorMsg="Is that really your age :D?" app:setRegexString=".*\d.*" />тогда вы можете проверить, если это действительно так:
ageSmartEditText.check()для получения дополнительных примеров и настройки проверьте репозиторий https://github.com/TeleClinic/SmartEditText

Comments