Отключайте кнопку до тех пор, пока все поля edittext не станут пустыми и логика c не будет выполнена - PullRequest
1 голос
/ 20 февраля 2020

У меня проблема с тем, что мне нужно отключить кнопку до тех пор, пока во всех полях edittext не будут пустые допустимые данные. Я также хотел бы отключить отправку button, если есть какое-либо пустое или пустое поле.

Часть моего лога c включает, например, что имя и второе имя пользователя должны иметь как минимум 3 символа, как показано.

Я могу проверить все поля edittext, используя TextWatcher afterTextChanged метод, но я не могу отключить кнопку, пока все данные не будут действительными.

Мой вопрос: как мне отключить мою кнопку, пока все логи c не будут проверены?

Ниже приведен мой код.

 @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) { 

email.addTextChangedListener(new EditTextWatcher(email));
            password.addTextChangedListener(new EditTextWatcher(password));
            name.addTextChangedListener(new EditTextWatcher(name));

 button.setOnClickListener((View v) -> {
                updateDatabase();
            }

            }

private class EditTextWatcher implements TextWatcher {

        private View view;

        private EditTextWatcher(View view) {
            this.view = view;
        }
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            switch (view.getId()) {
                case R.id.email:
                    validateEmail();
                    break;
                case R.id.password:
                    validatePassword();
                    break;

            }

        }
        }

        private boolean validateEmail() {
            String email = email.getText().toString().trim();

            if (email.isEmpty() || !isValidEmail(email)) {
                layoutEmail.setError(getString(R.string.err_msg_email));
                requestFocus(email);
                return false;
            } else {
                layoutEmail.setErrorEnabled(false);
            }
            return true;
        }

        private static boolean isValidEmail(String email) {
            return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
        }

     private boolean validatePassword() {
            String password = password.getText().toString().trim();
            if (StringUtils.isEmpty(password) || !isValidPassword(password)) {
                layoutPassword.setError(getString(R.string.err_msg_password));
                requestFocus(password);
                return false;
            } else {
                password.setErrorEnabled(false);
            }
            return true;
        }

            private void requestFocus(View view) {
            if (view.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            }
        }

            private boolean validatePassword() {
            String password = password .getText().toString().trim();
            if (StringUtils.isEmpty(password) || !isValidPassword(password)) {
                layoutPassword.setError(getString(R.string.err_msg_password));
                requestFocus(password);
                return false;
            } else {
                layoutPassword.setErrorEnabled(false);
            }
            return true;
        }

            private static boolean isValidPassword(String password){
            return !TextUtils.isEmpty(password) && PASSWORD_PATTERN.matcher(password).matches();
        }

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Я думаю, вы должны внедрить кнопку enable/disable в onTextChange().

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (!s.toString().isEmpty() && s.toString().length() > 0) {
          // enable the button here
        } else {
          // disable the button here
        }
      }

Поскольку каждый раз, когда вы вводите TextFiled или происходит любое изменение текста, кнопка будет включена или отключена.

0 голосов
/ 20 февраля 2020

Отключите вашу кнопку в xml и включите после завершения вашей логики c

вызовите этот метод ниже в afterTextChanged независимо от viewId

void validatationForButton(){
   if(validateEmail()&&validatePassWord()){
      //enable Button here
      btn.setEnabled(true);
}}````
...