最近項目中開始使用到ToolBar控件,其中有需求需要動態改變ToolBar中的MenuItem。如下圖:
1、首先想到的辦法是利用ToolBar自帶的方法addView()和removeView().
經測試,動態添加和刪除view沒有點擊效果,需要自己添加,而且如果需要overflow效果,則需要自己實現PopupMenu,所以此方法適用於view比較少的情況。
2、ToolBar是用來替換ActionBar的,用過ActionBar的人應該都熟悉ActionMenuView,使用ActionMenuView配合ToolBar則可以實現動態改變ToolBar中的MenuItem,實際上改變的是ActionMenuView中的item。
1)、在布局文件中把ActionMenuView當作ToolBar的child;
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" style="@style/ToolBar"> <android.support.v7.widget.ActionMenuView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/action_menu_view" android:layout_gravity="right"/> </android.support.v7.widget.Toolbar>
其中style/ToolBar如下:
<style name="ToolBar"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:id">@id/toolbar</item> <item name="android:background">@color/myPrimaryColor</item> <item name="theme">@style/ToolBarTheme</item> <!--貌似無效 --> <item name="popupTheme">@style/ToolBarPopupTheme</item> </style> <style name="ToolBarTheme" parent="ThemeOverlay.AppCompat.Light"> <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item> <item name="android:textColorSecondary">@color/abc_primary_text_material_dark</item> <item name="android:colorBackground">@color/myPrimaryColor</item> </style> <style name="ToolBarPopupTheme" parent="ThemeOverlay.AppCompat.Light"> <item name="android:textColorPrimary">@color/abc_primary_text_material_light</item> <item name="android:textColorSecondary">@color/abc_primary_text_material_light</item> <item name="android:colorBackground">@color/myPrimaryColor</item> </style>
2)、在代碼中,首先在Activity的onCreate()中findview,然后在需要的地方添加MenuItem,和Menu的使用方法一樣;
actionMenuView = (ActionMenuView) findViewById(R.id.action_menu_view); //設置MenuItem點擊事件 actionMenuView.setOnMenuItemClickListener(this); ...... //清除之前的MenuItem actionMenuView.getMenu().clear(); //添加新的MenuItem getMenuInflater().inflate(R.menu.xxx,actionMenuView.getMenu());
效果圖如下:
3)、點擊事件相應:實現ActionMenuView.OnMenuItemClickListener接口即可。