2011-08-20 17 views

Respuesta

25

menu.xml

<item 
    android:id="@+id/item1" 
    android:title="your Item"> 
    </item> 

puesto en su archivo Java

public void onPrepareOptionsMenu(Menu menu) { 

    menu.removeItem(R.id.item1); 
} 
+2

deshabilitar no está eliminando – zizoujab

+0

Me funcionó. Gracias. –

+0

Este es el que estaba buscando porque quiero tomar la decisión una vez en el tiempo de ejecución, pero no es necesario cambiar las opciones después. Utilicé: @Override public boolean onPrepareOptionsMenu (menú de menú) { if (! ShowItemName) { menu.removeItem (R.id.itemname); } return true; } – notmystyle

7

Si tengo que cambiar el contenido de mi menú de opciones que llevo a cabo durante el onMenuOpened(). Esto me permite verificar el estado de ejecución en el momento en que el usuario accede al menú.

public boolean onMenuOpened(int featureid, Menu menu) 
    { 
     menu.clear(); 
     if (!editable) 
     { 
      MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign)); 
      MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify)); 
      MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete)); 
      itemAdd.setShortcut('0', 'a'); 
      itemMod.setShortcut('1', 'm'); 
      itemDel.setShortcut('2', 'd'); 
     } 
     else 
     { 
      MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges)); 
      itemSave.setShortcut('0', 'S'); 
     } 


     return true; 
    } 
182

Para cualquier persona tiene que cambiar las opciones del menú de forma dinámica:

private Menu menu; 

// ... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    this.menu = menu; 
    getMenuInflater().inflate(R.menu.options, menu); 
    return true; 
} 

// ... 

private void hideOption(int id) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setVisible(false); 
} 

private void showOption(int id) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setVisible(true); 
} 

private void setOptionTitle(int id, String title) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setTitle(title); 
} 

private void setOptionIcon(int id, int iconRes) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setIcon(iconRes); 
} 
+0

Intenté esto, pero no me ayudó ¿me pueden ayudar por qué? – Prateek

+7

Una advertencia es que debe asegurarse de que se haya configurado 'menu' antes de intentar obtener un' MenuItem' fuera de él. Por ejemplo, si tiene algo como 'actionBar.setNavigationMode (ActionBar.NAVIGATION_MODE_TABS)', las pestañas se cargan antes del menú, por lo que llamar a 'hideOption'/'showOption' dentro de' onTabSelected' da como resultado una excepción de puntero nulo. – SaltyNuts

+3

¿Por qué esto no está marcado como la solución correcta? explica mejor la solución que la respuesta "correcta". – GiaNU

5

Para desactivar ciertos artículos:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); 
item.setEnabled(false); 
2

Puede hacer algo simple como lo hice. Simplemente cambie el texto a lo que se necesita cuando se toca el elemento del menú. Necesitaba activar y desactivar el sonido, además de la capacidad de realizar una acción tocándolo. Aquí está mi código:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.audioOn: 
     audioOn = !audioOn; 
     if (audioOn) 
      item.setTitle("Audio Off"); 
     else 
      item.setTitle("Audio On"); 
     return true; 

    case R.id.touchOn: 
     touchOn = !touchOn; 
     if (touchOn) 
      item.setTitle("Touch Off"); 
     else 
      item.setTitle("Touch On"); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

audioOn y touchOn son booleanos marcados en otras partes del código. Espero que esto ayude.

+0

¿Cómo puedo hacer esto de forma dinámica. Quiero decir ... llamar a un servicio web para seleccionar un elemento de opción y luego sobre su respuesta exitosa ... volver a llamar a CrearteOpcionesMenú. ¿Cómo hacer eso? – NarendraJi

3

Prueba este código:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    this.menu=menu; 
    updateMenuItems(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.document_list_activity_actions, menu); 
    return super.onCreateOptionsMenu(menu); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle presses on the action bar items 
    if (item.getItemId() == android.R.id.home) { 
     onHomeButtonPresssed(); 
    }else if (item.getItemId() == R.id.action_delete) { 
     useCheckBoxAdapter=false; 
     deleteDocuments(); 
    } else if (item.getItemId() == R.id.share) { 
     useCheckBoxAdapter=false; 
     shareDocuments(); 
    } else if (item.getItemId() == R.id.action_tick) { 
     useCheckBoxAdapter=true; 
     onShowCheckboxes(); 
    } 
    updateMenuItems(menu); 
    return true; 
} 

private void updateMenuItems(Menu menu){ 
    if (useCheckBoxAdapter && menu != null) { 
     menu.findItem(R.id.action_delete).setVisible(true); 
     menu.findItem(R.id.share).setVisible(true); 
     menu.findItem(R.id.action_tick).setVisible(false); 
    } else { 
     menu.findItem(R.id.action_delete).setVisible(false); 
     menu.findItem(R.id.share).setVisible(false); 
     menu.findItem(R.id.action_tick).setVisible(true); 
    } 
    invalidateOptionsMenu(); 
} 
0

se puede llevar a cabo su tarea, simplemente mediante la aplicación de la siguiente manera:

private Menu menu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.drive_menu, menu); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    this.menu = menu; 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_toggle_grid) { 
     handleMenuOption(id); 
     return true; 

    } else if(id == R.id.action_toggle_list){ 
     handleMenuOption(id); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private void handleMenuOption(int id) { 
    MenuItem item = menu.findItem(id); 
    if (id == R.id.action_toggle_grid){ 
     item.setVisible(false); 
     menu.findItem(R.id.action_toggle_list).setVisible(true); 
    }else if (id == R.id.action_toggle_list){ 
     item.setVisible(false); 
     menu.findItem(R.id.action_toggle_grid).setVisible(true); 
    } 
} 
4

usando las siguientes líneas que he hecho para sumar los valores de menú

getActivity().invalidateOptionsMenu(); 

prueba este trabajo como un amuleto para mí.

1

En caso de tener un Bottombar:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) { 
     getMenuInflater().inflate(R.menu.more_menu, menu); 
    } 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.preferences: 
      startActivity(new Intent(this, PreferenceActivity.class)); 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

continuación, sólo tiene que llamar:

@Override 
public void onBottomBarClick(int tabId) { 
    supportInvalidateOptionsMenu(); 
} 
Cuestiones relacionadas