2012-03-15 6 views
12

Tengo un Activity que extends ActionBarActivity tomado del ejemplo de código ActionBarCompat y estoy tratando de mostrar/ocultar elementos de menú (acciones) en tiempo de ejecución.Android y ActionBarCompat: ¿cómo cambiar la visibilidad de las acciones en el tiempo de ejecución en dispositivos pre-ICS?

He intentado usar setVisible() en el MenuItem y trabaja para ICS, pero en pre-ICS sólo cambiar la visibilidad de los elementos del menú (botón de menú de prensa), mientras que el ActionBar no ser notificado de los cambios en el menú.

¿Alguna solución? ¡Gracias por adelantado!

+2

Sé que esto no responde a su pregunta, pero ¿ha mirado ActionBarSherlock (http://abs.io)? Definitivamente puede cambiar la visibilidad de los elementos del menú en dispositivos pre-ICS. Incluso si no desea cambiar su implementación 'ActionBar', es posible que pueda encontrar la solución en la fuente ActionBarSherlock. – ashughes

+0

Esa es una buena idea. ¿Alguna sugerencia sobre dónde debes mirar? –

Respuesta

4

Éste es cómo lo resolvió:

En ActionBarHelperBase.java de actionbarcompat proyecto

...

private View addActionItemCompatFromMenuItem(final MenuItem item) { 

final int itemId = item.getItemId(); 

....

El creador de esta clase copia propiedades del objeto, pero no copió el id del elemento, por lo que es imposible encontrarlo más adelante con fiven id.

por lo que añade que en ese método:

... 
actionButton.setId(itemId); 
... 

y en la misma clase sólo tiene que utilizar:

@Override 
public void hideMenuItemById(int id, boolean show){ 
    getActionBarCompat().findViewById(id).setVisibility(show? View.VISIBLE: View.GONE); 
} 

espero que le ayuda.

+0

Puede ampliar su respuesta y agregar un poco más de detalle. Intenté esto pero no pude hacerlo funcionar. ¿Hay otros pasos involucrados? –

+0

No se puede llamar al método desde la actividad. Uno solo puede llamar a métodos de ActonBarHelper. No puedo entender cómo debería funcionar este código. – tobias

+0

Consulte el proyecto de demostración para la implementación https://github.com/AlienAsRoger/CourtDeadlines –

5

Creé múltiples alternativas de los elementos de la barra de acciones en/res/menu /. Mantengo un miembro para indicar cuál estoy usando en este momento. para reemplazar el menú, que llamo:

protected void setMenuResource(int newMenuResourceId) 
{ 
    _menuResource = newMenuResourceId; 
    invalidateOptionsMenu(); 
} 

Y puedo reemplazar onCreateOptionsMenu() para:

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    if (_menuResource != 0) 
    { 
     getSupportMenuInflater().inflate(_menuResource, menu); 
     return true; 
    } 
    return super.onCreateOptionsMenu(menu); 
} 

Ahora, si quiero cambiar los elementos de acción, que llamo:

setMenuResource(R.menu.actionbar_menu_X); 
+0

Tenga en cuenta que 'invalidateOptionsMenu()' solo es API 11 y superior. –

+0

Implementado por la biblioteca Sherlock para API 10; también se implementa como getActionBarHelper(). invalidateOptionsMenu() en la biblioteca de compatibilidad. – Steelight

+1

No está implementado en la clase ActionBarHelper. ¿Puedes explicarlo con más detalle? – tobias

Cuestiones relacionadas