我有一个菜单项显示在我的操作栏中,我希望它显示“登录”或“注销”,具体取决于用户是登录还是注销。但是,我无法更改文本,因为为了这样做,我必须从invalidateOptionsMenu()
方法中调用onOptionsSelected()
。我目前有一个更新应该显示的文本的方法,这工作正常,但为了显示该文本,我必须重新创建选项菜单。
以下是我的一些代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
this.menu = menu;
updateMenuTitles();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.login:
if (!loggedIn) {
Authentication();
} else {
loggedIn = false;
authentication = false;
updateMenuTitles();
Toast.makeText(getApplicationContext(),"Log Out Successful",Toast.LENGTH_SHORT).show();
}
break;
}
return super.onOptionsItemSelected(item);
}
private void updateMenuTitles() {
MenuItem bedMenuItem = menu.findItem(R.id.login);
if (loggedIn) {
bedMenuItem.setTitle("Log Out");
}else {
bedMenuItem.setTitle("Login");
}
}
答案 0 :(得分:0)
当我使用 firebase 时,我正在检查用户是否为空。基于此,我正在添加我需要的菜单选项。 像这样:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
if (firebaseUser!=null){
inflater.inflate(R.menu.landing_logout,menu);
}else {
inflater.inflate(R.menu.landing_login, menu);
}
return true;
}
答案 1 :(得分:-1)
我建议在菜单中设置两个不同的按钮,并根据需要切换其可见性。 像这样:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.login:
loggedIn = true;
Authentication();
updateMenuTitles();
break;
case R.id.logout:
loggedIn = false;
authentication = false;
updateMenuTitles();
Toast.makeText(getApplicationContext(),"Log Out Successful",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
private void updateMenuTitles() {
MenuItem loginMenuItem = menu.findItem(R.id.login);
MenuItem logoutMenuItem = menu.findItem(R.id.logout);
if (loggedIn) {
loginMenuItem.setVisibility(View.VISIBLE);
logoutMenuItem.setVisibility(View.GONE);
}else {
logoutMenuItem.setVisibility(View.VISIBLE);
loginMenuItem.setVisibility(View.GONE);
}
}