@TweeM4N

Как вызвать private метод в Fragmente Android Studio?

Не получается вызвать private void userLogin() в case 2. Приложение при нажатии кнопки Login закрывается.

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.register:
                Intent reg = new Intent(getActivity(), Register.class);
                startActivity(reg);
                break;

            case R.id.signIn:
                userLogin();
                break;

            case R.id.forgotPassword:
                Intent fP = new Intent(getActivity(), ForgotPassword.class);
                startActivity(fP);
                break;
        }
    }


Весь код:
public class ProfileFragment extends Fragment implements View.OnClickListener {

    private TextView register, forgotPassword;
    private EditText editTextEmail, editTextPassword;
    private Button signIn;

    private FirebaseAuth mAuth;
    private ProgressBar progressBar;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mAuth = FirebaseAuth.getInstance();

        View v = inflater.inflate(R.layout.fragment_profile, container, false);

        TextView register = (TextView) v.findViewById(R.id.register);
        register.setOnClickListener(this);

        Button signIn = (Button) v.findViewById(R.id.signIn);
        signIn.setOnClickListener(this);

        EditText editTextEmail = (EditText) v.findViewById(R.id.email);
        EditText editTextPassword = (EditText) v.findViewById(R.id.password);

        ProgressBar progressBar = (ProgressBar) v.findViewById(R.id.progressBar);

        TextView forgotPassword = (TextView) v.findViewById(R.id.forgotPassword);
        forgotPassword.setOnClickListener(this);
        return v;
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.register:
                Intent reg = new Intent(getActivity(), Register.class);
                startActivity(reg);
                break;

            case R.id.signIn:
                userLogin();
                break;

            case R.id.forgotPassword:
                Intent fP = new Intent(getActivity(), ForgotPassword.class);
                startActivity(fP);
                break;
        }
    }

    private void userLogin() {
        String email = editTextEmail.getText().toString().trim();
        String password = editTextPassword.getText().toString().trim();

        if(email.isEmpty()){
            editTextEmail.setError("Email обязателен!");
            editTextEmail.requestFocus();
            return;
        }

        if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
            editTextEmail.setError("Пожалуйста, введите корректный email!");
            editTextEmail.requestFocus();
            return;
        }

        if(password.isEmpty()){
            editTextPassword.setError("Пароль обязателен!");
            editTextPassword.requestFocus();
            return;
        }

        if(password.length() < 6){
            editTextPassword.setError("Пароль должен состоять минимум из 6 символов!");
            editTextPassword.requestFocus();
            return;
        }

        progressBar.setVisibility(View.VISIBLE);
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
@WaterSmith
Android-разработчик. Java, Kotlin
В методе onCreateView, вместо
EditText editTextEmail = (EditText) v.findViewById(R.id.email);
        EditText editTextPassword = (EditText) v.findViewById(R.id.password);

Нужно
editTextEmail = (EditText) v.findViewById(R.id.email);
        editTextPassword = (EditText) v.findViewById(R.id.password);

Поясню:
У вас в пределах класса объявлены переменные private EditText editTextEmail, editTextPassword;
Затем, в методе onCreateView, вы при присвоении им значений, перед именем переменной пишете EditText Таким образом вы объявляете новые переменные, в пределах видимости метода, а переменные класса остаються неинициализированными, т.е. null.
Затем, после вызова, в методе userLogin у вас происходит обращение к переменной editTextEmail.getText() но, editTextEmail содержит null и такое обращение вызывает Null Point Exeption что для пользователя выглядит как просто закрытие приложения.
И не факт, что это единственная ошибка.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Jacen11
@Jacen11
Не получается вызвать private void userLogin() в case 2.


и что это значит? вот у вас же вызывается, вполне себе
case R.id.signIn:
                userLogin();
                break;


с точки зрения языка все ок. Ну а так дебажить и читать логи надо
Ответ написан
Комментировать
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Проблема не в том, что вы не вызываете метод, так как он тут явно вызывается:
case R.id.signIn:
                userLogin();
                break;

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

Попробуйте провести дебаг приложения и загляните в логи
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы