java - 根据用户输入设置菜单项android

标签 java android xml menu

我已经阅读这里问题的答案几个小时了,但似乎没有解决方案适合我。

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

相关文章:

java - 在到达 Controller 之前和离开 Controller 之后解密/加密有效负载

java - wifi 无法在菜单选项上打开/关闭

android 通过 gridview 填充所有屏幕

android - 在android中滚动时应用栏不隐藏

java - 使用 OpenNLP 进行句子检测

java - 在 java 中使用 vtd-xml 抛出 java.lang.UnsupportedClassVersionError

java - 根据标记值对 java 列表中的 XML 行进行排序

xml - Tomcat 服务器会自动识别并执行跨域策略文件吗?

java - Java 6 中默认支持 xinclude 吗?

java - Jersey + Spring + Tomcat 环境不生成swagger.json