我一直在阅读此处的问题的答案数小时,而解决方案似乎对我有用。
我正在为DND角色创建创建一个Android应用程序,如果用户选择了一个神奇的类,我想在主菜单中添加咒语书选项。
出于某种原因,无论我做什么,它都会根据XML显示可见的或不可见的,并且不会通过代码更改它。
这是我的XML:
<?xml version="1.0" encoding="utf-8"?>
<!--TODO: create related icons-->
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_profile"
android:title="Profile"
android:visible="true"/>
<item
android:id="@+id/nav_battle"
android:title="Battle"
android:visible="true"/>
<item
android:id="@+id/nav_items"
android:title="Items"
android:visible="true"/>
<item
android:id="@+id/nav_spellbook"
android:title="Spell Book"
android:visible="false"/>
</group>
这是Java中的尝试1:
public void classBasedTraits() {
int intHealthInitial = 0;
//end attempt
switch (strCharacterClass) {
case "Sorcerer":
case "Wizard":
intHealthInitial = 6; // Sorcerer and Wizard's initial health is 6
break;
case "Bard":
case "Cleric":
case "Druid":
case "Monk":
case "Rogue":
case "Warlock":
intHealthInitial = 8; // Bard, Cleric, Druid, Monk, Rogue, and Warlock's initial health is 8
break;
case "Fighter":
case "Paladin":
case "Ranger":
intHealthInitial = 10; // Fighter, Paladin, and Ranger's initial health is 10
break;
case "Barbarian":
intHealthInitial = 12; // Barbarian's initial health is 12
break;
}
//Attempt to create spellbook for magical classes'
Set<String> setMagical;
setMagical = new HashSet<String>(Arrays.asList("Bard", "Cleric", "Druid", "Paladin",
"Ranger", "Sorcerer", "Warlock", "Wizard"));
if(setMagical.contains(strCharacterClass)){
magical = true;
invalidateOptionsMenu();
}
intTotalHP = intHealthInitial + intConstitutionMod; // Starting HP is initial health + constitution modifier
intRemainingHP = intTotalHP; // Sets character at full health
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main_drawer, menu);
menu.findItem(R.id.nav_spellbook).setVisible(magical);
return super.onPrepareOptionsMenu(menu);
}
这是在Profile Activity类中的Java中的尝试2,因为该类是在指定字符类后调用的,并且此功能是第一次设置菜单时:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main_drawer, menu);
Set<String> setMagical;
setMagical = new HashSet<String>(Arrays.asList("Bard", "Cleric", "Druid", "Paladin",
"Ranger", "Sorcerer", "Warlock", "Wizard"));
MenuItem spellbook = menu.findItem(R.id.nav_spellbook);
if(setMagical.contains(characterClass))
{
spellbook.setVisible(true);
}
else
{
spellbook.setVisible(false);
}
return true;
}
如果有人想查看完整的代码,这是GitHub上的项目https://github.com/doszust/rpg-character-sheet/tree/master/master/app/src/src/main/java/java/com/ucfknights/dylan_oszust/dungeonsanddragons
您在第一次尝试的情况下在正确的轨道上。您使用invalidateOptionsMenu()
触发对onPrepareOptionsMenu()
的呼叫,在此您将更改实现到菜单。
您需要从onPrepareOptionsMenu()
返回true
才能显示。
也不要在onPrepareOptionsMenu()
中再次夸大菜单。您已经在方法参数中提供了menu
。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main_drawer, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.nav_spellbook).setVisible(magical);
return 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/nav_profile"
android:title="Profile"
android:visible="true"/>
<item
android:id="@+id/nav_battle"
android:title="Battle"
android:visible="true"/>
<item
android:id="@+id/nav_items"
android:title="Items"
android:visible="true"/>
<item
android:id="@+id/nav_spellbook"
android:title="Spell Book"
android:visible="false"/>
</group>
</menu>
因此,onCreateOptionsMenu()
是您首先创建菜单的地方。然后,onPrepareOptionsMenu()
是您可以从那时开始对其进行修改的地方。
对于那些也希望使用nav_drawer菜单来解决此问题的人,您必须以与标准选项菜单不同的方式访问它(感谢指出差异的声音概念(。该代码应从导航视图获取菜单。
工作代码在下面,它是该应用程序的初始菜单构建器,它可以检查该类在决定在NAV抽屉中显示或隐藏Spellbook选项之前是否是神奇的类。
。@Override
public boolean onCreateOptionsMenu(Menu menu) {
Set<String> setMagical;
setMagical = new HashSet<String>(Arrays.asList("Bard", "Cleric", "Druid", "Paladin",
"Ranger", "Sorcerer", "Warlock", "Wizard"));
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Menu nav_Menu = navigationView.getMenu();
MenuItem spellbook = nav_Menu.findItem(R.id.nav_spellbook);
if(setMagical.contains(characterClass))
{
spellbook.setVisible(true);
}
else
{
spellbook.setVisible(false);
}
return true;
}