FragmentActivity, AppCompatActivity и фрагменты - PullRequest
0 голосов
/ 04 сентября 2018

Я добавил это, чтобы было проще и проще понять проблему.

1-й сценарий: я запускаю действие> открывает фрагмент LoginFragment> я нажимаю TextView, чтобы перейти к FragmentActivity. Так что здесь нет ошибки. Теперь во 2-м сценарии я вошел в систему пользователя> перешел к MainActivity, затем нажал кнопку выхода из системы> перешел к LogoutConfirmation (Помните, это еще одно действие, чтобы открыть LogoutConfirmation, LogoutConfirmation является фрагментом) затем я нажал кнопку «Выход», чтобы выйти из системы, и> снова перешел к LoginFragment Наконец, я нажал TextView, чтобы снова перейти к RegisterFragment, но на этот раз он выдает ошибку.

Это ошибка, которую я получил: java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x7f07002e (com.example.asus.perfectlogin: id / container) для фрагмента RegisterFragment {5285de6c # 2 id = 0x7f07002e} * ​​1016 *

Что я заметил здесь, почему система не может найти контейнер id: потому что время, когда я вошел в систему, затем нажал кнопку «Выход»>, перейдите к LogoutConfirmation (потому что я вызываю этот фрагмент на LogoutFragment extends AppCompatActivity, чтобы открыть это Я использую Intent и вызываю LogoutFragment) Так что теперь это еще одно Activity, которое содержит другой контейнер, потому что в моем коде LoginFragment для навигации по фрагменту я использовал id: container, но текущее действие - LogoutFragment который является идентификатором: container2. Я надеюсь, что вы понимаете все мои объяснения. Спасибо!

Вот мои коды: Main Activity extends FragmentActity

Это мой Launcher.

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

    btnLogout = findViewById(R.id.btnLogout);

    mAuth = FirebaseAuth.getInstance();
    //mAuth.signOut();

    logOut();
    setupFirebaseAuth();
}

public void logOut(){

    btnLogout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(MainActivity.this, LogoutFragment.class);
            startActivity(intent);


        }
    });
}

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

/*
check if the user is logged in
 */
private void checkCurrentUser(FirebaseUser user){
    Log.d(TAG, "checkCurrentUser: 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) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            //checking if the user is logged in or not
            checkCurrentUser(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
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
    checkCurrentUser(mAuth.getCurrentUser());
}

@Override
public void onStop() {
    super.onStop();

    if (mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

Коды для: MainFragment расширяет AppCompatActivity

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

    LoginFragment loginFragment = new LoginFragment();

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.container, loginFragment, loginFragment.getTag()).commit();
}

Коды для: fragment_main

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container">

</FrameLayout>

Коды для: LoginFragment расширяет Fragment

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

    mEmail = view.findViewById(R.id.tvEmail);
    mPassword = view.findViewById(R.id.tvPassword);
    mForRegister = view.findViewById(R.id.tvForRegister);
    mHeading = view.findViewById(R.id.heading);


    eEmail = view.findViewById(R.id.etEmail);
    ePassword = view.findViewById(R.id.etPassword);

    btnLogin = view.findViewById(R.id.btnLogin);

    // Progress Bar and Text view : GONE
    mPleaseWait = view.findViewById(R.id.pleaseWait);
    mProgressBar = view.findViewById(R.id.progressBar);
    mProgressBar.setVisibility(View.GONE);
    mPleaseWait.setVisibility(View.GONE);

    //Firebase
    mAuth = FirebaseAuth.getInstance();

    navigatetoRegister();
    setupFirebaseAuth();
    signInUser();

    return view;
}

public void navigatetoRegister(){

    mForRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FragmentTransaction fr = getFragmentManager().beginTransaction();
            fr.replace(R.id.container, new RegisterFragment());
            fr.commit();
        }
    });
}

private boolean isStringNull(String string){

    if (string.equals("")){
        return true;
    }

    return false;
}






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


private void signInUser(){
    // Button = to sign in the user.
    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String email = eEmail.getText().toString();
            String password = ePassword.getText().toString();

            if (isStringNull(email) && isStringNull(password)){

                Toast.makeText(getActivity(), "You must field out all the fields.", Toast.LENGTH_SHORT).show();
            }else {

                //Progress Bar and TextView be visible
                mProgressBar.setVisibility(View.VISIBLE);
                mPleaseWait.setVisibility(View.VISIBLE);

                //To sign in users
                mAuth.signInWithEmailAndPassword(email, password)
                        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {

                                if (task.isSuccessful()){
                                    Toast.makeText(getActivity(), "Sign in Successful!", Toast.LENGTH_SHORT).show();

                                    Intent intent = new Intent(getContext(), MainActivity.class);
                                    startActivity(intent);


                                }else {

                                    mProgressBar.setVisibility(View.GONE);
                                    mPleaseWait.setVisibility(View.GONE);
                                    Toast.makeText(getActivity(), "Could not sign in. Please try again.", Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
            }

        }
    });


}


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) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            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
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();

    if (mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

Коды для: RegisterFragment расширяет Fragment

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

    mEmail = view.findViewById(R.id.tvEmail);
    mPassword = view.findViewById(R.id.tvPassword);
    mForLogin = view.findViewById(R.id.tvForLogin);
    mHeading = view.findViewById(R.id.heading);

    eEmail = view.findViewById(R.id.etEmail);
    ePassword = view.findViewById(R.id.etPassword);

    btnRegister = view.findViewById(R.id.btnRegister);

    // Progress Bar and Text view : GONE
    mPleaseWait = view.findViewById(R.id.pleaseWait);
    mProgressBar = view.findViewById(R.id.progressBar);
    mProgressBar.setVisibility(View.GONE);
    mPleaseWait.setVisibility(View.GONE);

    navigateToLogin();
    registerNewUser();
    setupFirebaseAuth();

    return view;
}

public void navigateToLogin(){

    mForLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

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

        }
    });

}

private boolean isStringNull(String string){

    if (string.equals("")){
        return true;
    }

    return false;
}

/*
To check if the user is creating a same email.
 */
public void checkUserId(){

    if (mAuth.getCurrentUser() != null){
        userID = mAuth.getCurrentUser().getUid();
    }
}
/*
---------------------------------Firebase-----------------------------------
 */



public void registerNewUser(){
    // To register new user
    btnRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String email = eEmail.getText().toString();
            String password = ePassword.getText().toString();

            if (isStringNull(email) && isStringNull(password)){

                Toast.makeText(getContext(), "You must field out all the fields.", Toast.LENGTH_SHORT).show();
            }else {

                //Progress Bar and TextView be visible
                mProgressBar.setVisibility(View.VISIBLE);
                mPleaseWait.setVisibility(View.VISIBLE);

                //To create/register new user
                mAuth.createUserWithEmailAndPassword(email, password)
                        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {

                                if (task.isSuccessful()){
                                    //user is succesfully registered and logged in
                                    checkUserId(); //Checking if the user is create same email
                                    Log.d(TAG, "onComplete: AuthstateChange: " + userID);
                                    Toast.makeText(getActivity(), "Registered Successfully", Toast.LENGTH_SHORT).show();

                                    //AFter Registering account it will navigate to the Login Fragment
                                    FragmentTransaction fr = getFragmentManager().beginTransaction();
                                    fr.replace(R.id.container, new LoginFragment());
                                    fr.commit();


                                }else {
                                    mProgressBar.setVisibility(View.GONE);
                                    mPleaseWait.setVisibility(View.GONE);
                                    Toast.makeText(getActivity(), "Please check your internet. Or maybe you registered same email.", Toast.LENGTH_SHORT).show();
                                }
                            }
                        });


            }

        }
    });


}



//This is the listener to check the Firebase if there is user logged in or not.
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) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            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
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();

    if (mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

Коды для: LogoutFragment расширяет AppCompatActivity

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logout_fragment);

    LogOutConfirmation fragment = new LogOutConfirmation();

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.container2, fragment, null).commit();
}

Коды для: fragment_logout.xml

    <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container2">

</FrameLayout>

Коды для: LogoutConfirmation расширяет Fragment

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

    mLogout = view.findViewById(R.id.heading);
    mPleaseWait = view.findViewById(R.id.tvPleaseWait);

    mProgressBar = view.findViewById(R.id.progressBar);

    btnLogout = view.findViewById(R.id.btnLogout);

    mPleaseWait.setVisibility(View.GONE);
    mProgressBar.setVisibility(View.GONE);

    mAuth = FirebaseAuth.getInstance();

    signOut();
    setupFirebaseAuth();

    return view;
}

/*
        //This is the button to sign out. Then system will read next the `setupFirebaseAuth`. So if mAuthListener
        knows there is no user signed it so it will navigate to the LoginFragment
     */
public void signOut(){

    btnLogout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            mAuth.signOut();
            //Progress Bar and TextView
            mPleaseWait.setVisibility(View.VISIBLE);
            mProgressBar.setVisibility(View.VISIBLE);
            Log.d(TAG, "onClick: attempting to log out.");
        }
    });
}

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

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) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            //checking if the user is logged in or not

            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");

                //After logging out, it will navigate to LoginFragment

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

}

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

@Override
public void onStop() {
    super.onStop();

    if (mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...