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

时间:2018-02-16 03:42:08

标签: java android xml menu

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

我正在为DnD Character Creations创建一个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活动类中的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/app/src/main/java/com/ucfknights/dylan_oszust/dungeonsanddragons

2 个答案:

答案 0 :(得分:0)

第一次尝试你是在正确的轨道上。您使用invalidateOptionsMenu()来触发对onPrepareOptionsMenu()的调用,您可以在其中对菜单进行更改。

您需要从true返回onPrepareOptionsMenu()才能显示。

也不要在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()就可以在那里修改它。

答案 1 :(得分:0)

对于任何想要使用nav_drawer菜单解决此问题的人,您必须以不同于标准选项菜单的方式访问它(感谢Sound Conception指出差异)。代码应该从导航视图中获取菜单。

下面是工作代码,它是应用程序的初始菜单构建器,它在决定在导航抽屉中显示或隐藏法术书选项之前检查该类是否是一个神奇的类。

@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;
}