Как показать все ошибки сразу? - PullRequest
0 голосов
/ 27 марта 2020

Я хочу показать все ошибки сразу в моем проекте, но я не знаю, как это сделать. Пожалуйста помоги. Спасибо.

signUpBtn.setOnClickListener(new View.OnClickListener() {
                                         @Override
                                         public void onClick(View v) {
                                             if ((validateName() || validateLastName() || validateEmail() || validatePassword() || validateRepeatPassword()) != true) {
                                                 String email = uEmail.getText().toString().trim();
                                                 String password = uPassword.getText().toString().trim();
                                                 fAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                                                     @Override
                                                     public void onComplete(@NonNull Task<AuthResult> task) {
                                                         if (!task.isSuccessful()) {
                                                             Toast.makeText((getApplicationContext()), "Authentication failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                                             openLoginActivity();
                                                         } else {
                                                             Toast.makeText(SignUpActivity.this, "Welcome!", Toast.LENGTH_SHORT).show();
                                                             openPhoneActivity();
                                                         }

                                                     }
                                                 });
                                             }
                                         }
                                     }

        );

Вот пример проверки:

private boolean validateRepeatPassword() {
        String repeatPasswordInput = uRepeatPassword.getText().toString().trim();
        String passwordInput = uPassword.getText().toString().trim();

        if (repeatPasswordInput.isEmpty()) {
            uRepeatPasswordError.setError("Field can't be empty");
            return true;
        } else if (repeatPasswordInput.equals(passwordInput)) {
            uRepeatPasswordError.setError("Repeated password must be equalse to the first ");
            return true;
        } else {
            uRepeatPasswordError.setError(null);
            return false;
        }
    }

Пожалуйста, напишите ваши предложения для решения моей проблемы ниже.

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Вы коротко замыкаете условие (что, я думаю, вам следует сделать). Но если вы действительно хотите запустить все проверки, вы можете

signUpBtn.setOnClickListener(new View.OnClickListener() {
                                         @Override
                                         public void onClick(View v) {
                                             boolean isInvalidName = validateName();
                                             boolean isInvalidLastName = validateLastName();
                                             boolean isInvalidEmail = validateEmail();
                                             boolean isInvalidPassword = validatePassword();
                                             boolean isInvalidRepeatPassword = validateRepeatPassword()
                                             if (!(isInvalidName || isInvalidLastName || isInvalidEmail || isInvalidPassword || isInvalidRepeatPassword)) {
                                                 String email = uEmail.getText().toString().trim();
                                                 String password = uPassword.getText().toString().trim();
                                                 fAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                                                     @Override
                                                     public void onComplete(@NonNull Task<AuthResult> task) {
                                                         if (!task.isSuccessful()) {
                                                             Toast.makeText((getApplicationContext()), "Authentication failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                                             openLoginActivity();
                                                         } else {
                                                             Toast.makeText(SignUpActivity.this, "Welcome!", Toast.LENGTH_SHORT).show();
                                                             openPhoneActivity();
                                                         }

                                                     }
                                                 });
                                             }
                                         }
                                     }

        );

Таким образом, вы будете запускать все проверки.

Надеюсь, это поможет.

Альтернатива - вернуть все Строковые ошибки и их объединение.

private String validateRepeatPassword() {
        String repeatPasswordInput = uRepeatPassword.getText().toString().trim();
        String passwordInput = uPassword.getText().toString().trim();

        if (repeatPasswordInput.isEmpty()) {
            return "Field can't be empty";
        } else if (repeatPasswordInput.equals(passwordInput)) {
            return "Repeated password must be equals to the first ";
        }
        return null;
    }
0 голосов
/ 27 марта 2020
private boolean validateRepeatPassword() {
        String repeatPasswordInput = uRepeatPassword.getText().toString().trim();
        String passwordInput = uPassword.getText().toString().trim();

        if (repeatPasswordInput.isEmpty()) {
            uRepeatPasswordError.setError("Field can't be empty");
            return true;
        } else if (repeatPasswordInput.equals(passwordInput)) {
            uRepeatPasswordError.setError("Repeated password must be equalse to the first ");
            return true;
        } else {
            uRepeatPasswordError.setError(null);
            return false;
        }
    }

Давайте посмотрим на этот метод, поскольку именно здесь у вас есть проблемы.

Во-первых, ваш getText () немного странный.

String repeatPasswordInput = uRepeatPassword.getText().toString().trim();
String passwordInput = uPassword.getText().toString().trim();

getText ( ) скорее всего уже возвращает String. Для этого нет особых причин вызывать toString ().

String repeatPasswordInput = uRepeatPassword.getText().trim();
String passwordInput = uPassword.getText().trim();

должен делать.

Во-вторых, ваша бизнес-логика c отключена при второй проверке.

if (repeatPasswordInput.equals(passwordInput)) {
    uRepeatPasswordError.setError("Repeated password must be equalse to the first ");
    return true;
}

Ваш метод ошибок говорит, что входные данные должны быть идентичны, но вы даете эту ошибку только тогда, когда они фактически идентичны. Скорее всего, вы имели в виду это:

if (!repeatPasswordInput.equals(passwordInput)) {
    uRepeatPasswordError.setError("Repeated password must be equalse to the first ");
    return true;
}

Теперь, чтобы показать все ошибки. То, что вы делаете, немного так:

private boolean isValid() {
  if ( aIsInvalid()) {
    errorField.setText("A is invalid");
    return true;
  } else if ( bIsInvalid() ) {
    errorField.setText("B is invalid");
    return true;
  }
  return false;
}

Если я правильно понимаю ваш вопрос, то и a, и b могут быть недействительными, и если это так, вы хотите показать оба сообщения. Во-первых: удалите возвращенные истинные утверждения. В тот момент, когда вы нажмете одну из них, ваша проверка закончится. Итак, сделайте что-то вроде этого:

private boolean isValid() {
  boolean returnVal = false;
  if ( aIsInvalid()) {
    errorField.setText("A is invalid");
    returnVal = true;
  } else if ( bIsInvalid() ) {
    errorField.setText("B is invalid");
    returnVal = true;
  }
  return returnVal;
}

Теперь весь блок будет работать, потому что вы возвращаете значение только в последней строке. Это не будет работать так, как вы этого хотите (пока), так как ваш оператор else гарантирует, что если a неверно, вы не проверяете на b. Измените код на это:

private boolean isValid() {
  boolean returnVal = false;
  if ( aIsInvalid()) {
    errorField.setText("A is invalid");
    returnVal = true;
  } 
  if ( bIsInvalid() ) {
    errorField.setText("B is invalid");
    returnVal = true;
  }
  return returnVal;
}

Теперь он проверит их обоих. Тем не менее, это не очень хорошо, так как, если оба недействительны, ваше второе сообщение об ошибке перезапишет ваше первое.

Итак:

private boolean isValid() {
  boolean returnVal = false;
  String msg = "";
  if ( aIsInvalid()) {
    returnVal = true;
    msg = "A is invalid";
  }
  if ( bIsInvalid() ) {
    if ( returnVal ) a += "/n";
    msg += "B is invalid";
    returnVal = true;
  }
  if ( returnVal ) {
    errorField.setText(msg);
  }
  return returnVal;
}

Таким образом, если ваше поле достаточно большое, оно будет показать оба сообщения. Изменения должны быть не менее 6 символов;

0 голосов
/ 27 марта 2020

Используйте наблюдатели текста на EditTexts. Отключить кнопку в случае ошибки после ввода пользователя. editText.setError (msg) может быть создан там соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...