注意: 必须先 setSupportActionBar(mToolbar). setDisplayHomeAsUpEnabled(true)是ActionBar的方法. setNavigationOnClickListener()必须要在setSupportActionBar()之后调用才能生效. 因为setSupportActionBar(Toolbar),会将Toolbar转换成Acitionbar.点击监听也会重新设置.
在menu布局文件中指定单独的布局,app:actionLayout="@layout/broad_menu_filtrate" 具体的menu布局文件和组件布局文件如下:
<!-- menu布局文件 --> <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/item_filtrate" android:icon="@drawable/ic_search_white_36dp" android:title="筛选" app:showAsAction="ifRoom" app:actionLayout="@layout/broad_menu_filtrate"> </item> <item android:id="@+id/item_add" android:icon="@drawable/ic_add_white" android:title="添加广播" app:showAsAction="always|withText"> <menu> <item android:id="@+id/item_add_1" android:title="添加应急广播" app:showAsAction="never" /> <item android:id="@+id/item_add_2" android:title="添加日常广播" android:actionLayout="@layout/toolbar_text_view" app:showAsAction="never" /> <item android:id="@+id/item_add_3" android:title="添加演练广播" app:showAsAction="never" /> <item android:id="@+id/item_add_4" android:title="创建实时广播" app:showAsAction="never" /> </menu> </item> </menu> <!-- broad_menu_filtrate.xml布局文件 --> <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="@dimen/dp_10" android:paddingRight="@dimen/dp_10" android:gravity="center" android:text="筛选" android:drawableLeft="@drawable/ic_search_white_36dp" android:textColor="@color/c_ffffff" android:textSize="@dimen/dp_18" android:clickable="true" />在onCreateOptionsMenu()和onOptionsItemSelected()方法创建菜单,注册菜单选项点击事件
private void initToolBar() { setHasOptionsMenu(true); // 设置支持option menu,否则导航菜单item注册的点击事件无效 ((HostActivity) getActivity()).setSupportActionBar(toolbar); // 支持工具栏的菜单,它填充了活动的选项菜单和导航按钮 toolbar.setNavigationOnClickListener(v -> getHostActivity().openRightLayout()); toolbar.inflateMenu(R.menu.broad_toolbar_menu); toolbar.setOnMenuItemClickListener(item -> { switch (item.getItemId()) { case R.id.item_add_1: startCreateDialog(Config.EmergenciesFragmentCode); break; case R.id.item_add_2: startCreateDialog(Config.EverydayFragmentCode); break; ... } return false; }); } @Override public boolean onOptionsItemSelected(MenuItem item) { new BroadFiltrationDialog(mContext, () -> { requestJson = getRequestJson(); requestData(requestJson); refreshLayout.autoRefresh(); }); return false; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.broad_toolbar_menu, menu); final MenuItem filtrateItem = menu.findItem(R.id.item_filtrate); filtrateItem.getActionView().setOnClickListener(v1 -> { onOptionsItemSelected(filtrateItem); }); super.onCreateOptionsMenu(menu, inflater); }但如果是viewpager+多frgament这种.会造成错乱.其他的frgament也会有menu的style配置无效 直接代码设置示例如下,以下代码在setSupportActionBar()之前调用。
//设置popupstyle.比如是否覆盖描点,背景,字体颜色什么的.必须在inflateMenu()之前设置 mToolbar.setPopupTheme(R.style.popup_theme); //用Toolbar创建menu mToolbar.inflateMenu(R.menu.main_home_menu); //拿到Menu Menu menu = mToolbar.getMenu(); //下面的这段代码是为了让menu菜单折叠样式时,展开能显示icon图标.不然icon图标不会显示. if (menu != null) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { try { MenuBuilder menuBuilder = (MenuBuilder) menu; menuBuilder.setOptionalIconsVisible(true); } catch (Exception e) { e.printStackTrace(); } } }style的使用
style="@style/base_toolbar"app:theme ------------------toolbar的主题 app:popupTheme------------弹出的menu的主题.
这两种style都继承的是ThemeOverlay.AppCompat
<style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark"> <item name="android:colorBackground">#1B2F36</item> <!--这里可以改变菜单的背景色--> <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item><!--新增一个item,用于控制menu--> <item name="android:textColor">@android:color/white</item> <item name="android:textSize">@dimen/dp_18</item> </style> <style name="toolbar_theme" parent="@style/ThemeOverlay.AppCompat.Light"> <!--修改toolbar的Title(大标题)颜色--> <item name="android:textColorPrimary">@android:color/white</item> <!--修改toolbar的subtitle(小标题)颜色--> <item name="subtitleTextColor">@android:color/white</item> <!--修改toolbar的图标颜色.--> <item name="colorControlNormal">@android:color/white</item> <item name="android:textColor">@android:color/white</item> <item name="android:textSize">@dimen/dp_18</item> </style>如果使用的是Dark系列的主题,那么字体就是白色的.menu菜单背景是黑色 如果使用的是Light系列的主题,那么字体和图标就是黑色的.menu菜单背景是白色
默认显示位置 可以直接在app:popupTheme的style里面设置overlapAnchor这个属性。但是,一定是要在app:popupTheme的style里面设置,而不是app:theme的style里面设置。
<!--设置不覆盖锚点--> <style name="popup_theme" parent="@style/ThemeOverlay.AppCompat.Light"> <item name="overlapAnchor">false</item> </style> <!-- ToolBar菜单样式.--> <style name="popup_theme" parent="@style/ThemeOverlay.AppCompat.Light"> <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item> </style> <style name="OverflowMenuStyle"parent="Widget.AppCompat.Light.PopupMenu.Overflow"> <item name="overlapAnchor">false</item> </style>参考文章: Toolbar设置详解----掉坑总结 动态更新Toolbar Menu以及Menu中同时显示文字和图标