2014-10-26 49 views
1

溢出菜單在我的應用程序自定義按鈕欄,我想表明的是LinearLayout擴大在屏幕的整個寬度的一些按鈕。根據屏幕尺寸和/或方向的不同,我想要隱藏那些不符合該行的按鈕,在某些OverflowMenu中,類似於ActionBar的行爲。如果可能,我想用ifRoom|always屬性描述menu resource file中的按鈕。與Android的

我認爲從最新的AppCompat庫中顯示一個Toolbar,但包含的元素太多,我不需要,也不知道如何關閉。

有沒有一些庫或簡單的方法來做到這一點?

回答

4

ActionMenuViewToolbar的一部分,它專門控制工具欄的動作和溢出部分。你的情況,你可以使用一個ActionMenuView單獨落實就在工具欄的動作/溢出部分:

  1. 添加ActionMenuView到適當的地方在你的XML佈局
  2. 檢索MenuInflater(最簡單的方法就是通過一個活動的getMenuInflater()方法
  3. 呼叫menuInflater.inflate(R.menu.your_menu, actionMenuView.getMenu())膨脹你的菜單到ActionMenuView
+0

這聽起來很完美。但是,雖然使用工具欄可以在溢出菜單按鈕旁看到一些按鈕,但如果將「工具欄」更改爲「ActionMenuView」,則看不到任何內容。沒有任何錯誤或任何內容,只需在顯示菜單的地方留出空白。 – janoliver 2014-10-26 16:30:01

+0

確保您的ActionMenuView至少有56x56dp的空間。似乎是當前版本的一個錯誤,如果給定的空間小於它將不顯示任何東西 – ianhanniballake 2014-10-26 16:33:09

+0

正確的,現在我看到了一些東西 - 它只在寬度不是match_parent時才起作用,但是例如wrap_content '。如果是後者,則只會看到兩個按鈕和溢出按鈕的三個點,就像出現在「工具欄」中一樣。有什麼我可以破解,使其變得更寬,並顯示更多的按鈕? (它在橫向模式下顯示一個按鈕:)) – janoliver 2014-10-26 16:38:39

4

這裏是做你想做的一個例子。請確保您ActionMenuVie w XML項目是用於高度和寬度的wrap_content,然後是重心向右。將其包圍在一個LinearLayout中,該LinearLayout採用整個寬度並提供背景顏色。

使用此代碼初始化ActionMenuView(顯然,你需要更改按鈕回調)

 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); 

對於它的價值,我不得不讀的支持庫源代碼,8小時,以得到這個工作。文檔是垃圾。

+2

作爲這個答案的更新:移至appcompat 23.1.1我必須黑客有點進口,而且看起來ActionMenuPresenter現在已經包在本地...... 所以我不得不創建一個android.support.v7。Widget封裝在我的項目中,並添加一個PublicActionMenuPresenter類,如下所示: 'public class PublicActionMenuPresenter extends ActionMenuPresenter {public_MenuPresenter(Context context){ super(context); }' 並使用它來代替ActionMenuPresenter – 2015-11-25 11:08:51