it-swarm.com.de

Android fügt einem menuItem ein Untermenü hinzu, wo befindet sich addSubMenu ()?

Ich möchte ein Untermenü in meinem OptionsMenu zu einem menuItem hinzufügen, programmgesteuert nach meinen Parametern. Ich habe "MenuItem" in Android sdk überprüft und es gibt keine addSubMenu () -Methode !, obwohl Sie "hasSubMenu ()" und "getSubMenu" finden können. 

Ich habe darüber nachgedacht, dies im onCreateOptionsMenu zu tun:

public boolean onCreateOptionsMenu(Menu menu) {

    MenuItem mi = menu.getItem(MYITEMID);  // << this is defined in my XML optionsMenu
    SubMenu subm = mi.addSubMenu(0,1,0,"Map 1"); // no addSubMenu() method!!!???
....

Wie erstelle ich ein Untermenü in einem Menuitem im Code?

40
ruhalde

Manchmal ist Android-Verrücktheit wirklich erstaunlich (und amüsant ..). Ich habe es so gelöst:

a) Definieren Sie in XML einen Untermenüplatzhalter wie folgt:

<item Android:visible="true" Android:id="@+id/m_area"
   Android:titleCondensed="Areas"
   Android:title="Areas"
   Android:icon="@drawable/restaur"
   Android:enabled="true"> 
   <menu>
    <item Android:id="@+id/item1" Android:title="Placeholder"></item>
   </menu>
</item>

b) Holen Sie sich das Untermenüelement in OnCreateOptionsMenu, löschen Sie es und fügen Sie meine Untermenüelemente hinzu:

    public boolean onCreateOptionsMenu(Menu menu) { 
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.mapoptions, menu);

            int idx=0;
            subm = menu.getItem(MYITEM_INDEX).getSubMenu(); // get my MenuItem with placeholder submenu
            subm.clear(); // delete place holder

            while(true)
            {
                anarea = m_areas.GetArea(idx); // get a new area, return null if no more areas
                if(anarea == null)
                    break;
                subm.add(0, SUBAREASID+idx, idx, anarea.GetName()); // id is idx+ my constant
                ++idx;
            }
}
63
ruhalde

Ich weiß, dass dies eine alte Frage ist, aber ich bin gerade selbst auf dieses Problem gestoßen. Die einfachste Möglichkeit, dies zu tun, scheint zu sein, das Element selbst einfach als Untermenü anzugeben und dann diesem Element hinzuzufügen. Z.B:

menu.add(groupId, MENU_VIEW, Menu.NONE, getText(R.string.menu_view));
menu.add(groupId, MENU_EDIT, Menu.NONE, getText(R.string.menu_edit));
SubMenu sub=menu.addSubMenu(groupId, MENU_SORT, Menu.NONE, getText(R.string.menu_sort));
sub.add(groupId, MENU_SORT_BY_NAME, Menu.NONE, getText(R.string.menu_sort_by_name));
sub.add(groupId, MENU_SORT_BY_ADDRESS, Menu.NONE, getText(R.string.menu_sort_by_address));
:
:
24
Einar H.

Hier ist eine vollständige Antwort, die auf der Idee der Verwendung eines Platzhalters aufbaut, jedoch hauptsächlich XML zum Hinzufügen des Untermenüs verwendet.

Wenn Sie ein Menü wie die so genannte main_menu.xml haben:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:title="My Menu"
    Android:id="@+id/my_menu_item">
    <!-- A empty SubMenu -->
    <menu></menu>
</item>
</menu>

Erstellen Sie ein weiteres Menü, sub_menu.xml, das in my_menu_item verwendet wird:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:title="SubMenu One"
    Android:id="@+id/submenu_one" />
  <item Android:title="SubMenu Two"
    Android:id="@+id/submenu_two" />
  <item Android:title="SubMenu Three"
    Android:id="@+id/submenu_three" />
</menu>

In Ihrem onCreateOptionsMenu:

public boolean onCreateOptionsMenu(Menu menu) {
   // Inflate your main_menu into the menu
   getMenuInflater().inflate(R.menu.main_menu, menu);

   // Find the menuItem to add your SubMenu
   MenuItem myMenuItem = menu.findItem(R.id.my_menu_item);

   // Inflating the sub_menu menu this way, will add its menu items 
   // to the empty SubMenu you created in the xml
   getMenuInflater().inflate(R.menu.sub_menu, myMenuItem.getSubMenu());

}

Diese Lösung ist Nizza, da der Inflator die meiste Arbeit erledigt.

18
Robert

Dies erreichen Sie am besten in Ihrer XML-Menüdatei. Sie können dies tun, indem Sie ein neues menu-Objekt in einer item erstellen:

<menu>
  <item>
    ...
    <menu>
      ...
    </menu>
    ...
  </item>
</menu>
13
Phil
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@+id/menu1" Android:alphabeticShortcut="a"
    Android:title="Menu No. 1" Android:orderInCategory="1" />
<item Android:id="@+id/menu2" Android:alphabeticShortcut="b"
    Android:title="Menu No. 2" Android:orderInCategory="2">
    <menu >
    <group Android:id="@+id/group2" Android:checkableBehavior="single">
        <item Android:id="@+id/submenu1" Android:title="SubMenu No. 1" />
        <item Android:id="@+id/submenu2" Android:title="SubMenu No. 2" />
    </group>   
    </menu>
</item>

0

Ich würde einfach das Untermenü in einer XML-Datei erstellen und zur Laufzeit das Untermenü vom Menüobjekt abrufen (mithilfe der findItem (id) -Methode) und es mit submenu.setVisible (boolean) zur Laufzeit hinzufügen/entfernen.

0
sorry_I_wont

Um ein umfassendes Beispiel für Phils Antwort zu geben, hier meine vollständige, funktionierende XML für ein Menü mit zwei Optionen, von denen jede ein Menü mit drei Optionen ist. Ich beabsichtige, ein drittes Menü zur obersten Ebene hinzuzufügen ...

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:HTMLCode="http://schemas.Android.com/apk/res-auto">

    <item Android:id="@+id/Examine"
        Android:title="@string/Examine"
        HTMLCode:showAsAction="always">

        <menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:HTMLCode="http://schemas.Android.com/apk/res-auto" >
            <item Android:id="@+id/load"
                Android:title="@string/load"
                HTMLCode:showAsAction="ifRoom|withText" />

            <item Android:id="@+id/findfirst"
                Android:title="@string/findfirst"
                HTMLCode:showAsAction="ifRoom|withText" />

            <item Android:id="@+id/findnext"
                Android:title="@string/FindNext"
                HTMLCode:showAsAction="ifRoom|withText" />
        </menu>
    </item>

    <item Android:id="@+id/Redirect"
        Android:title="@string/Redirect"
        HTMLCode:showAsAction="ifRoom|withText">

        <menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:HTMLCode="http://schemas.Android.com/apk/res-auto" >
            <item Android:id="@+id/getRedirect"
                Android:title="@string/getRedirect"
                HTMLCode:showAsAction="ifRoom|withText" />

            <item Android:id="@+id/toggleRedirect"
                Android:title="@string/toggleRedirect"
                HTMLCode:showAsAction="ifRoom|withText" />

            <item Android:id="@+id/copyRedirect"
                Android:title="@string/copyRedirect"
                HTMLCode:showAsAction="ifRoom|withText" />
        </menu>
    </item>
</menu>
0
Mick

Verwenden Sie stattdessen einen ActionProvider.

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();
    }
}
0