Android - Toolbar初体验

一、概述

配合Android L的发布,Google还更新了Appcombat V7库,新加入了代替现有ActionBar机制的控件——Toolbar,不像以前ActionBar是frameworks封装好提供接口调用的一套应用界面组成部分,它牵涉的东西很多,而Toolbar只是一个控件,和LinearLayout一样可以装载view的容器控件,所以它定制性非常强灵活度非常高,但它又加入了实现现有ActionBar功能的逻辑,感觉非重强大。接下来,我们一起来看看这个新生代Toolbar的使用方法。

二、使用总概

Toolbar在Appcombat V7库是一个公开的控件,位于android.support.v7.widget包中,继承自ViewGroup,所以我们可以像使用普通的容器控件一样使用Toolbar,并主动调用相关方法实现ActionBar的功能。但是,Google是希望在Appcombat V7库中使用Toolbar来代替现有ActionBar的实现,所以肯定不会仅仅提供个控件就好了,Appcombat V7还把Toolbar封装进默认的Activity中。在新建工程时,创建向导会默认导入Appcombat V7库,自动创建的Activity也会继承自对Toolbar封装过的ActionBarActivity,创建工程后立刻运行应用,此时已是Toolbar实现了ActionBar的功能。

导入Appcombat V7库:
1
2
3
dependencies {
compile 'com.android.support:appcompat-v7:21.0.3'
}

android.support.v7.widget.ActionBarActivity

  • Actionbar
1
2
3
4
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("Title");
actionBar.setSubtitle("subtitle");
actionBar.setLogo(R.drawable.ic_launcher);
  • Toolbar
1
2
3
4
Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar);
toolbar.setTitle("Title");
toolbar.setSubtitle("subtitle");
toolbar.setLogo(R.drawable.ic_launcher);

SupportActionBar是由Toolbar实现,而Toolbar又是公开的,所以上面两种方式的等价的。

自行指定Toolbar

定义主题

1
2
3
4
5
6
7
<style name= "AppTheme.Base" parent= "Theme.AppCompat" >
<item name= "colorPrimary">@color/accent_material_dark</item>
<item name= "colorPrimaryDark">@color/accent_material_light</item>
<item name= "windowActionBar">false</item>
<item name= "android:windowNoTitle">true</item>
<item name= "android:windowBackground">@color/dim_foreground_material_dark</item>
</style>

XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<RelativeLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/actionbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize" />
<RelativeLayout
android:id="@+id/x"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_below="@id/actionbar">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:text="@string/hello_world"
android:textColor="@drawable/textbg" />
</RelativeLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/split_actionbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
</RelativeLayout>

使用

1
2
3
4
5
6
7
8
9
10
11
12
Toolbar toolbar = (Toolbar) findViewById(R.id.actionbar);
setSupportActionBar(toolbar);
Toolbar splitToolbar = (Toolbar) findViewById(R.id.split_actionbar);
splitToolbar.inflateMenu(R.menu.menu_main);
splitToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// Handle the menu item
return true;
}
});

一个界面可以绑定多个Toolbar, Toolbar也可以单独绑定menu非常方便

推荐阅读: https://chris.banes.me/2014/10/17/appcompat-v21/

Gavin Liu wechat
欢迎您扫一扫上面的二维码,订阅我的微信公众号!