我已经阅读这里问题的答案几个小时了,但似乎没有解决方案适合我。
我正在为 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);
}
这是java中的尝试2,在Profile Activity 类中,因为这个类是在指定字符类之后调用的,并且这个函数是在第一次设置菜单时:
@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/app/src/main/java/com/ucfknights/dylan_oszust/dungeonsanddragons
最佳答案
您的第一次尝试就走在了正确的轨道上。您可以使用 invalidateOptionsMenu()
触发对 onPrepareOptionsMenu()
的调用,在其中实现对菜单的更改。
您需要从 onPrepareOptionsMenu()
返回 true
才能显示它。
也不要在 onPrepareOptionsMenu()
中再次膨胀菜单。方法参数中已向您提供了菜单
。
@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()
就是您可以从那时起修改它的地方。
关于java - 根据用户输入设置菜单项android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48819741/