动态改变ToolBar中的MenuItem
最近项目中开始使用到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接口即可。