Проверьте, являются ли EditTexts для электронной почты и пароля пустыми, используя сообщение Firebase Toast - PullRequest
0 голосов
/ 17 апреля 2019

Я проверяю, являются ли EditText etEmail и etPass пустыми, прежде чем пытаться войти, но я не знаю, вызывает ли это проблему с моим тостовым сообщением, использующим firebase task.getException().getMessage()

Это сообщение об ошибке: вызов метода 'getMessage' может привести к 'java.lang.NullPointerException'

Я пытался извлечь его из оператора else и перенести, это работает. У меня есть SignUp.class, который работает как положено с firebase.getException().getMessage() SignUp.class не проверяет, являются ли EditTexts пустыми, поэтому, возможно, это как-то связано с проблемой.

Я создал метод, который возвращает true или false в зависимости от того, пусты ли EditTexts (passStr такой же, как etPass.getText().toString(), но внутри оператора if 2-й всегда возвращает true или всегда false, поэтому я просто сделал это чтобы было проще, так как я не знал лучшего способа).

public Boolean checkEmpty(){
    status = false;
    passStr = etPass.getText().toString();
    emailStr = etEmail.getText().toString();

   if((etPass.getText().toString().isEmpty() && etEmail.toString().isEmpty()) ||
          (passStr.isEmpty()) || (emailStr.isEmpty()) ) {
            status = false;
    }
    else{
        status = true;
    }
    return status;
}

Внутри метода onCreate он использует

    if(checkEmpty().equals(true)) {


        firebaseAuth.signInWithEmailAndPassword(
        etEmail.getText().toString(),
        etPass.getText().toString())
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                //this starts activity if able to sign in
                if (task.isSuccessful()) {
                    Toast.makeText(Login.this, "Login Successful", 
                                Toast.LENGTH_LONG).show();
                    startActivity(new Intent(Login.this,
                                MainActivity.class));
                }
                else {
                    //if task unsuccessful it should show firebase toast messages
                    Toast.makeText(Login.this, task.getException().getMessage(),
                    Toast.LENGTH_LONG).show(); 
                      //this getMessage does not work due to error above
                }
            }

        });

Затем используется другой оператор else, когда EditTexts пусты.

                else {
                    progBar.setVisibility(View.INVISIBLE);
                    Toast.makeText(Login.this, "Please enter name and password",
                            Toast.LENGTH_LONG).show();
                }

Ответы [ 4 ]

0 голосов
/ 29 апреля 2019

Я улучшил свой код, и я очень благодарен за все ответы, которые помогут мне понять больше. Я полностью избавился от метода checkEmpty() и решил определить каждый editText в моем onClickListener.

passStr = etPass.getText().toString();
emailStr = etEmail.getText().toString();

, который затем используется в операторах if и else if

 if (**emailStr**.isEmpty()) 
 else if (**passStr**.isEmpty())

с сообщениями «пожалуйста, введите пароль» и «пожалуйста, введите адрес электронной почты».

Когда регистрация завершена (для проверки firebaseAuth.signInWithEmailAndPassword() используется .addOnCompleteListener(task)) она делает это:

                            if (task.isSuccessful()) {
                            Toast.makeText(LoginActivity.this, "Login Successful", Toast.LENGTH_LONG).show();
                            startActivity(new Intent(LoginActivity.this, Home.class));
                        } else {
                            Throwable taskException = task.getException();
                            if (taskException != null) {
                                Toast.makeText(LoginActivity.this, task.getException().getMessage(),
                                        Toast.LENGTH_LONG).show();
                            }
                        }

Итак, он проверяет, являются ли поля ввода пустыми, прежде чем показывать тостовые сообщения Firebase. Я понял, что слишком усложнил метод checkEmpty, так как все, что мне нужно было сделать, это определить каждую из них как строки внутри onClickListener. Мне не нужно было писать новый метод, поскольку я не использовал его где-либо еще.

0 голосов
/ 17 апреля 2019

Я думаю, что ошибка очень ясна. Вызов getMessage() может быть нулевым, поскольку task.getException() может возвращать ноль.

Перед вызовом getMessage():

убедитесь, что исключение задачи не равно нулю.
if (task.isSuccessful()) {
    ...
} else {
    Throwable taskException = task.getException();

    // Before invoking getMessage() on the exception,
    // we make sure the exception is not null
    if (taskException != null) {
        Toast.makeText(Login.this, taskException.getMessage(), Toast.LENGTH_LONG).show();
    }
}

Для вашей информации, вам, вероятно, следует также проверить, что сообщение об исключении не является нулевым, прежде чем создавать и показывать тост с ним.

0 голосов
/ 18 апреля 2019

Вы должны внести некоторые изменения в свои методы: -

это проверить, что текст редактирования пуст или нет: -

public Boolean checkEmpty(EditText edittext) {
        if (edittext.getText().toString().isEmpty()){
            return true;
        }else{
            return false;
        }
    }

, и это в вашем методе onCreate: -

if(checkEmpty(etEmail)) {
            Toast.makeText(StartActivity.this, "Email is empty", Toast.LENGTH_SHORT).show();
        }else if(checkEmpty(etPass)){
            Toast.makeText(StartActivity.this, "password is empty", Toast.LENGTH_SHORT).show();
        }else {
            firebaseAuth.signInWithEmailAndPassword(
                    etEmail.getText().toString(),
                    etPass.getText().toString())
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            //this starts activity if able to sign in
                            if (task.isSuccessful()) {
                                Toast.makeText(Login.this, "Login Successful",
                                        Toast.LENGTH_LONG).show();
                                startActivity(new Intent(Login.this,
                                        MainActivity.class));
                            } else {
                                //if task unsuccessful it should show firebase toast messages
                                Toast.makeText(Login.this, task.getException().getMessage(),
                                        Toast.LENGTH_LONG).show();
                                //this getMessage does not work due to error above
                            }
                        }

                    });
        }
0 голосов
/ 17 апреля 2019

Ваш код, кажется, правильный

Попробуйте использовать try/catch() предложение

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