參考
Android ToolBar 使用完全解析
Android開發(fā):最詳細(xì)的 Toolbar 開發(fā)實(shí)踐總結(jié)
Android Material Design之Toolbar與Palette實(shí)踐
ToolBar是Android 5.0推出的一個(gè)新的導(dǎo)航控件用于取代之前的ActionBar,由于其高度的可定制性、靈活性、具有Material Design風(fēng)格等優(yōu)點(diǎn),越來越多的應(yīng)用也用上了ToolBar,比如常用的知乎軟件其頂部導(dǎo)航欄正是使用ToolBar。官方考慮到仍有一部分用戶的手機(jī)版本號(hào)低于5.0,所以,ToolBar也放進(jìn)了support v7包內(nèi),使得低版本的系統(tǒng)也能使用上ToolBar。本文將使用support v7支持包的ToolBar來進(jìn)行講解,包括其基本用法、樣式定制等知識(shí)點(diǎn)。
一、基本用法
1.引入support v7支持包
在你項(xiàng)目的build.gradle內(nèi)輸入如下代碼,即能引入支持包,該支持包內(nèi)有能向下兼容的ToolBar:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
}
2.更改主題
為了能夠正常使用ToolBar,我們需要隱藏原來的ActionBar,這個(gè)可以在主題中修改,在values/styles.xml中做出如下修改:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> </style>
繼承了Theme.Appcompat.Light.NoActionBar主題,這里提一下,這個(gè)Theme.AppCompat是支持包內(nèi)的主題,對(duì)應(yīng)著5.0版本的Theme.Material主題。然后在manifest文件中引用這個(gè)主題。
3.創(chuàng)建控件

activity_main.xml文件中,代碼如下所示:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="標(biāo)題"
android:textSize="20sp"/>
</android.support.v7.widget.Toolbar>
</FrameLayout>
創(chuàng)建了android.support.v7.widget.Toolbar,同時(shí)我們?cè)趦?nèi)部放了一個(gè)TextView,這是與ActionBar最大的不同,因?yàn)門oolBar實(shí)際上是一個(gè)ViewGroup,支持在其內(nèi)部放入子View。
二、Toolbar完善
1.改變ToolBar的顏色
要想改變toolbar的顏色很簡(jiǎn)單,直接在布局文件中添加一個(gè)backgroud屬性指定顏色就可以了,但是為了全局考慮,我們可以這樣:在values/styles.xml文件中做出如下修改:
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#2e8abb</item> <!--淺藍(lán)色-->
<item name="colorPrimaryDark">#3A5FCD</item> <!--深藍(lán)色-->
</style>
</resources>

然后在布局文件中,添加如下屬性:
android:background="?attr/colorPrimary"這樣,就能方便對(duì)每一個(gè)toolbar引用同樣的顏色了,我們先看看現(xiàn)在的效果是怎樣的:

可以看到,顏色已經(jīng)改變,同時(shí)我們注意到,頂部狀態(tài)欄的顏色也變成了深藍(lán)色,這是因?yàn)樘砑恿恕眂olorPrimaryDark”的屬性,使得頂部狀態(tài)欄隨之改變,利用這一特性,我們可以輕松實(shí)現(xiàn)“狀態(tài)欄沉浸”的效果了。當(dāng)然,這只適用于Android 5.0以上,如果在低版本則這個(gè)屬性無(wú)效。
2.添加title、subtitle、logo、導(dǎo)航欄圖標(biāo)

public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title");
toolbar.setSubtitle("SubTitle");
toolbar.setLogo(R.mipmap.ic_launcher);
//設(shè)置導(dǎo)航圖標(biāo)要在setSupportActionBar方法之后
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);
}
}
如果你想修改標(biāo)題和子標(biāo)題的字體大小、顏色等,可以調(diào)用
setTitleTextColor 、 setTitleTextAppearance 、
setSubtitleTextColor 、setSubtitleTextAppearance
當(dāng)然,這些設(shè)置都是支持在xml布局中直接添加的,但是用的不是android:命名空間,而是自定義命名空間,如下所示:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:toolbar="http://schemas.android.com/apk/res-auto"
...>
<android.support.v7.widget.Toolbar
...
toolbar:logo="@mipmap/ic_launcher"
toolbar:title="Title"
toolbar:subtitle="Sub Title"
toolbar:titleTextColor="#ffffff">
</android.support.v7.widget.Toolbar>
</FrameLayout>
3.添加菜單選項(xiàng)
一般導(dǎo)航條,在其右側(cè)都會(huì)有菜單選項(xiàng),當(dāng)然ToolBar也是支持自定義菜單的,首先我們?cè)诓藛挝募?,修改如下:res/menu/menu_main.xml:
<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:title="Search"
android:icon="@mipmap/ic_search"
app:showAsAction="ifRoom"/>
<item android:id="@+id/action_notifications"
android:title="notifications"
android:icon="@mipmap/ic_notifications"
app:showAsAction="ifRoom"/>
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
android:icon="@mipmap/ic_launcher"
app:showAsAction="never"/>
</menu>
app:showAsAction=”ifRoom”/”never”,app是自定義的命名空間,因?yàn)槲覀兊腶ctivity繼承的是AppCompatActivity,是support v7包的,并不是原生sdk內(nèi)部的,因此不能使用android:showAsAction,否則會(huì)報(bào)錯(cuò)。然后ifRoom表示有空間則顯示,never表示從不顯示,而是會(huì)通過overflowwindow顯示。 接著我們?cè)贏ctivity中,要重寫onCreateOptionsMenu()方法,把這個(gè)菜單加載進(jìn)去:
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
添加點(diǎn)擊事件
//設(shè)置導(dǎo)航圖標(biāo)、添加菜單點(diǎn)擊事件要在setSupportActionBar方法之后
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_search:
Toast.makeText(MainActivity.this,
"Search !", Toast.LENGTH_SHORT).show();
break;
case R.id.action_notifications:
Toast.makeText(MainActivity.this,
"Notificationa !", Toast.LENGTH_SHORT).show();
break;
case R.id.action_settings:
Toast.makeText(MainActivity.this,
"Settings !", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
“android:textColorSecondary”屬性對(duì)應(yīng)的就是右上角三個(gè)圓點(diǎn)的顏色了。改變之后將會(huì)變成你要的顏色。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:textColorSecondary">#ffffff</item>
</style>
</resources>
4.其它樣式修改

可以看到右上角的popup menu是白底黑字,那么有沒有什么辦法改變它的背景顏色,使菜單顯示為黑底白字呢呢?答案是有的,我們可以這樣設(shè)置: 首先在styles.xml文件中,新建一個(gè)主題:
<!-- toolbar彈出菜單樣式 -->
<style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
<item name="android:colorBackground">#000000</item>
</style>
可以看到這個(gè)主題的parent是直接繼承自ThemeOverlay.AppCompat.Dark,是支持包的一個(gè)主題,并且我們?cè)趦?nèi)部聲明了“android:colorBackground”這個(gè)屬性,我們只要更改這個(gè)屬性就能變更菜單的背景顏色了。接下來我們?cè)诓季治募幸脒@個(gè)主題,這也很簡(jiǎn)單,為toolbar添加額外的屬性如下:
toolbar:popupTheme="@style/ToolbarPopupTheme"

我們可以看到,popup menu的位置是過于偏上的,我們還可以修改它的位置,使它處于Toolbar之下,這樣看起來可能更美觀: 修改styles.xml文件如下:
<style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
<item name="android:colorBackground">#000000</item>
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
<!--新增一個(gè)item,用于控制menu-->
</style>
<style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
<item name="overlapAnchor">false</item>
<!--把該屬性改為false即可使menu位置位于toolbar之下-->
</style>

二、AppCompatActivity AppCompatDialog
參考
深入剖析Android四大組件(九)——Activity之AppCompatActivity與toolbar的結(jié)合
Android Support Library更新到v22.1之AppCompat新特性
AppcompatActivity源碼淺析
**1.AppCompatActivity **
構(gòu)建一個(gè)可以跑在不同版本 Android 平臺(tái)的軟件,是非常復(fù)雜和耗時(shí)的。為了解決這個(gè)問題,Android 推出了 Android Support Library (安卓兼容包),讓新的UI控件也可以跑在早期的 Android 版本。最近Android Support Library 更新到v22.1,這一版本主要AppCompat做了一些大的調(diào)整。
初期AppCompat只是讓Actionbar兼容到API 7。在AppCompat 21版本中,加入主題色、Toolbar等功能。顯然ActionBarActivity這個(gè)名字已經(jīng)不在適用AppCompat。新版本中,推薦使用AppCompatActivity 代替ActionBarActivity。
2.AppCompatDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Dialog");
builder.setMessage("少數(shù)派客戶端");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

好