2012-03-15 12 views
12

Ho un Activity quello extends ActionBarActivity preso dall'esempio di codice ActionBarCompat e sto cercando di mostrare/nascondere le voci di menu (azioni) in fase di esecuzione.Android e ActionBarCompat: come modificare la visibilità delle azioni in fase di esecuzione sui dispositivi pre-ICS?

Ho provato con setVisible() sulla MenuItem e lavora per ICS, ma in pre-ICS cambia solo la visibilità delle voci di menu (pulsante del menu di stampa), mentre il ActionBar non ricevere la notifica di menu cambia.

Qualsiasi soluzione? Grazie in anticipo!

+2

So che questo non risponde alla tua domanda, ma hai guardato ActionBarSherlock (http://abs.io)? Puoi sicuramente cambiare la visibilità delle voci di menu sui dispositivi pre-ICS. Anche se non si desidera cambiare l'implementazione di ActionBar, è possibile trovare la soluzione nell'origine ActionBarSherlock. – ashughes

+0

Questa è una buona idea. Qualche suggerimento su dove dovresti guardare? –

risposta

4

è così che ho risolto:

In ActionBarHelperBase.java di actionbarcompat progetto

...

private View addActionItemCompatFromMenuItem(final MenuItem item) { 

final int itemId = item.getItemId(); 

....

Il creatore di questa copia della classe proprietà dell'oggetto, ma non ha copiato l'id dell'elemento, quindi è impossibile trovarlo più tardi con id id.

così ho aggiunto in quel metodo:

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

e nella stessa classe mi basta usare:

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

Spero ti aiuta.

+0

Puoi ampliare la tua risposta e aggiungere ulteriori dettagli. Ho provato questo, ma non riuscivo a farlo funzionare. Ci sono altri passaggi coinvolti? –

+0

Impossibile richiamare il metodo dall'attività. Si possono solo chiamare metodi da ActonBarHelper. Non riesco a capire come dovrebbe funzionare questo codice. – tobias

+0

Si prega di consultare il progetto dimostrativo per l'implementazione https://github.com/AlienAsRoger/CourtDeadlines –

5

Ho creato più alternative degli elementi della barra delle azioni in/res/menu /. Tengo un membro per indicare quale sto usando in questo momento. per sostituire il menu, che io chiamo:

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

E sovrascrivo onCreateOptionsMenu() a:

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

Ora, se voglio cambiare gli elementi di azione, che io chiamo:

setMenuResource(R.menu.actionbar_menu_X); 
+0

Si noti che 'invalidateOptionsMenu()' è solo API 11 e superiore. –

+0

E 'implementato dalla libreria Sherlock per API 10; è anche implementato come getActionBarHelper(). invalidateOptionsMenu() nella libreria di compatibilità. – Steelight

+1

Non è implementato nella classe ActionBarHelper. Puoi spiegarlo in modo più dettagliato. – tobias

Problemi correlati