【问题标题】:Create submenus programmatically for existing Menu created from XML以编程方式为从 XML 创建的现有菜单创建子菜单
【发布时间】:2011-09-21 03:13:09
【问题描述】:

我已经在 xml 中创建了我的父菜单,现在我不知道如何使用代码在这些父菜单下创建子菜单。这意味着,父母在 menu.xml 中编码,当数据可用时,将根据动态代码加载子菜单。

当我尝试使用 menu.addSubMenu 时,它正在创建一个新的父菜单项。

【问题讨论】:

    标签: android menu


    【解决方案1】:

    我知道这是一个非常古老的线程,但希望这会帮助像我这样有相同要求的其他人。

    menu/movies.xml:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        <group>
            <item
                android:id="@+id/action_filter"
                android:showAsAction="never"
                android:title="Filter">
                <menu>
                    <group android:menuCategory="container">
                        <item
                            android:id="@+id/action_genre"
                            android:title="Genre">
                            <menu>
                                <group android:checkableBehavior="single" />
                            </menu>
                        </item>
                    </group>
                </menu>
            </item>
        </group>
    </menu>
    

    然后以编程方式在您的activity/fragment

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.movies, menu);
        MenuItem menuItem = menu.findItem(R.id.action_filter).getSubMenu().findItem(R.id.action_genre).getSubMenu().add(Menu.NONE, 1, Menu.NONE, "Action");
        MenuItem menuItem = menu.findItem(R.id.action_filter).getSubMenu().findItem(R.id.action_genre).getSubMenu().add(Menu.NONE, 2, Menu.NONE, "Comedy");
    }
    

    希望这会有所帮助。

    【讨论】:

    • 如何在子菜单(动作和喜剧)上添加点击监听器。
    • @GunduBandagar 在 onOptionsItemSelected。获取按下的菜单的 id,即。 menuItem.getId。然后使用 if then else 语句,检查这个 id 是否等于动作或喜剧菜单,并相应地进行处理。
    【解决方案2】:

    mymenu.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
                android:id="@+id/menubutton_submenuButton"
                android:showAsAction="always"/>
            <menu>
                <!-- empty submenu, filled programatically -->
            </menu>
        </item>
    </menu>
    

    然后在代码中:

    @Override
    public boolean onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.mymenu, menu);
    
        MenuItem menuItem = menu.findItem(R.id.menubutton_submenuButton);
        SubMenu subMenu = menuItem.getSubMenu();
        // @todo: add submenu items programmatically here.
    
        return super.onCreateOptionsMenu(menu, inflater);
    }
    

    【讨论】:

      【解决方案3】:

      好的..你应该试试这个..

      private static final int FILE = 0;
          private static final int EDIT = 1;
      
          private static final int NEW_MENU_ITEM = Menu.FIRST;
          private static final int SAVE_MENU_ITEM = NEW_MENU_ITEM + 1;
      
          private static final int UNDO_MENU_ITEM = SAVE_MENU_ITEM + 1;
          private static final int REDO_MENU_ITEM = UNDO_MENU_ITEM + 1;
      
      
      @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              Log.i("this is test ", "oncreate option menu is called");
      //      menu.add("this is first menu");
      //      menu.add("this is second menu");
      //      
              SubMenu fileMenu = menu.addSubMenu("File");
              SubMenu editMenu = menu.addSubMenu("Edit");
              fileMenu.add(FILE, NEW_MENU_ITEM, 0, "new");
              fileMenu.add(FILE, SAVE_MENU_ITEM, 1, "save");
              editMenu.add(EDIT, UNDO_MENU_ITEM, 0, "undo");
              editMenu.add(EDIT, REDO_MENU_ITEM, 1, "redo");
              return super.onCreateOptionsMenu(menu);
          }
      

      【讨论】:

      • 好吧,在这里你在代码中创建所有内容,但我想使用在 xml 中指定的现有菜单项,并且我想在其下创建子菜单。
      • 显然,这个答案的作者没有阅读问题并且给出的答案甚至没有解决原始问题
      猜你喜欢
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多