如何在安卓系统中给菜单选项加参数?

8

我希望能根据在strings.xml文件中设置为true/false的一些字符串,在Android应用程序中显示/隐藏菜单选项。

举个例子,我将在strings.xml文件中有以下字符串:

<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

我该如何将这些选项参数化?我可以直接删除这些选项,但是如果我的客户未来想要重新启用这些选项,我希望可以轻松地将false值更改为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。 我已经修复了它,现在不再出现任何错误。

但我的问题是,我有两个包含两个不同菜单的不同布局(每个布局中都有一个菜单),并且我根据登录时传入的一个字符串填充每个布局。

例如,假设填充第一个布局的字符串为“hello”,则我将在MainActivityonCreate函数中按以下方式显示布局:

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

我怎样才能对两个菜单的选项进行参数化,这样如果第一个菜单正在显示而我想要隐藏一个选项,我就可以引用该菜单的该选项?

提前感谢!


1
正如@user3728999所说,您最好选择标准的SharedPreferences解决方案。然后相应地设置菜单项的可见性。 - Phantômaxx
3个回答

4

如果你使用字符串(例如 s1 和 s2),则必须像这样进行比较:

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

顺便说一下:你还可以参考 Android 文档中的“共享首选项”来获得更清晰的解决方案。在那里,你可以为不同菜单选项定义布尔变量。


天啊!我简直不敢相信我犯了那个错误。好久没有用Java编程了,结果又犯了初学者的错误:(。但是我还有一个疑问,当我试图将menuOption设置为不可见时,我会收到以下错误:java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view。我尝试使用getItemfindItem两种方法,但都遇到了同样的错误。我应该在其他地方进行比较吗? - Francisco Romero
你能同时发布菜单的XML吗? - user3728999
我已经添加了菜单的XML。 - Francisco Romero

3

最终,我找到了我的问题所在。

问题是由于我没有注意到 onCreateOptionsMenuonPrepareOptionsMenu 没有被使用,所以我将它们删除了。

此外,由于我在 NavigationView 中使用了我的菜单,因此我必须在我的 MainActivity 类的 onCreate 函数中调用以下语句来膨胀(inflate)NavigationView

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

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


0

如果您想要为特定活动隐藏特定菜单项,请尝试此方法。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接