基于用户输入Android设置菜单项



我一直在阅读此处的问题的答案数小时,而解决方案似乎对我有用。

我正在为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;
}

最新更新