0

I am doing an app with login fragment and when I log in or out it should update menu items (for guest only login item, for logged users : home,favorites, logout)

When I login in ,

nothing changes only after second try to login (like first click only logged in)

When I logout it disable (home,fav,logout) but doesn't show up login item.

Here code and photos

enter image description here

after log out :

enter image description here

Code :

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

lateinit var toogle : ActionBarDrawerToggle
lateinit var displayed_email: TextView

private lateinit var database: DatabaseReference
private lateinit var mAuth: FirebaseAuth




override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)



    val navigationView: NavigationView
    navigationView = findViewById(R.id.nav_view)
    navigationView.itemIconTintList=null
    navigationView.setNavigationItemSelectedListener(this)

    val headerView: View
    headerView = navigationView.getHeaderView(0)

    displayed_email = headerView.findViewById(R.id.nav_header_name)



    //Dokonczyc jutro
    //Dodac tez fragmenty z logowaniem i rejestracja
    //Kazdy ma miec swoje view modele


    toogle = ActionBarDrawerToggle(this, drawerLayout,findViewById(R.id.toolbar), R.string.open_menu, R.string.close_menu)
    drawerLayout.addDrawerListener(toogle)
    toogle.syncState()




    if(savedInstanceState==null){
        supportFragmentManager.beginTransaction().replace(R.id.fragment_container, LoginFragment()).commit()

    }

    updateUI()
}


override fun onNavigationItemSelected(item: MenuItem): Boolean {

    when(item.itemId){
        R.id.nav_login_item -> {
            Toast.makeText(applicationContext, "Login clicked",Toast.LENGTH_SHORT).show()
        }

        R.id.nav_logout_item->{
                mAuth.signOut()
                updateUI()
        }

        R.id.nav_home_item->{
            Toast.makeText(applicationContext, "Home clicked",Toast.LENGTH_SHORT).show()
        }
        R.id.nav_fav_item->{
            Toast.makeText(applicationContext, "Favorite clicked",Toast.LENGTH_SHORT).show()
        }
    }

    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}



fun updateUI(){
    println("Updating UI")
    mAuth = FirebaseAuth.getInstance()
    database = FirebaseDatabase.getInstance().reference


    val navigationView: NavigationView
    navigationView = findViewById(R.id.nav_view)
    val nav_menu  = navigationView.menu


    if(mAuth.currentUser!=null) {

        displayed_email.setText(mAuth.currentUser!!.email.toString())
        displayed_email.textSize = 18F



        nav_menu.findItem(R.id.nav_login_item).isVisible = false
        nav_menu.findItem(R.id.nav_home_item).isVisible = true
        nav_menu.findItem(R.id.nav_fav_item).isVisible = true
        nav_menu.findItem(R.id.nav_logout_item).isVisible = true
    }else{

            displayed_email.setText("Guest")
            displayed_email.textSize= 30F


            //Naprawic pokazywanie login ikony itemu jak sie wylogujesz etc
        //Problem jest w zmianie stanu visibility podczas aplikacji
        //Niewazne w ktora strone



        nav_menu.findItem(R.id.nav_login_item).isVisible = true
        nav_menu.findItem(R.id.nav_home_item).isVisible = false
        nav_menu.findItem(R.id.nav_fav_item).isVisible = false
        nav_menu.findItem(R.id.nav_logout_item).isVisible = false


    }

  }

 }
Zain
  • 37,492
  • 7
  • 60
  • 84
fariji1294
  • 41
  • 8
  • Please find the below url for the solution : https://stackoverflow.com/questions/45051301/how-to-dynamically-hide-a-menu-item-in-bottomnavigationview – Sunil Kumar Mar 04 '21 at 11:26

2 Answers2

0

I think you can't change visibility of items dynamically. Probably you can only addItem() and removeItem()

If I where you, I would try the solution with two separate menu xmls like here: Change NavigationView items when user is logged

Solution is clear and looks like it works for people based on the score of the answer.

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
GeekAbout
  • 71
  • 2
0

In order to make sure that mAuth.currentUser is null, you need to add a listener when the user has logged out so that you can update visibility of menu items; because you might call updateUI() before the user sign out, so mAuth.currentUser still has a value.

So in onNavigationItemSelected() callback: add this listener

R.id.nav_logout_item->{

    mAuth.signOut()
        
    AuthUI.getInstance()
            .signOut(this) // context
            .addOnCompleteListener {
            
                // User has been logged out 
                updateUI()
                
            }
}

And do the same for the login behavior to return the visibility back to the menu items.

Zain
  • 37,492
  • 7
  • 60
  • 84
  • Sorry if that wasn't clear .. please check https://stackoverflow.com/questions/46419344/cannot-resolve-symbol-authui .. also add `implementation 'com.firebaseui:firebase-ui-auth:x.x.x` – Zain Feb 06 '21 at 21:29
  • Thanks veryy much.I didnt knew whats AuthUI – fariji1294 Feb 06 '21 at 21:37
  • @fariji1294 [AuthUI](https://github.com/firebase/FirebaseUI-Android/blob/master/auth/src/main/java/com/firebase/ui/auth/AuthUI.java) is a Firebase final class that has utility methods that facilitates user authentication to Firebase through emails, Google, Facebook, SMS etc – Zain Feb 06 '21 at 23:24