菜单项可见性不会部分改变

Posted

技术标签:

【中文标题】菜单项可见性不会部分改变【英文标题】:Menu item visibility doesnt change partly 【发布时间】:2021-05-10 20:51:55 【问题描述】:

我正在做一个带有登录片段的应用程序,当我登录或注销时,它应该更新菜单项(仅限访客登录项,登录用户:主页、收藏夹、注销)

当我登录时,

只有在第二次尝试登录后才会改变(比如第一次点击只登录)

当我注销时,它会禁用(主页、收藏、注销)但不显示登录项。

这里是代码和照片

退出后:

代码:

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


    

  

 

【问题讨论】:

请在下面的网址找到解决方案:***.com/questions/45051301/… 【参考方案1】:

为了确保mAuth.currentUsernull,您需要在用户注销时添加一个监听器,以便您可以更新菜单项的可见性;因为您可能会在用户退出之前调用updateUI(),所以mAuth.currentUser 仍然有一个值。

所以在onNavigationItemSelected()回调中:添加这个监听器

R.id.nav_logout_item->

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

并且对登录行为执行相同的操作以返回菜单项的可见性。

【讨论】:

对不起,如果不清楚..请检查***.com/questions/46419344/… ..另外添加implementation 'com.firebaseui:firebase-ui-auth:x.x.x 非常感谢。我不知道什么是AuthUI @fariji1294 AuthUI 是一个 Firebase 最终类,它具有促进用户通过电子邮件、Google、Facebook、SMS 等对 Firebase 进行身份验证的实用方法【参考方案2】:

我认为您无法动态更改项目的可见性。可能你只能 addItem() 和 removeItem()

如果我在哪里,我会尝试使用两个单独的菜单 xml 的解决方案,如下所示: Change NavigationView items when user is logged

解决方案很明确,根据答案的分数看起来它适用于人们。

【讨论】:

以上是关于菜单项可见性不会部分改变的主要内容,如果未能解决你的问题,请参考以下文章

Android:通过更改片段更改菜单项的可见性

更改 Blazor 菜单中导航项的可见性

php 插件+此功能控制基于标签的菜单项可见性

如何为 ListView 的 ContextActions 的 MenuItem 添加可见性绑定

选择特定的下拉菜单项后,下拉按钮的值不会改变

MFC - 选中/取消选中菜单项