首页 > 解决方案 > 如果用户已登录或更改标题,如何删除 MenuItem?

问题描述

我的应用程序中有一个导航抽屉,我有一些项目,如果用户登录,我希望“注册”项目不可见,并且“登录”标题更改为“注销”。我搜索了执行此操作的方法但我不断收到错误。

它看起来像这样: 抽屉

我有一个类,我将导航代码存储在其中,我在其他活动中调用它,如下所示:

class NavigationHandler(val context: Context, val item: MenuItem) : AppCompatActivity() {
    operator fun invoke() {
        when (item.itemId) {
            R.id.nav_latestAds -> {
                val homeIntent = Intent(context, MainActivity::class.java)
                context.startActivity(homeIntent)
            }
            R.id.nav_cars -> {
                val carListIntent = Intent(context, CarsList::class.java)
                context.startActivity(carListIntent)
            }
            R.id.nav_properties -> {
                val carListIntent = Intent(context, PropertyList::class.java)
                context.startActivity(carListIntent)
            }
            R.id.nav_mobiles -> {
                val intent = Intent(context, MobileList::class.java)
                context.startActivity(intent)
            }
            R.id.nav_electDev -> {
                val homeIntent = Intent(context, ElectricsList::class.java)
                context.startActivity(homeIntent)
            }
            R.id.nav_furniture -> {
                val intent = Intent(context, FurnitureList::class.java)
                context.startActivity(intent)
            }
            R.id.nav_vendorReg -> {
                val intent = Intent(context, RegisterVendor::class.java)
                context.startActivity(intent)
            }
            R.id.nav_settings -> {
                val intent = Intent(context, Settings::class.java)
                context.startActivity(intent)
            }
            R.id.nav_logout -> {
                if (AuthService.isLoggedIn) {
                    UserDataService.logout()
                } else {
                    val loginIntent = Intent(context, Login::class.java)
                    context.startActivity(loginIntent)
                }
            }
        }
    }
}

这是我在其他活动中的称呼:

override fun onNavigationItemSelected(item: MenuItem): Boolean {
        NavigationHandler(this, item)()
        drawerLayout.closeDrawer(GravityCompat.START)
        return true
    }

我这样建造抽屉有错吗?

标签: androidkotlinmenuitemdrawer

解决方案


您将不得不保留references您想要的菜单项mutate(更改名称、使不可见等)。要实现这一点,请在您的activity

 // Declate two variables in your activity
 private lateinit var register: MenuItem
 private lateinit var logIn: MenuItem

// Now initialize them in your activity's onCreate as follows
var navigationView = findViewById(R.id.idOfNavigationView)
register = navigationView.menu.findItem(R.id.idOfRegister)
logIn = navigationView.menu.findItem(R.id.idOfLogin)

现在您有了您的menu项目,您可以更改它们的标题或使它们不可见。例如,如果您想隐藏注册菜单项并更改登录标题,您将执行以下操作

// Once user has logged in successfully, use following lines to change menu items as you wish
register.isVisible = true
logIn.title = "logout"

推荐阅读