如何参数化 Android 上的菜单选项?
How to parametrize options of a menu on Android?
我想 show/hide Android 应用程序菜单的某些选项,具体取决于我将在 strings.xml
文件中设置为 true/false 的一些字符串。
例如,我将这些字符串放在 strings.xml
文件中:
<string name="option1">false</string>
<string name="option2">true</string>
<string name="option3">true</string>
所以在这种情况下,只需要显示 option2
和 option3
。
另一方面,我的意思是,在代码中,我尝试了以下操作:
@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" 我在 MainActivity
的 onCreate
函数上显示如下布局:
if("hello".equals(stringForLayout)){
setContentView(R.layout.activity_main);
}else{
setContentView(R.layout.activity_main_secondary);
}
我如何参数化两个菜单的选项,以便在显示第一个菜单时我想隐藏一个选项,我可以参考该菜单的那个选项?
提前致谢!
如果您使用字符串(例如 s1 和 s2),您必须像这样比较它们:
if(s1.equals(s2)) {...}
顺便说一句:您还可以查看 android 文档中的共享首选项以获得更清晰的解决方案。您可以在那里为不同的菜单选项定义布尔变量。
如果您想隐藏特定 activity 的特定菜单项,请试试这个。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem mSearch = menu.findItem(R.id.mSearch);
mSearch.setVisible(false);
invalidateOptionsMenu();
}
终于找到问题所在了
问题来了,因为我没有注意到onCreateOptionsMenu
和onPrepareOptionsMenu
没有被使用所以我删除了它们。
此外,当我在 NavigationView
中使用我的菜单时,我不得不使用 MainActivity
onCreate
函数上的 NavigationView
膨胀 class,下面的语句:
navigationView.getMenu().findItem(R.id.option1).setVisible(false);
在那里,我没有任何问题成功隐藏我的菜单项。
我想 show/hide Android 应用程序菜单的某些选项,具体取决于我将在 strings.xml
文件中设置为 true/false 的一些字符串。
例如,我将这些字符串放在 strings.xml
文件中:
<string name="option1">false</string>
<string name="option2">true</string>
<string name="option3">true</string>
所以在这种情况下,只需要显示 option2
和 option3
。
另一方面,我的意思是,在代码中,我尝试了以下操作:
@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" 我在 MainActivity
的 onCreate
函数上显示如下布局:
if("hello".equals(stringForLayout)){
setContentView(R.layout.activity_main);
}else{
setContentView(R.layout.activity_main_secondary);
}
我如何参数化两个菜单的选项,以便在显示第一个菜单时我想隐藏一个选项,我可以参考该菜单的那个选项?
提前致谢!
如果您使用字符串(例如 s1 和 s2),您必须像这样比较它们:
if(s1.equals(s2)) {...}
顺便说一句:您还可以查看 android 文档中的共享首选项以获得更清晰的解决方案。您可以在那里为不同的菜单选项定义布尔变量。
如果您想隐藏特定 activity 的特定菜单项,请试试这个。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem mSearch = menu.findItem(R.id.mSearch);
mSearch.setVisible(false);
invalidateOptionsMenu();
}
终于找到问题所在了
问题来了,因为我没有注意到onCreateOptionsMenu
和onPrepareOptionsMenu
没有被使用所以我删除了它们。
此外,当我在 NavigationView
中使用我的菜单时,我不得不使用 MainActivity
onCreate
函数上的 NavigationView
膨胀 class,下面的语句:
navigationView.getMenu().findItem(R.id.option1).setVisible(false);
在那里,我没有任何问题成功隐藏我的菜单项。