今年(2014) 的 Google I/O 發表令多數人為之一亮的 Material Design,而 Google 也從「Google I/O 2014」 開始,大家也陸陸續續地看到其更新的 Android APP 皆套用了這個設計介面。當然,這個設計介面著實讓大家感到驚艷外,更讓 Android 開發者開始擔心未來 APP 的介面處理了。

不過,所幸有著之前 ActionBar 的經驗後,Android 也很快地在 support library 裡面提供了相對應的 API 給開發者使用,本篇就為各位介紹 – Toolbar,這是用來取代過去 ActionBar 的元件,而現在於 material design 中也對之有一個統一名稱:App bar,在未來的 android app 中,就以 Toolbar 這個元件來實作之。

1. 概述


在 Android 3.0 開始 Android 推了 ActionBar 這個介面出來,而到了 2013 年 Google 開始大力地推動所謂的 android style,想要逐漸改善過去 android 紛亂的介面設計,希望讓終端使用者盡可能在 android 手機有個一致的操作體驗。ActionBar 過去最多人使用的兩大套件就是 ActionBarSherlock 以及官方提供在support library v7裡的 AppCompat 中。

既然會有本篇可以跟各位介紹的 Toolbar,也意謂著官方在某些程度上認為 ActionBar 限制了 android app 的開發與設計的彈性,而在 material design 也對之做了名稱的定義:App bar。接下來將為各位分成幾個階段進行說明,如何在 android app app 中用 toolbar 這個元件來做出一個基本的 app bar 嘍。

本篇所使用到的程式碼:toolbar demo check point 0 ~ 4,請到Github 取得。

2. 基礎套用


這個階段從 toolbar_demo_checkpoint0 開始,分成下列三個部份:

  1. 風格 (style)
  2. 介面 (layout)
  3. 程式 (java)

2.1 風格(style)

風格要調整的地方有二,一在 res/values/styles.xml 另一在 /res/values-v21/styles.xml,為了之後設定方便,我們先在 res/values/styles.xml 裡增加一個名為 AppTheme.Base 的風格

 
 
1
2
3
4
<style name="AppTheme.Base" parent="Theme.AppCompat">
  <item name="windowActionBar">false</item>
  <item name="android:windowNoTitle">true</item>
</style>

因為此範例只單純使用 Toolbar,所以我們要將讓原本的 ActionBar 隱藏起來,做了上面的設定,接著將原本 AppTheme 的 parent 屬性 改為 AppTheme.Base,這邊完整的程式碼如下:

 
 
1
2
3
4
5
6
7
8
9
10
11
12
<resources>
 
  <!-- Base application theme. -->
  <style name="AppTheme" parent="AppTheme.Base">
  </style>
  
  <style name="AppTheme.Base" parent="Theme.AppCompat">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
  </style>
 
</resources>

再來調整在 Android 5 的風格檔: /res/values-v21/styles.xml,也將其 parent 屬性改為  AppTheme.Base:

 
 
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
    </style>
</resources>

2.2  介面(Layout)

在 activity_main.xml 裡面加入 Toolbar 元件:

 
 
1
2
3
4
5
6
<android.support.v7.widget.Toolbar
  android:id="@+id/toolbar"
  android:layout_height="?attr/actionBarSize"
  android:layout_width="match_parent" >
 
</android.support.v7.widget.Toolbar>

請記得用 support v7 裡的 toolbar,不然會只有 API Level 21 也就是 Android 5 以上的版本才能使用。

這邊需注意,要將 RelatvieLayout 裡的針對四個方向 padding 屬性拿掉,並記得將原本的 Hello World 設定layout_below="@+id/toolbar" ,否則會看到像下面這樣的錯誤畫面。

2.3 程式 (Java)

請到 MainActivity.java 裡加入 Toolbar 的宣告:

 
 
1
2
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

宣告後,再將之用 setSupportActionBar 設定,即能取代表原本的 actionbar 嘍,此階段完成畫面如下:

完整程式碼請見:toolbar_demo_checkpoint1

3. 調色 (Customization color)


這個階段將從 toolbar_demo_checkpoint1 接著往下進行:

上圖是將本階段要完成的結果畫面做了標示,搭配下述希望讓大家可以一目瞭然。

  1. 狀態列底色: colorPrimaryDark
    在風格 (styles) 或是主題 (themes) 裡進行設定。
  2. App bar 底色
    這個設定分為二,若您的 android app 仍是使用 actionbar 實作,則直接在風格 (styles) 或是主題 (themes) 裡進行設定colorPrimary 參數即可;
    可若是採用 toolbar 的話,則要在介面 (layout) 裡面設定 toolbar 元件的 background 屬性。
  3. 導航列底色:navigationBarColor
    僅能設定在 API v21 也就是 Android 5 以後的版本,因此要將之設定在 res/values-v21/styles.xml 裡面。
  4. 主視窗底色:windowBackground

也因此在這個階段,我們需要設定的地方有三,一是主要風格檔 (res/values/styles.xml)

 
 
1
2
3
4
5
6
7
8
9
10
11
<style name="AppTheme.Base" parent="Theme.AppCompat">
  <item name="windowActionBar">false</item>
  <item name="android:windowNoTitle">true</item>
 
  <!-- Actionbar color -->
  <item name="colorPrimary">@color/accent_material_dark</item>
  <!--Status bar color-->
  <item name="colorPrimaryDark">@color/accent_material_light</item>
  <!--Window color-->
  <item name="android:windowBackground">@color/dim_foreground_material_dark</item>
</style>

再來是 v21 的風格檔 (res/values-v21/styles.xml)

 
 
1
2
3
4
<style name="AppTheme" parent="AppTheme.Base">
  <!--Navigation bar color-->
  <item name="android:navigationBarColor">@color/accent_material_light</item>
</style>

最後,就是為了本篇的主角 – Toolbar 的 background 進行設定。

 
 
1
2
3
4
5
6
7
<android.support.v7.widget.Toolbar
  android:id="@+id/toolbar"
  android:layout_height="?attr/actionBarSize"
  android:layout_width="match_parent"
  android:background="?attr/colorPrimary" >
 
</android.support.v7.widget.Toolbar>

在本範例中,toolbar 是設定來在 activity_main.xml,對其設定 background 屬性: android:background="?attr/colorPrimary" ,這樣就可以使之延用 Actionbar 的顏色設定嘍。

最後,再來看一下結果畫面。

完整程式碼請見: toolbar_demo_checkpoint2

4. 元件 (component)


本階段將從 toolbar_demo_checkpoint2 接續,在還未於<android.support.v7.widget.Toolbar/>  標籤中,自行添加元件的 toolbar 有幾個大家常用的元素可以使用,請先見下圖:

大抵來說,預設常用的幾個元素就如圖中所標示,接著就依序來說明之:

  1. setNavigationIcon
    即設定 up button 的圖示,因應 Material 的介面,在 Toolbar 這裡的 up button 樣示也就有別於過去的 ActionBar 嘍。
  2. setLogo
    APP 的圖示。
  3. setTitle
    主標題。
  4. setSubtitle
    副標題。
  5. setOnMenuItemClickListener
    設定選單各按鈕的動作。

先來看到選單外的程式碼,於 MainActivity.java 撰寫如下的程式碼:

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 
// App Logo
toolbar.setLogo(R.drawable.ic_launcher);
// Title
toolbar.setTitle("My Title");
// Sub Title
toolbar.setSubtitle("Sub title");
 
setSupportActionBar(toolbar);
 
// Navigation Icon 要設定在 setSupoortActionBar 才有作用
// 否則會出現 back button
toolbar.setNavigationIcon(R.drawable.ab_android);

這邊要留意的是 setNavigationIcon  需要撰寫於setSupportActionBar  之後才會生效。

選單的部份,需要先於 res/menu/menu_main.xml 做選單項目的設定:

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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_edit"
        android:title="@string/action_edit"
        android:orderInCategory="80"
        android:icon="@drawable/ab_edit"
        app:showAsAction="ifRoom" />
 
  <item android:id="@+id/action_share"
        android:title="@string/action_edit"
        android:orderInCategory="90"
        android:icon="@drawable/ab_share"
        app:showAsAction="ifRoom" />
 
  <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never"/>
</menu>

再來回到 MainActivity.java 加入 OnMenuItemClickListener 的監聽式

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() {
  @Override
  public boolean onMenuItemClick(MenuItem menuItem) {
    String msg = "";
    switch (menuItem.getItemId()) {
      case R.id.action_edit:
        msg += "Click edit";
        break;
      case R.id.action_share:
        msg += "Click share";
        break;
      case R.id.action_settings:
        msg += "Click setting";
        break;
    }
 
    if(!msg.equals("")) {
      Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
    return true;
  }
};

接監聴式 onMenuItemClick 設定給 toolbar

 
 
1
2
3
4
5
6
setSupportActionBar(toolbar);
 
...
 
// Menu item click 的監聽事件一樣要設定在 setSupportActionBar 才有作用
toolbar.setOnMenuItemClickListener(onMenuItemClick);

和 setNavigationIcon 一樣,需要將之設定在 setSupportActionBar 之後才有作用。以上完成程式碼並執行之,可以看到如下的操作畫面嘍。

完整程式碼請見:toolbar_demo_checkpoint3

5. 總結


在這樣的架構設計下,Toolbar  直接成了 Layout 中大家可以控制的元件,相對於過去的 Actionbar 來說,設計跟操控性大幅度地提升。

本篇以上說明中所使用到的完整程式碼:toolbar demo check point 0 ~ 4,請到 Github 取得。

最後再附上一個介面上常會被設定的風格屬性,請見下圖:

這邊就從上到下做個簡單的整理:

  • colorPrimaryDark

    • 狀態列背景色。
    • 設定在 style 的屬性中。
  • textColorPrimary
    • App bar 上的標題與更多選單中的文字顏色。
    • 設定在 style 的屬性中
  • App bar 的背景色
    • Actionbar 的背景色設定在 style 中的 colorPrimary。
    • Toolbar 的背景色設定其 layout 檔中的 background 的屬性中。
  • colorAccent
    • 各控制元件(如:check box、switch 或是 radoi) 被勾選 (checked) 或是選定 (selected) 的顏色。
    • 設定在 style 的屬性中
  • colorControlNormal
    • 各控制元件的預設顏色。
    • 設定在 style 的屬性中
  • windowBackground
    • App 的背景色。
    • 設定在 style 的屬性中
  • navigationBarColor
    • 導航列的背景色,但只能用在 API Level 21 (Android 5) 以上的版本
    • 設定在 style 的屬性中

6. 補充


在官網的 Issue 中,有人提到這樣的問題,當今天設定  android:minHeight="?attr/actionBarSize" 時,在轉為橫向呈現時,Toolbar 的高度會更得很詭異。所以,將高度的設定  ?attr/actionBarSize 回歸到 height 去,

 
 
1
android:layout_height="?attr/actionBarSize"

這樣的設定即可。而本篇的內容以及範例程式皆已如此更正,還請各位留意一下之後的寫法。

ANDROID – TOOLBAR STEP BY STEP(转)的更多相关文章

  1. ANDROID – TOOLBAR 上的 NAVIGATION DRAWER(转)

    在 Material Design 釋出後,Google 也開始陸續更新了 Google app 的介面,讓大家有個範例可以看.而過去大力推動的 actionbar 自然而然也成了眾開發者觀注的部份: ...

  2. Linux 学习 step by step (2)

      Linux 学习 step by step (2) Linux,想要我说爱你真的不容易了,尽管,你是ubutun,尽管,你有蛮界面.但是,操作你,还是没有操作windows那么的如鱼得水了.为了更 ...

  3. Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1

    摘要: Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1 安装遇到问题请文末留言. 悦动智能公众号:aibbtcom AI这个概念好像突然就 ...

  4. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  5. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  6. Step by step Install a Local Report Server and Remote Report Server Database

    原创地址:http://www.cnblogs.com/jfzhu/p/4012097.html 转载请注明出处 前面的文章<Step by step SQL Server 2012的安装 &g ...

  7. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

  8. Step by step 活动目录中添加一个子域

    原创地址:http://www.cnblogs.com/jfzhu/p/4006545.html 转载请注明出处 前面介绍过如何创建一个域,下面再介绍一下如何在该父域中添加一个子域. 活动目录中的森林 ...

  9. SQL Server 维护计划实现数据库备份(Step by Step)(转)

    SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server  ...

  10. 转:eclipse以及step into step over step return的区别

    首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...

随机推荐

  1. e612. Moving the Focus to the Next or Previous Focusable Component

    The methods to move the focus to the next or to the previous focusable component are Component.trans ...

  2. Linux CPU Load Average

    理解Linux系统负荷 LINUX下CPU Load Average的一点研究 Linux load average负载量分析与解决思路 Understanding Linux CPU Load - ...

  3. Linux入门基础教程之Linux系统简介

    Linux的历史: Multics项目开发不顺利,贝尔实验室退出该项目后,开发了Unix,商业化后价格昂贵.Dennis Ritchie和Ken Thompson开发了Unix内核以及C语言.Andr ...

  4. JSP九大内置对象与Servlet学习笔记[转]

    我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...

  5. Linq 实现两个对象实例List之间的赋值

    public class UserCopy { public class LoginEntity { public string UserName { get; set; } public strin ...

  6. 【Ubuntu】/etc/profile

    export JAVA_HOME=/home/hp/programmefiles/jdk1.8.0_73/export PATH=$JAVA_HOME/bin:$PATHexport SCALA_HO ...

  7. 【Math】矩阵求导

    https://en.wikipedia.org/wiki/Matrix_calculus http://blog.sina.com.cn/s/blog_7959e7ed0100w2b3.html

  8. css实现图片横向排列滚动

    .imageList{ overflow-x: auto; overflow-y: hidden; height:180px; white-space: nowrap; img{ width:auto ...

  9. symfony 事务提交

    1. 添加数据 新建一个对象,给对象赋值 $em = $this->getDoctrine()->getManager(); //添加事物 $em->getConnection()- ...

  10. node.js富文本编辑器

    摘要: 最近在搭建自己的博客,这一段时间可能没有时间来写博客了,但是有了好东西还是要分享给大家.博客网站必然要有编辑文章的编辑器,所以在网上查了些资料.大部分编辑器的后台是基于java.php.asp ...