Я добавил это, чтобы было проще и проще понять проблему.
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);
}
}