2012-02-18 23 views
61

A través de xml Puedo agregar elementos de submenú a mi acción en el ActionBar.Cómo agregar elementos de submenú a acción de ActionBar en el código?

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> 

Pero ¿cómo puedo agregar estos elementos a través de sub código Java? No funciona de la siguiente manera, los sub elementos están siendo añadidos a la acción equivocada (y también el dibujable no se muestra), el botón derecho mismo, no mi botón 'Nuevo formulario':

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> 

Código 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; 
} 

¿hay una manera de lograr esto, la adición de elementos de submenú a través del código de Java en lugar de XML, sin usando un PopupMenu (http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)?

Update (Solución):

Mi fragmento de código final terminé con rellenar el submenú dinámicamente, tras la respuesta de adamp:

// 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

que utilizan este código para mi aplicación @Override \t public boolean onCreateOptionsMenu (menú Menú) { \t \t // TODO Auto generados por el método talón de \t \t súper.onCreateOptionsMenu (menú); \t \t MenuInflater inflater = getMenuInflater(); \t \t inflater.inflate (R.menu.poi_menu, menú); \t \t for (int i = 0; i

Respuesta

35

Sí, la hay.

El método addSubMenu devuelve un objeto SubMenu. Un SubMenu también es Menu, por lo que puede llamar al add para agregar elementos al submenú en lugar del menú principal. Su código anterior crea dos submenús diferentes para el Formulario 1 y el Formulario 2 en lugar de dos elementos dentro de un solo submenú Formulario nuevo.

Ejemplo:

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

Gracias, ya lo había averiguado ayer y estoy trabajando ahora. Pensé que podría usar los groupIds para eso, pensé que ese era su propósito y colgaron el elemento en la jerarquía correcta. Gracias de nuevo. –

+0

Los ID de grupo se utilizan para otras formas de agrupación lógica. Por ejemplo, si los elementos del menú aparecen en la barra de acciones como "ifRoom", los elementos en el mismo grupo se desbordarán juntos: todos los elementos del grupo aparecerán en la barra o todos los elementos se moverán al menú de desbordamiento. Es útil para comandos relacionados que no deberían separarse en la presentación. – adamp

+1

@MathiasLin ¿Cómo resolvió este problema? Porque estoy enfrentando lo mismo. Pero como sugirió adamp, agrega un submenú en el menú principal (Nuevo formulario en el menú principal) y luego hacemos clic en "Formulario nuevo", muestra el elemento "Formulario 1" pero, aunque no se puede dibujar. ¿Puedes compartir un código por favor? –

2

Adición de una ActionProvider Tal vez sea más fácil. Usted puede tratar como se explica here

1

Usted debe considerar el uso de un ActionProvider

ejemplo: https://gist.github.com/sibelius/7ca0b757492ff6740dec

menú con el elemento del proveedor de acción

<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> 

Código

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

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

Cuestiones relacionadas