Android ToolBar 使用完全解析

ToolBar簡介

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)。

ToolBar的基本使用

引入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'
}

更改主題

為了能夠正常使用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è)主題萍倡。

在布局文件中創(chuàng)建這個(gè)控件身弊,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涨冀。ok,我們運(yùn)行程序麦萤,得到如下結(jié)果:


結(jié)果1.png

可以看出ToolBar正常顯示鹿鳖,當(dāng)然了,這只是最簡單的用法壮莹,接下來我們逐步添加內(nèi)容翅帜、樣式,使它看起開更加美命满,功能更加完善涝滴。

ToolBar的完善

一、首先我們考慮胶台,改變ToolBar的顏色

要想改變toolbar的顏色很簡單歼疮,直接在布局文件中添加一個(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)在的效果是怎樣的:

結(jié)果2.png

可以看到赡矢,顏色已經(jīng)改變,同時(shí)我們注意到阅仔,頂部狀態(tài)欄的顏色也變成了深藍(lán)色吹散,這是因?yàn)樘砑恿?colorPrimaryDark"的屬性,使得頂部狀態(tài)欄隨之改變八酒,利用這一特性空民,我們可以輕松實(shí)現(xiàn)“狀態(tài)欄沉浸”的效果了。當(dāng)然丘跌,這只適用于Android 5.0以上袭景,如果在低版本則這個(gè)屬性無效。這里再附上一張圖(圖片來自http://blog.csdn.net/bbld_/article/details/41439715):
樣式說明

根據(jù)圖中的說明闭树,我們可以輕松地在styles.xml文件中定制我們的樣式耸棒,如果想要改變toolbar的title、subtitle以及menu中文字的顏色报辱,可以利用“textColorPrimary”屬性等与殃。

二、添加title、subtitle幅疼、logo米奸、導(dǎo)航欄圖標(biāo)

在MainActivity文件先獲取控件的實(shí)例,接著通過一系列的set方法即可設(shè)置爽篷,代碼如下:

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);
    }

}

結(jié)果如下:

結(jié)果3.png

如果你想修改標(biāo)題和子標(biāo)題的字體大小悴晰、顏色等,可以調(diào)用 setTitleTextColor 逐工、 setTitleTextAppearance 铡溪、 setSubtitleTextColorsetSubtitleTextAppearance 這些API泪喊。當(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>

三、添加菜單選項(xiàng)圖標(biāo)及點(diǎn)擊事件

1.添加菜單選項(xiàng)圖標(biāo)

一般導(dǎo)航條蚓再,在其右側(cè)都會(huì)有菜單選項(xiàng)滑肉,當(dāng)然ToolBar也是支持自定義菜單的,首先我們?cè)诓藛挝募卸酝荆薷娜缦拢簉es/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>

這里用了這樣一個(gè)熟悉: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;
}

2.添加點(diǎn)擊事件

菜單有了,我們要為菜單添加點(diǎn)擊事件柒凉,這樣菜單才會(huì)有實(shí)際用途,添加點(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;
            }
        });

結(jié)果如下:


結(jié)果5.png

可以看到膝捞,菜單選項(xiàng)圖標(biāo)正常顯示坦刀,以及點(diǎn)擊事件都正常觸發(fā),但是還有一點(diǎn)瑕疵的地方,那就是右上角的三個(gè)圓點(diǎn)鲤遥,是黑色的沐寺,與圖標(biāo)格格不入,有沒有什么辦法改變它呢盖奈?答案是有的混坞,可以通過添加樣式改變,如下所示:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:textColorSecondary">#ffffff</item>
    </style>
</resources>

"android:textColorSecondary"屬性對(duì)應(yīng)的就是右上角三個(gè)圓點(diǎn)的顏色了钢坦。改變之后將會(huì)變成你要的顏色拔第。

四、其他樣式修改

修改Toolbar popup menu樣式

我們先點(diǎn)擊右上角的三個(gè)點(diǎn)场钉,會(huì)彈出一個(gè)popup menu蚊俺,如下所示:


結(jié)果6.png

可以看到右上角的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è)主題,這也很簡單闲坎,為toolbar添加額外的屬性如下:

toolbar:popupTheme="@style/ToolbarPopupTheme"

這樣疫粥,改幾行代碼即可修改popup menu的背景顏色了,如下面所示:


結(jié)果7.png

修改Toolbar popup menu 彈出位置

我們可以看到腰懂,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>

效果如下圖:


結(jié)果8.png

那么到目前為止,對(duì)于toolbar的相關(guān)使用意見講述完畢怖喻,可以看出toolbar的靈活性很高底哗,能自定義很多樣式,我們平常開發(fā)也會(huì)遇到各種不同的樣式锚沸,因此toolbar用于取代actionbar是非常合適的跋选。以后如果還有遇到別的樣式,我也會(huì)分享出來咒吐,謝謝野建。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末属划,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子候生,更是在濱河造成了極大的恐慌同眯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唯鸭,死亡現(xiàn)場(chǎng)離奇詭異须蜗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)目溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門明肮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缭付,你說我怎么就攤上這事柿估。” “怎么了陷猫?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秫舌,是天一觀的道長。 經(jīng)常有香客問我绣檬,道長足陨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任娇未,我火速辦了婚禮墨缘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘零抬。我一直安慰自己镊讼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布媚值。 她就那樣靜靜地躺著狠毯,像睡著了一般护糖。 火紅的嫁衣襯著肌膚如雪褥芒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天嫡良,我揣著相機(jī)與錄音锰扶,去河邊找鬼。 笑死寝受,一個(gè)胖子當(dāng)著我的面吹牛坷牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播很澄,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼京闰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颜及!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹂楣,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤俏站,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后痊土,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肄扎,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赁酝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了犯祠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酌呆,死狀恐怖衡载,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隙袁,我是刑警寧澤月劈,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站藤乙,受9級(jí)特大地震影響猜揪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坛梁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一而姐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧划咐,春花似錦拴念、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至队魏,卻和暖如春公般,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胡桨。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工官帘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昧谊。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓刽虹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呢诬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涌哲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 參考Android ToolBar 使用完全解析Android開發(fā):最詳細(xì)的 Toolbar 開發(fā)實(shí)踐總結(jié)Andr...
    合肥黑閱讀 3,876評(píng)論 1 8
  • 在API21之前我們使用標(biāo)題欄基本都是在ActionBarActivity的Activity中處理的胖缤,而API21...
    PapiAP閱讀 6,696評(píng)論 3 14
  • 快樂神仙_12b4閱讀 181評(píng)論 1 1
  • 是7年前,自己還在讀高中阀圾,一課休時(shí)間草姻,在走廊抬頭望天空,一瞬間就喜歡上了稍刀,清晰記得那兩道云形成一個(gè)字母型撩独,當(dāng)初拍得...
    是Viki閱讀 278評(píng)論 0 0