參考
Android ToolBar 使用完全解析
Android開發(fā):最詳細(xì)的 Toolbar 開發(fā)實踐總結(jié)
Android Material Design之Toolbar與Palette實踐
ToolBar是Android 5.0推出的一個新的導(dǎo)航控件用于取代之前的ActionBar,由于其高度的可定制性、靈活性、具有Material Design風(fēng)格等優(yōu)點术浪,越來越多的應(yīng)用也用上了ToolBar,比如常用的知乎軟件其頂部導(dǎo)航欄正是使用ToolBar。官方考慮到仍有一部分用戶的手機(jī)版本號低于5.0速种,所以,ToolBar也放進(jìn)了support v7包內(nèi)低千,使得低版本的系統(tǒng)也能使用上ToolBar配阵。本文將使用support v7支持包的ToolBar來進(jìn)行講解,包括其基本用法示血、樣式定制等知識點棋傍。
一、基本用法
1.引入support v7支持包
在你項目的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告喊,這個可以在主題中修改麸拄,在values/styles.xml中做出如下修改:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> </style>
繼承了Theme.Appcompat.Light.NoActionBar主題,這里提一下葱绒,這個Theme.AppCompat是支持包內(nèi)的主題感帅,對應(yīng)著5.0版本的Theme.Material主題。然后在manifest文件中引用這個主題地淀。
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,同時我們在內(nèi)部放了一個TextView,這是與ActionBar最大的不同实苞,因為ToolBar實際上是一個ViewGroup豺撑,支持在其內(nèi)部放入子View。
二黔牵、Toolbar完善
1.改變ToolBar的顏色
要想改變toolbar的顏色很簡單聪轿,直接在布局文件中添加一個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"
這樣,就能方便對每一個toolbar引用同樣的顏色了金赦,我們先看看現(xiàn)在的效果是怎樣的:
可以看到音瓷,顏色已經(jīng)改變,同時我們注意到夹抗,頂部狀態(tài)欄的顏色也變成了深藍(lán)色绳慎,這是因為添加了”colorPrimaryDark”的屬性,使得頂部狀態(tài)欄隨之改變漠烧,利用這一特性杏愤,我們可以輕松實現(xiàn)“狀態(tài)欄沉浸”的效果了。當(dāng)然已脓,這只適用于Android 5.0以上珊楼,如果在低版本則這個屬性無效。
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.添加菜單選項
一般導(dǎo)航條,在其右側(cè)都會有菜單選項忆矛,當(dāng)然ToolBar也是支持自定義菜單的察蹲,首先我們在菜單文件中请垛,修改如下: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是自定義的命名空間洽议,因為我們的activity繼承的是AppCompatActivity宗收,是support v7包的,并不是原生sdk內(nèi)部的亚兄,因此不能使用android:showAsAction混稽,否則會報錯。然后ifRoom表示有空間則顯示审胚,never表示從不顯示匈勋,而是會通過overflowwindow顯示。 接著我們在Activity中菲盾,要重寫onCreateOptionsMenu()方法颓影,把這個菜單加載進(jìn)去:
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
添加點擊事件
//設(shè)置導(dǎo)航圖標(biāo)、添加菜單點擊事件要在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”屬性對應(yīng)的就是右上角三個圓點的顏色了懒鉴。改變之后將會變成你要的顏色。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:textColorSecondary">#ffffff</item>
</style>
</resources>
4.其它樣式修改
可以看到右上角的popup menu是白底黑字碎浇,那么有沒有什么辦法改變它的背景顏色临谱,使菜單顯示為黑底白字呢呢?答案是有的奴璃,我們可以這樣設(shè)置: 首先在styles.xml文件中悉默,新建一個主題:
<!-- toolbar彈出菜單樣式 -->
<style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
<item name="android:colorBackground">#000000</item>
</style>
可以看到這個主題的parent是直接繼承自ThemeOverlay.AppCompat.Dark,是支持包的一個主題苟穆,并且我們在內(nèi)部聲明了“android:colorBackground”這個屬性抄课,我們只要更改這個屬性就能變更菜單的背景顏色了。接下來我們在布局文件中引入這個主題雳旅,這也很簡單跟磨,為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>
<!--新增一個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)建一個可以跑在不同版本 Android 平臺的軟件,是非常復(fù)雜和耗時的迎变。為了解決這個問題充尉,Android 推出了 Android Support Library (安卓兼容包),讓新的UI控件也可以跑在早期的 Android 版本衣形。最近Android Support Library 更新到v22.1,這一版本主要AppCompat做了一些大的調(diào)整驼侠。
初期AppCompat只是讓Actionbar兼容到API 7。在AppCompat 21版本中,加入主題色泪电、Toolbar等功能般妙。顯然ActionBarActivity這個名字已經(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();
好