2015-01-16 18 views
9

Dato che SplitActionBar non è più supportato in Android 5.0, sto cercando di utilizzare ActionMenuView per ottenere un effetto SplitActionBar. Ma non sono riuscito a trovare molte informazioni su come utilizzare ActionMenuView.Come usare ActionMenuView?

So che posso aggiungere un ActionMenuView nel file di layout, ma non so come aggiungere voci di menu. Non sembra che potrei gonfiarli come faccio con SplitActionBar.

Potrebbe fornire qualche codice di esempio su come utilizzare ActonMenuView? Grazie!

+0

Hai capito? c'è mancanza di risorse su questo. – osayilgan

+0

@osayilgan Ho passato ad altro metodo per questa parte alla fine. Ma puoi dare un'occhiata alla risposta di George. Per favore fatemi sapere se funziona, se così lo segnerei come risposta. Grazie :) – jiu9x9uij

+0

Ho trovato un'altra soluzione utilizzando le risorse del tema Libreria AppCompat. Con determinati attributi, puoi personalizzare ActionView con colori di sfondo, ecc. – osayilgan

risposta

13

La visualizzazione del menu di azione per visualizzare la larghezza di icone di un intero schermo è un lavoro ingrato. Ecco un esempio per fare ciò che vuoi. Assicurati che il tuo oggetto XML ActionMenuView sia wrap_content per altezza e larghezza, quindi gravità a destra. Circondalo in un LinearLayout che prende tutta la larghezza e fornisce il colore di sfondo.

Usa questo codice per inizializzare l'ActionMenuView (ovviamente sarà necessario cambiare i callback pulsante)

 ActionMenuView actionMenuView = (ActionMenuView) findViewById(R.id.editBar); 

     final Context context = this; 
     MenuBuilder menuBuilder = new MenuBuilder(context); 
     menuBuilder.setCallback(new MenuBuilder.Callback() { 
      @Override 
      public boolean onMenuItemSelected(MenuBuilder menuBuilder, MenuItem menuItem) { 
       return onOptionsItemSelected(menuItem); 
      } 

      @Override 
      public void onMenuModeChange(MenuBuilder menuBuilder) { 

      } 
     }); 

     // setup a actionMenuPresenter which will use up as much space as it can, even with width=wrap_content 
     ActionMenuPresenter presenter = new ActionMenuPresenter(context); 
     presenter.setReserveOverflow(true); 
     presenter.setWidthLimit(getResources().getDisplayMetrics().widthPixels, true); 
     presenter.setItemLimit(Integer.MAX_VALUE); 

     // open a menu xml into the menubuilder 
     getMenuInflater().inflate(R.menu.editbar, menuBuilder); 

     // runs presenter.initformenu(mMenu) too, setting up presenter's mmenu ref... this must be before setmenuview 
     menuBuilder.addMenuPresenter(presenter, this); 

     // runs menuview.initialize too, so menuview.mmenu = mpresenter.mmenu 
     actionMenuView.setPresenter(presenter); 

     presenter.updateMenuView(true); 

Per quello che vale, ho dovuto leggere il codice di supporto sorgente della libreria per 8 ore per arrivare a questo lavoro. La documentazione è spazzatura.

+5

Questo metodo non funzionerà più perché ActionMenuPresenter è ora privato nella libreria di supporto. –

1

Se si utilizza la libreria appCompat v7, assicurarsi che l'attività si estenda da ActionBarActivity e che si utilizzi la versione di supporto di ActionMenuView.

Allo stesso modo, se non si utilizza la libreria di supporto, assicurarsi di utilizzare ActionMenuView all'esterno della libreria di supporto.

Da lì si può ottenere il ActionMenuView dal layout e popolare il suo menu utilizzando il seguente metodo:

getMenuInflater().inflate(R.menu.your_menu_here, actionMenuView.getMenu())

Se non si è in un'attività in cui getMenuInflater() è accessibile creare il proprio MenuInflater o SupportMenuInflater .

9

Sembra che l'API sia cambiata nel frattempo. Attualmente, il seguente codice funziona:

ActionMenuView actions = new ActionMenuView(activity); 

    MenuBuilder menuBuilder = (MenuBuilder) actions.getMenu(); 

    menuBuilder.setCallback(new MenuBuilder.Callback() { 
     @Override 
     public boolean onMenuItemSelected(MenuBuilder menuBuilder, MenuItem menuItem) { 
      return onOptionsItemSelected(menuItem); 
     } 

     @Override 
     public void onMenuModeChange(MenuBuilder menuBuilder) { 
     } 
    }); 

    inflater.inflate(R.menu.my_menu, menuBuilder); 
+0

Ok grazie, ma sai come impostare il numero di elementi visibili? – Solidus0815

0

In appcompat-v7:27.0.2, il ActionMenuView richiede una larghezza minima di 56dp. Non utilizzare android:layout_width="wrap_content".

Se il tema popup viene ignorato, assicurati di chiamare setPopupTheme(int) prima di qualsiasi chiamata a getMenu() su ActionMenuView.