2012-02-18 18 views
61

Przez xml Mogę dodać elementy podmenu do mojej akcji w ActionBar.Jak dodać elementy podmenu do akcji ActionBar w kodzie?

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> 

Ale jak mogę dodać te elementy podrzędne pośrednictwem kodu Java? To nie działa jak poniżej, podrzędne pozycje są coraz dodany do niewłaściwego działania (a także odkształcalne nie pokazano), bardzo prawym przyciskiem, a nie mój przycisk „Nowa forma”:

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> 

kod Java:

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

Czy istnieje sposób, aby to osiągnąć, dodając podrzędne pozycje menu za pomocą kodu Java zamiast XML, bez przy użyciu PopupMenu (http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)?

Update (Solution):

Mój końcowy fragment kodu skończyło się zapełnić podmenu dynamicznie, po odpowiedzi adamp za:

// 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; 
} 
+1

Używam tego kod do mojej aplikacji @Override \t public boolean onCreateOptionsMenu (MENU) { \t \t // TODO Auto-generowane metoda skrótowej \t \t Super.onCreateOptionsMenu (menu); \t \t MenuInflater inflater = getMenuInflater(); \t \t inflater.inflate (R.menu.poi_menu, menu); \t \t do (int i = 0; i

Odpowiedz

35

Tak, jest.

Metoda zwraca obiekt SubMenu. A SubMenu to także Menu, dzięki czemu można na nim zadzwonić pod numer add, aby dodać elementy do podmenu, a nie do menu nadrzędnego. Powyższy kod tworzy dwa różne podmenu dla Form 1 i Form 2 zamiast dwóch elementów w jednym podmenu Nowa forma.

przykład:

SubMenu submenu = menu.addSubMenu(0, Menu.NONE, 1, "New Form").setIcon(R.drawable.ic_new_form); 
submenu.add("Form 1").setIcon(R.drawable.attachment); 
+0

Dzięki, już to wczoraj zrozumiałem i pracuję teraz. Pomyślałem, że mogę użyć groupIds do tego, myślałem, że to był ich cel i powiesili przedmiot do właściwej hierarchii. Dzięki jeszcze raz. –

+0

Identyfikatory grupy są używane dla innych form logicznego grupowania. Na przykład, jeśli elementy menu pojawią się na pasku akcji jako "ifRoom", elementy z tej samej grupy przepełnią się razem - albo wszystkie elementy w grupie pojawią się na pasku, albo wszystkie elementy zostaną przeniesione do menu nadmiarowego. Przydaje się do powiązanych poleceń, które nie powinny być rozdzielane w prezentacji. – adamp

+1

@MathiasLin Jak rozwiązałeś ten problem? Ponieważ stoję przed tym samym. Ale jak zaproponował adamp Dodaje podmenu w menu głównym (Nowa forma w menu głównym), a następnie klikamy "Nowy formularz", pokazuje element "Form 1", ale mimo tego, że nie pojawił się draw. Czy możesz podzielić się jakimś kodem? –

2

Dodawanie ActionProvider może łatwiej. Można spróbować jak wyjaśniono here

1

należy rozważyć, aby użyć ActionProvider

przykład: https://gist.github.com/sibelius/7ca0b757492ff6740dec

Menu z pozycji operatora działanie

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <item android:id="@+id/action_companies" 
     android:icon="@drawable/ic_list" 
     android:title="@string/action_companies" 
     app:actionProviderClass="com.example.MyActionProvider" 
     app:showAsAction="always"/> 
</menu> 

Kod

public class MyActionProvider extends ActionProvider { 

    private Context mContext; 

    public MyActionProvider(Context context) { 
     super(context); 

     mContext = context; 
    } 

    @Override 
    public View onCreateActionView() { 
     //LayoutInflater layoutInflater = LayoutInflater.from(mContext); 
     return null; 
    } 

    @Override 
    public void onPrepareSubMenu(SubMenu subMenu) { 
     super.onPrepareSubMenu(subMenu); 

     subMenu.clear(); 

     subMenu.add("menu 1"); 
     subMenu.add("menu 2"); 
     subMenu.add("menu 3"); 
    } 

    @Override 
    public boolean hasSubMenu() { 
     return true; 
    } 

    @Override 
    public boolean onPerformDefaultAction() { 
     return super.onPerformDefaultAction(); 
    } 
} 
+1

poprawiono: https: // gist .github.com/sibelius/7ca0b757492ff6740dec –

Powiązane problemy