Toolbar 在项目中的基本使用

基本说明

Toolbar已经出现很久了,Toolbar主要比ActionBar支持了更多常用特性。例如:导航按钮,品牌logo图片,标题,子标题等等。

然而他是长这个样子的:

《Toolbar 在项目中的基本使用》 Toolbar

正常项目要求都是这样的

《Toolbar 在项目中的基本使用》 1.png

不管怎么样,我们先来熟悉下Toolbar的使用。以下文字来源于android api官网
简单说明:

您应使用支持库的 Toolbar 类来实现 Activity 的应用栏。使用支持库的工具栏有助于确保您的应用在最大范围的设备上保持一致的行为。例如,Toolbar 小部件能够在运行 Android 2.1(API 级别 7)或更高版本的设备上提供 Material Design 体验,但除非设备运行的是 Android 5.0(API 级别 21)或更高版本,否则原生操作栏不会支持 Material Design。
那我们就根据项目来设置一下

步骤简述:
1 在build.gradle加入如下依赖

  compile 'com.android.support:appcompat-v7:24.2.1'

2 app使用的主题要为无ActionBar主题

直接使用系统的(正常不这么干)

<application
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"
    />

继承系统的,正常这么干 在styles文件夹下

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>  //很重要
        <item name="windowNoTitle">true</item>     //很重要
    </style>

然后manifests里这样写

<application
    android:theme="@style/AppTheme"
    />

3 在activiy的xml布局里加入Toolbar

 <android.support.v7.widget.Toolbar
   android:id="@+id/my_toolbar"
   android:layout_width="match_parent"
   android:layout_height="?attr/actionBarSize"
   android:background="?attr/colorPrimary"
   android:elevation="4dp"
   android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
   app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

4 然后就可以绑定了,在Activity的onCreate加入如下方法

import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);//找到toolbar
    setSupportActionBar(myToolbar);//把toolbar和原来的actionbar关联起来

    //以后要对toolbar进行操作的时候需要使用getSupportActionBar(),例如:

    getSupportActionBar().setDisplayShowTitleEnabled(false);//不显示标题
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示左边的Home图标为返回按钮

    }
}

正常项目使用

1 设置返回按钮

    myToolbar.setNavigationIcon(R.drawable.ic_left_arrow);  //这个ic_left_arrow就是自定义的返回按钮,

2 监听用户点击返回按钮,只需要复写Activity的onOptionsItemSelected()

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
          case android.R.id.home: //这个就是toolbar的返回按钮空间的id
              onBackPressed();
              break;
      }
      return true; //告诉系统我们自己处理了点击事件
  }

3 设置标题
系统的标题是居左的,我们需要的是居中的,只需要添加一个居中子TextView

<android.support.v7.widget.Toolbar
  android:id="@+id/my_toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  android:background="?attr/colorPrimary"
  android:elevation="4dp"
  android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
  app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

  <TextView
    android:id="@+id/tv_title"
    style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center" />

</android.support.v7.widget.Toolbar>

然后只需要

TextView title = (TextView) findViewById(R.id.tv_title);
title.setText("标题");//直接设置标题就可以了

4 设置菜单
设置菜单需要重写activity的onCreateOptionsMenu()方法

  <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">

    <item
      android:id="@+id/menu_text_1"
      android:title="菜单1"
      app:showAsAction="always" />
    <item
      android:id="@+id/menu_text_2"
      android:title="菜单2"
      app:showAsAction="always" />
</menu>

R.menu.menu_test在res的menu文件夹下

@Override
  public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.menu_test, menu);
      return true;
  }

这样有两个文字菜单按钮的toolbar就出现了,
点击事件的响应也和返回按钮的响应一样

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
          case android.R.id.home: //这个就是toolbar的返回按钮空间的id
              onBackPressed();
              break;
          case R.id.menu_text_2:
              //做一些事
              break;
          case R.id.menu_text_2:
              //做一些事
              break;
      }
      return true; //告诉系统我们自己处理了点击事件
  }

《Toolbar 在项目中的基本使用》 1.png

现在我们显示图片和文字混合的toolbar

<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=".view.activity.NormalDetailActivity">


  <item
  android:id="@+id/menu_text_1"
  android:title="菜单1"
  app:showAsAction="always" />


  <item
      android:id="@+id/menu_img"
      android:title="img菜单"
      android:icon="@drawable/icon_share_blue"
      app:showAsAction="always" />
</menu>

《Toolbar 在项目中的基本使用》 2.png

产品经理说这样还不行,我们需要有checkbox,用户要添加收藏

<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=".view.activity.NormalDetailActivity">
  <item
      android:id="@+id/menu_checkbox"
      android:title="checkbox"
      app:actionViewClass="android.support.v7.widget.AppCompatCheckBox"
      app:showAsAction="always" />

  <item
      android:id="@+id/menu_img"
      android:title="img菜单"
      android:icon="@drawable/icon_share_blue"
      app:showAsAction="always" />

</menu>

这样checkbox就出来了

《Toolbar 在项目中的基本使用》 3.png
《Toolbar 在项目中的基本使用》 4.png

这样肯定不过关,然后我们用代码把checkbox的样式修改下

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_test, menu);

        //找到checkbox设置下样式
        AppCompatCheckBox checkbox = (AppCompatCheckBox) menu.findItem(R.id.menu_checkbox).getActionView();
        checkbox.setButtonDrawable(R.drawable.selector_favour);
        checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                //响应消息
            }
        });
        return true;
    }

selector_favour如下

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_favorite_selected" android:state_checked="true"/>
    <item android:drawable="@drawable/ic_favorite_normal" android:state_checked="false"/>
    <item android:drawable="@drawable/ic_favorite_normal" />
</selector>

这样大概符合各种需求了吧

《Toolbar 在项目中的基本使用》 5.png
《Toolbar 在项目中的基本使用》 6.png

5 修改菜单文字颜色

从上面看我们的菜单文字颜色是黑色的,可是图标都是绿的,肯定要统一颜色。

修改toolbar的style中actionMenuTextColor属性

  <style name="ToolbarStyle" parent="ThemeOverlay.AppCompat.ActionBar">
      <item name="actionMenuTextColor">@color/blue</item>
  </style>

然后修改toolbar的android:theme为我们刚刚定义的

   <android.support.v7.widget.Toolbar
     android:id="@+id/my_toolbar"
     android:layout_width="match_parent"
     android:layout_height="?attr/actionBarSize"
     android:background="?attr/colorPrimary"
     android:elevation="4dp"
     android:theme="@style/ToolbarStyle"
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

这样样式就统一了

《Toolbar 在项目中的基本使用》 7.png

最后罗嗦一句,这个toolbar还是不好用,我现在用自己写的。_

    原文作者:jeffrey要努力
    原文地址: https://www.jianshu.com/p/935a8f4f4d87
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞