【问题标题】:how we can add menu item dynamically我们如何动态添加菜单项
【发布时间】:2013-06-26 04:59:03
【问题描述】:

大家好,我正在创建一个标签应用程序。

在扩展 sherlockFragmentActivity 的 Home 中,我正在扩展 menu.xml 并包含用于 optionMenuitem 单击侦听器的代码。 Fragmentactivity 包含 tabhost 并在每个选项卡上加载片段。 这是我的 menu.xml

<item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="always"
       android:icon="@drawable/setting_selector"
        android:title=""
        >
        <menu >
            <item
                android:id="@+id/Profile"
                android:showAsAction="ifRoom"
                android:title="Profile"/>
            <item
                android:id="@+id/chngDoctor"
                android:showAsAction="ifRoom"
                android:title="Change doctor"
                android:visible="false"/>
            <item
                android:id="@+id/changePword"
                android:showAsAction="ifRoom"
                android:title="Change password"/>
            <item
                android:id="@+id/logout"
                android:showAsAction="ifRoom"
                android:title="Logout"/>
        </menu>
    </item>

这是我在 Home 类中的 onCreateOptionMenu 和 onOptionItemSelected 方法

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub
    getSupportMenuInflater().inflate(R.menu.main, menu);
    SubMenu subMenu = (SubMenu) menu.getItem(0).getSubMenu();
    if(userType.equals("admin"))
        subMenu.getItem(1).setVisible(true);
    else
        subMenu.getItem(1).setVisible(false);
    return true;
}

这是我的 onOptionItemSelected 方法

  @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        switch (item.getItemId()) {
        case R.id.Profile:
              break;
        case R.id.changePword :
            break;
        case R.id.chngDoctor :
                 break;
        case R.id.logout:
            Home.this.finish();
            break;
        }
        return true;
    }

我需要根据标签更改添加一些菜单。那是在选项卡更改时我加载不同的片段,当片段更改时我需要向菜单添加新项目。我的 ListFrag 扩展了 SherlockFragment,当我单击第三个选项卡时它会加载。当这个片段加载时,我需要在菜单中添加 1 个菜单项

【问题讨论】:

    标签: android actionbarsherlock menubar optionmenu


    【解决方案1】:

    试试下面的方法。

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);
    
            menu.add(0, 0, 0, "Option1").setShortcut('3', 'c');
            menu.add(0, 1, 0, "Option2").setShortcut('3', 'c');
            menu.add(0, 2, 0, "Option3").setShortcut('4', 's');
    
            SubMenu sMenu = menu.addSubMenu(0, 3, 0, "SubMenu"); //If you want to add submenu               
            sMenu.add(0, 4, 0, "SubOption1").setShortcut('5', 'z');
            sMenu.add(0, 5, 0, "SubOption2").setShortcut('5', 'z');             
    
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {           
    
            switch (item.getItemId()) {
            case 0:
                // code for option1
                return true;
            case 1:
                // code for option2
                return true;
            case 2:
                // code for option3
                return true;            
            case 4:
                // code for subOption1
                return true;
            case 5:
                // code for subOption2
                return true;            
            }
            return super.onOptionsItemSelected(item);
        }
    

    这可能会对你有所帮助。

    【讨论】:

    • 我需要在加载特定片段时动态添加一个新菜单项
    • 你检查this问题了吗?
    • 在片段类上我们需要添加这一行 setHasOptionsMenu(true);其他与活动相同的东西
    • 你能把那个链接作为答案和一个小描述发布吗??
    【解决方案2】:

    menu.xml 中您应该添加所有菜单项。然后,您可以隐藏在初始加载时不想看到的项目。

    <item
        android:id="@+id/action_newItem"
        android:icon="@drawable/action_newItem"
        android:showAsAction="never"
        android:visible="false"
        android:title="@string/action_newItem"/>
    

    在 onCreate() 方法中添加 setHasOptionsMenu(true) 以调用 Fragment 类中的菜单项。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }
    

    您无需再次在 Fragment 类中覆盖 onCreateOptionsMenu。可以通过覆盖片段中可用的onPrepareOptionsMenumethod 来更改(添加/删除)菜单项。

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        menu.findItem(R.id.action_newItem).setVisible(true);
        super.onPrepareOptionsMenu(menu);
    
    }
    

    【讨论】:

      【解决方案3】:

      这是一个例子……它可能对你有帮助……

        private static final int MENU_ADD = Menu.FIRST;
          private static final int MENU_LIST = MENU.FIRST + 1;
          private static final int MENU_REFRESH = MENU.FIRST + 2;
          private static final int MENU_LOGIN = MENU.FIRST + 3;
      
      
        @Override
              public boolean onPrepareOptionsMenu(Menu menu) {
                  menu.clear();
                  if(enableAdd)
                      menu.add(0, MENU_ADD, Menu.NONE, R.string.your-add-text).setIcon(R.drawable.your-add-icon);
                  if(enableList)
                      menu.add(0, MENU_LIST, Menu.NONE, R.string.your-list-text).setIcon(R.drawable.your-list-icon);
                  if(enableRefresh)
                      menu.add(0, MENU_REFRESH, Menu.NONE, R.string.your-refresh-text).setIcon(R.drawable.your-refresh-icon);
                  if(enableLogin)
                      menu.add(0, MENU_LOGIN, Menu.NONE, R.string.your-login-text).setIcon(R.drawable.your-login-icon);
                  return super.onPrepareOptionsMenu(menu);
              }
      
              @Override
              public boolean onOptionsItemSelected(MenuItem item) {
                  super.onOptionsItemSelected(item);
      
                  switch (item.getItemId()) {
                  case MENU_ADD: doAddStuff(); break;
                  case MENU_LIST: doListStuff(); break;
                  case MENU_REFRESH: doRefreshStuff(); break;
                  case MENU_LOGIN: doLoginStuff(); break;
                  }
                  return false;
      

      【讨论】:

      • 我的问题是如何为不同的片段添加不同的菜单项
      【解决方案4】:

      基于古纳西兰的回答

      @Override
      public boolean onPrepareOptionsMenu(Menu menu)
      {
          menu.removeGroup(1);
          if (iotsnames.isEmpty()) return true;
          for (int i=0; i<iotsnames.size(); i++ ){
              menu.add(1, i, 0, iotsnames.get(i) );
          }
          return true;
      }
      

      【讨论】:

        【解决方案5】:

        使用onPrepareOptionsMenu 方法并首先使用清除所有菜单

        menu.clear();
        

        然后添加菜单。

        还有refer here..检查它的onPrepareOptionsMenu方法

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-26
          相关资源
          最近更新 更多