首页 > 解决方案 > 使用 FirebaseAuthListener 如果没有用户登录,它将导航到带有片段的活动

问题描述

我在这里要做的是,当我启动我MainActivity的 withFirebaseAuthListener并且没有用户登录时,它将导航到 MainFragment 并且MainFragment是连接到我的容器SignInFragment(这SignInFragment是扩展的 Fragment)。所以基本上,MainFragment被扩展到AppCompatActivity.

它实际上可以工作,但我的问题是MainFragemnt我的模拟器中是空白的,它应该显示LoginFragment.

这是我的代码:MainActivity

//Firebase
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;

private TextView mWelcome;
private Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mWelcome = findViewById(R.id.tvWelcome);

    setupFirebaseAuth();


}

/*
--------------------------------------Firebase-----------------------------------------
 */

private void getCurrentUser(FirebaseUser user){
    Log.d(TAG, "getCurrentUser: checking if user is logged in.");
    if (user == null){

        Intent intent = new Intent(this, MainFragment.class);
        startActivity(intent);
    }
}

private void setupFirebaseAuth(){
    Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");
    mAuth = FirebaseAuth.getInstance();
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            //Check if the user is logged in
            FirebaseUser user = firebaseAuth.getCurrentUser();
            getCurrentUser(user);

            if (user != null){
                //User is signed in
                Log.d(TAG, "onAuthStateChanged: signed _in: " + user.getUid());
            } else {
                //User is signed out
                Log.d(TAG, "onAuthStateChanged: signed_out");
            }
        }
    };
}

@Override
protected void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
protected void onStop() {
    super.onStop();
    if (mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

我的代码MainFragment

public class MainFragment extends AppCompatActivity {

@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    setContentView(R.layout.fragment_main);

    SignInFragment fragment = new SignInFragment();

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.container, fragment, null).commit();

我的代码SignInFragment

public class SignInFragment extends Fragment {

private static final String TAG = "SignInFragment";

private TextView mEmail, mPassword, mForRegister;
private EditText eEmail, ePassword;
private Button btnLogin;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.signin_fragment,container,false);

    //TextView
    mEmail = view.findViewById(R.id.tvEmail);
    mPassword = view.findViewById(R.id.tvPassword);
    mForRegister = view.findViewById(R.id.tvForRegister);
    //EditText
    eEmail = view.findViewById(R.id.etEmail);
    ePassword = view.findViewById(R.id.etPassword);
    //Button
    btnLogin = view.findViewById(R.id.btnLogin);

    //Navigating to RegisterFragment
    mForRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            FragmentTransaction fr = getFragmentManager().beginTransaction();
            fr.replace(R.id.container, new RegisterFragment());
            fr.commit();
        }
    });

    return view;
}

这是模拟器的图片:

这是模拟器的图片: 谢谢!

标签: javaandroidfirebasefirebase-realtime-database

解决方案


尝试更改您的 onCreate 方法。改用以下内容:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}

推荐阅读