菜单项可见性不会部分改变
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.currentUser
是null
,您需要在用户注销时添加一个监听器,以便您可以更新菜单项的可见性;因为您可能会在用户退出之前调用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
解决方案很明确,根据答案的分数看起来它适用于人们。
【讨论】:
以上是关于菜单项可见性不会部分改变的主要内容,如果未能解决你的问题,请参考以下文章