菜单项可见性不会部分改变
Menu item visibility doesnt change partly
我正在做一个带有登录片段的应用程序,当我登录或注销时,它应该更新菜单项(对于访客专用登录项,对于登录用户:主页、收藏夹、注销)
当我登录时,
只有在第二次尝试登录后才会有任何变化(就像第一次点击只登录)
当我注销时它会禁用 (home,fav,logout) 但不会显示登录项。
这里是代码和照片
注销后:
代码:
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
}
}
}
我认为您不能动态更改项目的可见性。可能你只能 addItem() 和 removeItem()
如果我在你那里,我会尝试使用两个单独的菜单 xml 的解决方案,如下所示:
解决方案清晰明了,根据答案的分数看起来对人们有效。
为了确保 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()
}
}
并对登录行为执行相同的操作以 return 返回菜单项的可见性。
我正在做一个带有登录片段的应用程序,当我登录或注销时,它应该更新菜单项(对于访客专用登录项,对于登录用户:主页、收藏夹、注销)
当我登录时,
只有在第二次尝试登录后才会有任何变化(就像第一次点击只登录)
当我注销时它会禁用 (home,fav,logout) 但不会显示登录项。
这里是代码和照片
注销后:
代码:
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
}
}
}
我认为您不能动态更改项目的可见性。可能你只能 addItem() 和 removeItem()
如果我在你那里,我会尝试使用两个单独的菜单 xml 的解决方案,如下所示:
解决方案清晰明了,根据答案的分数看起来对人们有效。
为了确保 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()
}
}
并对登录行为执行相同的操作以 return 返回菜单项的可见性。