如何参数化Android上的菜单选项?

我想显示/隐藏Android应用程序的菜单的一些选项,取决于一些string,我将在strings.xml文件上设置为true / false。

作为一个例子,我将在strings.xml文件中包含这些string:

 <string name="option1">false</string> <string name="option2">true</string> <string name="option3">true</string> 

所以在这种情况下,只能显示option2option3

另一方面,我的意思是,在代码中,我尝试了以下内容:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); getMenuInflater().inflate(R.menu.main, menu); if((getResources().getString(R.string.option1)).equals("false")){ menu.getItem(R.id.option1).setVisible(false); } return true; } 

但是option1仍然显示在菜单上。

我该怎么做参数化这些选项? 我可以删除这些选项,但如果我的客户希望这些选项再次激活,我希望在未来可以轻松地将错误值更改为true。

编辑:这是我的菜单:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/option1" android:title="Option 1" /> <item android:id="@+id/option2" android:title="Option 2" /> <item android:id="@+id/option3" android:title="Option 3" /> .... </group> </menu> 

最后更新

我注意到,我得到NullPointerException因为菜单的名称是错误的。 我修好了,现在不给我任何错误。

但我的问题是因为我有两个不同的布局,其中包含两个不同的菜单(每个布局中的一个),并根据login时出现的一个string给每个布局充气。

例如,考虑到膨胀第一个布局的string是“你好”,我在MainActivity onCreate函数上显示如下布局:

 if("hello".equals(stringForLayout)){ setContentView(R.layout.activity_main); }else{ setContentView(R.layout.activity_main_secondary); } 

我怎么能参数化这两个菜单的选项,所以如果第一个显示,我想隐藏一个选项,我可以参考该菜单的选项?

提前致谢!

Solutions Collecting From Web of "如何参数化Android上的菜单选项?"

如果你使用string(例如s1和s2),你必须像这样比较它们:

if(s1.equals(s2)){…}

顺便说一下:你也可以看看Android文档中的共享首选项来获得更清晰的解决scheme。 在那里你可以为不同的菜单选项定义布尔variables。

最后,我发现我的问题在哪里。

问题来了,因为我没有注意到onCreateOptionsMenuonPrepareOptionsMenu没有使用,所以我删除了它们。

此外,当我在NavigationView使用我的菜单时,我不得不在使用MainActivity类的onCreate函数上的NavigationView之后使用下面的语句:

 navigationView.getMenu().findItem(R.id.option1).setVisible(false); 

在那里,我没有任何问题,成功地隐藏我的菜单项。

如果要隐藏特定活动的特定菜单项,请尝试此操作。

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem mSearch = menu.findItem(R.id.mSearch); mSearch.setVisible(false); invalidateOptionsMenu(); }