Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add submenu items to ActionBar action in code?

Via xml I can add submenu items to my action in the ActionBar.

enter image description here

main_menu.xml:

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android">     <item android:id="@+id/menu_new_form"           android:icon="@drawable/ic_new_form"           android:title="@string/menu_new_form"           android:showAsAction="ifRoom|withText">         <menu>             <item android:id="@+id/form1"                   android:icon="@drawable/attachment"                   android:title="Form 1"                   android:onClick="onSort" />             <item android:id="@+id/form2"                   android:icon="@drawable/attachment"                   android:title="Form 2"                   android:onClick="onSort" />         </menu>     </item> </menu> 

But how can I add these sub items via Java code? It doesn't work as below, the sub items are getting added to the wrong action (and also the drawable isn't shown), the very right button, not my 'New Form' button:

enter image description here

main_menu.xml:

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android">     <item android:id="@+id/menu_new_form"           android:icon="@drawable/ic_new_form"           android:title="@string/menu_new_form"           android:showAsAction="ifRoom|withText">     </item> </menu> 

Java Code:

@Override public boolean onCreateOptionsMenu(Menu menu) {     super.onCreateOptionsMenu(menu);     MenuInflater inflater = getMenuInflater();     inflater.inflate(R.menu.main_menu, menu);      Log.d("MainMenu", ",menu title0: " + menu.getItem(0).getTitle());      // returns "New Form"      menu.addSubMenu(0, Menu.NONE, 1, "Form 1").setIcon(R.drawable.attachment);     menu.addSubMenu(0, Menu.NONE, 2, "Form 2").setIcon(R.drawable.attachment);     return true; } 

Is there a way to achieve this, adding sub menu items via Java Code instead of XML, without using a PopupMenu (http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)?

Update (Solution):

My final code snippet I ended up with to populate the submenu dynamically, following adamp's reply:

// menu options private static final int MENU_PREFERENCES = Menu.FIRST; private static final int MENU_LOGOUT = 2;  @Override public boolean onCreateOptionsMenu(final Menu menu) {     super.onCreateOptionsMenu(menu);      MenuInflater inflater = getMenuInflater();     inflater.inflate(R.menu.main_menu, menu);     menu.add(0, MENU_PREFERENCES, 0, getString(R.string.general_preferences)).setIcon(             android.R.drawable.ic_menu_preferences);      // load all available form templates     Cursor c = managedQuery(FormsProviderAPI.FormsColumns.CONTENT_URI, null, null, null, null);     try {         int ixDisplayName = c.getColumnIndex(FormsProviderAPI.FormsColumns.DISPLAY_NAME);         int ixId = c.getColumnIndex(FormsProviderAPI.FormsColumns._ID);         int cnt = 0;         while (c.moveToNext()) {             cnt++;             Log.d("ID: ", "ID: "+ c.getInt(ixId));  // misusing the group id for the form id             menu.getItem(1).getSubMenu().addSubMenu(c.getInt(ixId), Menu.NONE, cnt, c.getString(ixDisplayName)).setIcon(R.drawable.attachment_dark);         }     } catch (Exception e) {         Log.e(TAG, "Error init form templates list.", e);     }      return true; } 
like image 282
Mathias Conradt Avatar asked Feb 18 '12 18:02

Mathias Conradt


People also ask

Which method is used to create menu items on ActionBar?

The Android tooling automatically creates a reference to menu item entries in the R file, so that the menu resource can be accessed. An activity adds entries to the action bar in its onCreateOptionsMenu() method. The showAsAction attribute allows you to define how the action is displayed.

Where is ActionBar in Android?

In Android applications, ActionBar is the element present at the top of the activity screen. It is a salient feature of a mobile application that has a consistent presence over all its activities.


1 Answers

Yes, there is.

The addSubMenu method returns a SubMenu object. A SubMenu is also a Menu, so you can call add on it to add items to the submenu rather than the parent menu. Your code above is creating two different submenus for Form 1 and Form 2 rather than two items within a single New Form submenu.

Example:

SubMenu submenu = menu.addSubMenu(0, Menu.NONE, 1, "New Form").setIcon(R.drawable.ic_new_form); submenu.add("Form 1").setIcon(R.drawable.attachment); 
like image 116
adamp Avatar answered Oct 03 '22 13:10

adamp