2012-01-27 70 views
35

所以,这就是我想知道的。我如何在Android中以编程方式设置菜单的可见性?这是我有我的菜单:以编程方式设置菜单中的可见性android

public boolean onCreateOptionsMenu(Menu menu){ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 

public boolean onOptionsItemSelected (MenuItem item){ 
    switch (item.getItemId()){ 
     case R.id.menuregistrar: 
      break; 
     case R.id.menusalir: 
      break; 
    } 
    return true; 
} 

但这代码不上的onCreate,所以我不知道如何设置一个项目有形或无形的编程方式(在我的情况,我希望“menuregistrar” 。是无形的,一旦我已经注册了我的申请,并永远

回答

106

把这个方法在你Activity

public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    MenuItem register = menu.findItem(R.id.menuregistrar);  
    if(userRegistered) 
    {   
     register.setVisible(false); 
    } 
    else 
    { 
     register.setVisible(true); 
    } 
    return true; 
} 

在较短的版本,你可以写:

MenuItem register = menu.findItem(R.id.menuregistrar);  
register.setVisible(!userRegistered); //userRegistered is boolean, pointing if the user has registered or not. 
return true; 
+0

+1为漂亮的答案... – Lucifer 2012-01-27 07:54:55

+2

两个小技巧:1.you可以通过写'注册拧紧了。 setVisible(userNotRegistered);'2.布尔变量通常是正的,即'if(!userRegistered)'。 'if(!UsersNotRegistered)'很难理解:如果用户没有注册? – 2013-06-26 12:27:12

+1

@ W.K.S同意。感谢您的评论。 – 2013-06-26 12:35:03

2

使用public boolean onPrepareOptionsMenu (Menu menu)每次按菜单按钮时都会调用它,并在那里做你的东西。或者在不同的活动中使用你的oncreateoptionsmenu()来膨胀不同的菜单 - 这个只被调用一次。

干杯

+1

onPrepareOptionsMenu在任何时候也称为invalidateOptionsMenu,所以它可能会被多次调用。 – javahead76 2013-04-12 19:19:29

+0

@ javahead76这个调用只有在'Build.VERSION.SDK_INT> = 11'时才会起作用 – 2013-04-12 19:45:44

6

我甚至会进一步简化阿迪尔的解决方案具有如下:

public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    MenuItem registrar = menu.findItem(R.id.menuregistrar);  
    registrar.setVisible(!isRegistered); 
    return true; 
} 
+1

它很好,但有些新用户不会得到它,因为他们急着想尽快解决问题,所以我花了它显示了那里实际发生的事情。 :) – 2012-12-13 06:10:18

+1

@AdilSoomro,这个代码比你的回答更简单(如果“他们很急”,更方便),所以我建议编辑原始答案。 – Stan 2013-02-28 10:25:16

相关问题