2012-05-14 28 views
34

En algunos métodos de mi actividad, deseo verificar el título del menú o saber si está marcado o no. ¿Cómo puedo obtener el menú de la actividad? Necesito algo como this.getMenu()¿Cómo puedo obtener el menú de opciones de mi actividad?

+1

"Nombre" y "Comprobado"? No lo entiendo Id y preferencias? – keyser

+0

¿Estás hablando del menú de opciones? Al igual que el creado en "public boolean onCreateOptionsMenu (Menú menu)"? – MikeIsrael

+0

sí menú de opciones – breceivemail

Respuesta

90

Tenga cuidado con invalidateOptionsMenu(). Recrea el menú completo. Esto tiene una gran cantidad de gastos generales y restablecerá los componentes integrados como el SearchView. Me tomó bastante tiempo rastrear por qué mi SearchView se cerraría "al azar".

Terminé capturando el menú publicado por Dark y luego llamé al onPrepareOptionsMenu(Menu) según sea necesario. Esto cumplió con mi requisito sin efectos secundarios desagradables. Gotcha: asegúrese de hacer una comprobación nula en caso de que llame al onPrepareOptionsMenu() antes de que se cree el menú. Hice esto como a continuación:

private Menu mOptionsMenu; 

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    mOptionsMenu = menu 
    ... 
} 

private void updateOptionsMenu() { 
    if (mOptionsMenu != null) { 
     onPrepareOptionsMenu(mOptionsMenu); 
    } 
} 
+6

Esta es una buena respuesta, y quiero ayudarlo a llegar a 50. :-) –

+0

Respuesta impresionante, por alguna razón no pude averiguar qué menú pasar a onPrepareOptionsMenu () porque quería cambiarlo dependiendo de las condiciones que solo ocurren cuando mi servicio se inicia, etc.De todos modos –

+0

Estoy de acuerdo en que la sobrecarga es demasiado y muy notable si se usa 'invalidateOptionsMenu()'. Preferiría que esta solución use menos carga de trabajo. –

1

Existen varios métodos de devolución de llamada que proporcionan menú como parámetro.

Es posible que desee manipularlo allí.

Por ejemplo:

onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 
onCreateOptionsMenu(Menu menu) 
onCreatePanelMenu(int featureId, Menu menu) 

Hay varios más, mejor que eche un vistazo en la documentación de la actividad y buscar el método que prefiera: http://developer.android.com/reference/android/app/Activity.html

+0

en los valores de su solución no están actualizados – breceivemail

+0

desconoce el comportamiento exacto, pero ¿cree que sería útil guardar la referencia en una variable de campo? Me gusta: onCreateOptionsMenu (Menú menú) {this.menu = menu. . . . y acceder a ella pidiendo el título más tarde? – Ostkontentitan

1

Por lo que pude entender lo que queremos aquí es que puede ayudarle:

1. Consulte este tutorial en option menu.

2. Cada vez que el usuario presiona el botón de menú puede verificar su título a través de getTitle().

3. O si desea conocer el último elemento del menú marcado o seleccionado cuando el usuario no ha presionado el botón de menú, debe almacenar las preferencias cuando el usuario presiona.

11

que podría hacerlo pasando el objeto de menú para su clase de actividad

public class MainActivity extends Activity 
{ 
    ... 
    ... 
    private Menu _menu = null; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     _menu = menu; 
     return true; 
    } 

    private Menu getMenu() 
    { 
     //use it like this 
     return _menu; 
    } 
} 
+1

Llamar invalidateOptionsMenu() es mejor! y solo tiene que proporcionar su actualización en el método onPrepareOptionsMenu (Menú menú). – AntoineP

27

llamada invalidateOptionsMenu() en lugar de pasar alrededor objeto de menú.

+4

Desafortunadamente, agregado en el nivel 11 de API :( – greg7gkb

Cuestiones relacionadas