toolbar整理

效果图:

toolbar整理_第1张图片

前提是要将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));
五:添加toolbar 右边的 icon 和弹出菜单
    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"/>


你可能感兴趣的:(toolbar整理)