Начиная фрагмент из onCompleteListener, используемого для FirebaseAuth? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь открыть фрагмент из другого фрагмента, но получаю ошибки.

Приложение открывается на главном экране с видом снизу.При нажатии на одну из вкладок открывается фрагмент с экраном входа для пользователей Firebase.После ввода данных и нажатия кнопки входа в систему он должен подтвердить пользователя и открыть еще один фрагмент.

Все отлично работает, пока вы не нажмете логин.

Ниже приведен рабочий пример, где оба фрагмента фактически являются действиями, и все работает нормально.

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener{

public Button btnLogIn;
private EditText inputEmail, inputPassword;
private FirebaseAuth mAuth;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mAuth = FirebaseAuth.getInstance();

    if (mAuth.getCurrentUser() != null) {
        startActivity(new Intent(LoginActivity.this, SecondPage.class));
        finish();
    }

    setContentView(R.layout.activity_login);

    btnLogIn = findViewById(R.id.btn_login);
    inputEmail = findViewById(R.id.email);
    inputPassword = findViewById(R.id.password);

    findViewById(R.id.btn_login).setOnClickListener(this);

    mAuth = FirebaseAuth.getInstance();
}

@Override
public void onClick(View view){
    final String email = inputEmail.getText().toString();
    final String password = inputPassword.getText().toString();

    if (TextUtils.isEmpty(email)) {
        Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
        return;
    }

    if (TextUtils.isEmpty(password)) {
        Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
        return;
    }

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>(){
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (!task.isSuccessful()) {
                        if (password.length() < 6) {
                            inputPassword.setError(getString(R.string.minimum_password));
                        } else {
                            Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
                        }
                    } else {
                        Intent intent = new Intent(LoginActivity.this, SecondPage.class);
                        startActivity(intent);
                        finish();
                    }
                }
            });
}

}

Теперь вот тот же код, за исключением того, что LoginActivity является фрагментом и должен открыть другойфрагмент.Это то, что дает мне ошибки.Я изменил то, что нужно для самого фрагмента.

package com.nikelspot.app;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;

public class LoginActivity extends Fragment implements View.OnClickListener {

    public LoginActivity() {
        //needed empty constructor
    }

    public Button btnLogIn;
    private EditText inputEmail, inputPassword;
    private FirebaseAuth mAuth;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {

        mAuth = FirebaseAuth.getInstance();

        if (mAuth.getCurrentUser() != null) {
            startActivity(new Intent(getActivity(), SecondPage.class));
        }

        View rootView = inflater.inflate(R.layout.frag_login,
                container, false);

        btnLogIn = rootView.findViewById(R.id.btn_login);
        inputEmail = rootView.findViewById(R.id.email);
        inputPassword = rootView.findViewById(R.id.password);
        mAuth = FirebaseAuth.getInstance();

        rootView.findViewById(R.id.btn_login).setOnClickListener(this);
        mAuth = FirebaseAuth.getInstance();
        return rootView;
    }

    @Override
    public void onClick(View view){
        final String email = inputEmail.getText().toString();
        final String password = inputPassword.getText().toString();

        if (TextUtils.isEmpty(email)) {
            Toast.makeText(getActivity(), "Enter email address!", Toast.LENGTH_SHORT).show();
            return;
        }

        if (TextUtils.isEmpty(password)) {
            Toast.makeText(getActivity(), "Enter password!", Toast.LENGTH_SHORT).show();
            return;
        }

        mAuth.signInWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>(){
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.

                        if (!task.isSuccessful()) {
                            // there was an error
                            if (password.length() < 6) {
                                inputPassword.setError(getString(R.string.minimum_password));
                            }
                            else {
                                Toast.makeText(getActivity(), getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
                            }
                        }

                        else {
                            Intent intent = new Intent(getActivity(), SecondPage.class);
                            startActivity(intent);
                            finish();
                        }
                    }
        });
    }

}

В Android Studio единственная неправильная вещь - это метод finish (), показанный ниже, выделяется красным.Сообщение об ошибке говорит, что это не может быть решено.

  else {
          Intent intent = new Intent(getActivity(), SecondPage.class);
          startActivity(intent);
          finish();
        }

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

Спасибо!

1 Ответ

0 голосов
/ 07 июня 2018

Вы хотите, чтобы родительское действие открыло фрагмент.

Этого можно добиться с помощью интерфейса и обратного вызова.

При неполном, вы инициируете обратный вызов операции с методом для запуска второго фрагмента.

Прочтите это для получения дополнительной информации: https://gist.github.com/butelo/8729891

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