效果图:
前提是要将activity设置为noactionbar的style,否则会报错
源码中可以看到 会先判断有没有actionbar。
@Override public void setSupportActionBar(Toolbar toolbar) { if (!(mOriginalWindowCallback instanceof Activity)) { // Only Activities support custom Action Bars return; } // 如果activity已经存在 actionbar 就会抛异常 final ActionBar ab = getSupportActionBar(); if (ab instanceof WindowDecorActionBar) { throw new IllegalStateException("This Activity already has an action bar supplied " + "by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set " + "windowActionBar to false in your theme to use a Toolbar instead."); }
。。。
// 将由toolbar创建的 actionbar 赋值给 actionbar
final ToolbarActionBar tbab = new ToolbarActionBar(toolbar, ((Activity) mContext).getTitle(), mAppCompatWindowCallback); mActionBar = tbab;
}
一:创建toolbar的布局文件
xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:toolbar="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:fitsSystemWindows="true" android:minHeight="?attr/actionBarSize" android:theme="@style/ToolBarStyle" toolbar:subtitle="subtitle"> // 添加此控件 可以在 toolbar 中间的问题显示标题 <TextView android:id="@+id/tv_center_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="ToolBar" android:textColor="@android:color/white" android:textSize="20sp"/> android.support.v7.widget.Toolbar>
二:创建toolbar的style
<style name="ToolBarStyle" parent="@style/ThemeOverlay.AppCompat.Dark"> <item name="android:textColorSecondary">#ffffffitem> <item name="android:colorBackground">#aa333333item> <item name="android:actionOverflowButtonStyle">@style/OverflowButtonStyleitem> <item name="actionOverflowMenuStyle">@style/OverflowMenuStyleitem> style> <style name="OverflowButtonStyle" parent="@android:style/Widget.ActionButton.Overflow"> <item name="android:src">@android:drawable/ic_deleteitem> style>--> <style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow"> <item name="overlapAnchor">falseitem> <item name="android:dropDownWidth">wrap_contentitem> <item name="android:paddingRight">5dpitem> <item name="android:dropDownVerticalOffset">2dpitem> <item name="android:dropDownHorizontalOffset">-2dpitem> <item name="android:popupBackground">@android:color/darker_grayitem> <item name="android:textColor">@android:color/whiteitem> style>
三:创建toolbar menu资源
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="搜索" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView"/> <item android:id="@+id/action_edit" android:icon="@android:drawable/ic_menu_edit" android:title="编辑" app:actionLayout="@layout/menu_action_album_edit" app:showAsAction="ifRoom"/> <item android:id="@+id/action_share" android:icon="@android:drawable/ic_menu_share" android:title="分享" app:showAsAction="ifRoom"/> <item android:id="@+id/action_settings" android:icon="@android:drawable/ic_menu_add" android:title="设置" app:showAsAction="never"/> menu>
四:在activity中添加代码:
1.在activity布局文件中包含toolbar
<include layout="@layout/toolbar"/>// 这一段代码将toolbar 添加到activity中的actionbar中
mToolbar = (Toolbar) findViewById(R.id.toolbar); mTvCenterTitle = (TextView) mToolbar.findViewById(R.id.tv_center_title); setSupportActionBar(mToolbar);
2.下面可以对 toolbar 进行设置
// 1.设置左上角 icon mToolbar.setNavigationIcon(android.R.drawable.ic_menu_close_clear_cancel); // 2.设置 logo mToolbar.setLogo(android.R.drawable.ic_dialog_email); // 3.设置 title
mToolbar.setTitle("2");// 不生效/* setTitle() getTitle() 改变的是activity 设置的 label 对应的 title
通过下面两个方法解决 toolbar setTitle不生效的问题 1.在setSupportActionBar(titletoolbar);之前调用ToolBar的setTitle方法。 2.在Activity的onResume周期中调用。
*/ // 4.设置 subTitle mToolbar.setSubtitle("3"); // 5.设置 toolbar 背景颜色 mToolbar.setBackgroundColor(getResources().getColor(R.color.black));也可以通过supportActionBar设置
ActionBar supportActionBar = getSupportActionBar();
// 1.设置左上角 icon 是否显示
supportActionBar.setDisplayHomeAsUpEnabled(true);
// 2.设置左上角 icon
supportActionBar.setHomeAsUpIndicator(android.R.drawable.
ic_menu_close_clear_cancel);
// 3.设置logo
supportActionBar.setLogo(android.R.drawable.
ic_dialog_email);
// 4.设置Title
supportActionBar.setTitle(
"2");
// 有效
// 5.设置subTitle
supportActionBar.setSubtitle(
"3");
// 6.设置toolbar背景资源
supportActionBar.setBackgroundDrawable(getResources().getDrawable(R.mipmap.
ic_launcher));
1.重写 onCreateOptionsMenu 方法 来加载菜单资源
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return super.onCreateOptionsMenu(menu); }
2./**
* 屏蔽掉物理Menu键,不然在有物理Menu键的手机上,overflow按钮会显示不出来。 * onCreate()方法中调用 */ private void setOverflowShowingAlways() { try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class .getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } catch (Exception e) { e.printStackTrace(); } }
3.
/**
* 弹出menu中 同时显示文字和icon 注释掉则只显示文字不显示icon
* @param
view
* @param
menu
* @return
*/
@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
if (menu !=
null) {
if (menu.getClass() == MenuBuilder.
class) {
try { Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.
TYPE); m.setAccessible(
true); m.invoke(menu,
true); }
catch (Exception e) { } } }
return super.onPrepareOptionsPanel(view, menu); }
4.菜单icon的点击事件处理方法
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); break; case R.id.action_edit: break; case R.id.action_search: break; case R.id.action_settings: break; case R.id.action_share: break; } return super.onOptionsItemSelected(item); }
5.如果想在toolbar上既显示文字有显示icon可以在menu的布局文件中添加下面这句话
app:actionLayout="@layout/menu_action_album_edit"
menu_action_album_edit的布局文件定义如下:
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:clickable="true" android:drawableLeft="@android:drawable/ic_menu_edit" android:gravity="center" android:paddingLeft="10dip" android:paddingRight="10dip" android:text="编辑" android:textColor="@android:color/black"/>