從Titlebar到Actionbar再到Toolbar

寫在前面

bar在英語中有“門閂(shuān)”之意,我想大家一看到“閂”這個字就能馬上聯(lián)想到bar是啥了。當(dāng)然Android中對bar的定義和門閂還是有不少區(qū)別的千绪。Android中的bar有引導(dǎo)使用之作用池摧,快速讓用戶了解當(dāng)前頁面的功能和相關(guān)操作等荔泳。本著這個原則就有了下面的bar的發(fā)展史橙数。

從Titlebar到Actionbar

在3.0之前尊流,Android在UI設(shè)計上還是比較簡單粗暴的,當(dāng)時對這個bar的作用定義也極為簡單灯帮,就是為顯示當(dāng)前頁面的標(biāo)題奠旺,名字都命名成了Titlebar蜘澜,意為標(biāo)題bar。對這個bar能做的操作也很單一响疚,設(shè)置標(biāo)題,再或者加個logo啥的瞪醋,再有復(fù)雜的就得自己自定義View了忿晕。這個bar長相就如下圖所示,可以說丑到爆了银受。和當(dāng)時iOS漂亮的界面簡直一個天一個地践盼,那個時代可以說是Android的試水期,只追求功能可用宾巍,而其他方面就不管了咕幻。

Titlebar

當(dāng)時Android在操作設(shè)計上是有物理返回按鈕的,所以這個Titlebar連返回都不支持顶霞。而在那個設(shè)計往往都要對標(biāo)iOS的時代肄程,Android程序員只能自己去擴展這個功能單一的Titlebar了。自己辛苦得模仿實現(xiàn)iOS應(yīng)用上那些漂亮的導(dǎo)航欄功能选浑。

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar);

經(jīng)過幾年的發(fā)展蓝厌,到Android 2.3版本,Android的各大功能基本穩(wěn)定了古徒,Android界開始對美和使用方便性有了強烈的呼聲拓提。于是2011年Google發(fā)布了Android 3.0版本,這個版本的Android在UI設(shè)計上進(jìn)行了大改隧膘,除了引入了大家熟悉的Fragment外代态,也開始把Titlebar替換為Actionbar。Actionbar顧名思義疹吃,這個bar就不當(dāng)當(dāng)只是展示標(biāo)題了蹦疑,而是加入了Action(動作)。Android3.0的發(fā)布相當(dāng)于Android一個試錯的舊時代的結(jié)束互墓,一個高速發(fā)展的新時代的開始必尼,雖然Android3.0本身應(yīng)用的范圍很小。

Actionbar時代

Actionbar主要功能除了顯示Title外篡撵,還提供了一致的導(dǎo)航和視覺體驗判莉,突出了應(yīng)用的關(guān)鍵操作。比如你可以使用SetDisplayHomeAsUpEnabled(true)添加向上導(dǎo)航育谬,這樣在點擊Actionbar左邊的應(yīng)用圖標(biāo)時會返回父視圖券盅。

你還可以使用Menu的方式來添加當(dāng)前頁面的操作按鈕。

你甚至還可以在Actionbar中自定義自己的View膛檀,比如你可以

或者在Actionbar中加入頁面切換的功能锰镀,配合Fragment的機制

另外Actionbar還提供了樣式設(shè)定娘侍,多屏幕適配等等功能。算是解決了Titlebar的痛點泳炉,Android在頂部導(dǎo)航這一塊終于有了自己的風(fēng)格憾筏,而不再唯iOS是瞻。

啊哈花鹅,Toolbar

又隨著時代的發(fā)展氧腰,到了2014年,Android5.0發(fā)布刨肃,這個版本的發(fā)布標(biāo)志著Android又進(jìn)入了一個新時代古拴,快速爆發(fā)的時代過去了,從現(xiàn)在起真友,要變得優(yōu)雅黄痪,要有自己統(tǒng)一的風(fēng)格。所以在這個版本上Google推出了Material Design設(shè)計語言盔然。然后Actionbar就被重整了桅打,Actionbar雖方便使用,功能也很強大轻纪。但它最大的缺點就是不夠靈活油额,比如它默認(rèn)只能在頂部,要想把Actionbar移到屏幕其它位置就會非常麻煩刻帚,因為它在設(shè)計上是綁定在DecorView的潦嘶。你可以到com.android.internal.policy.DecorView中看到相關(guān)源碼,比如有下面這段崇众,把Actionbar固定在了頂部掂僵,并且橫向填充。

mShowPrimaryActionModePopup = new Runnable() {
    public void run() {
        mPrimaryActionModePopup.showAtLocation(
        mPrimaryActionModeView.getApplicationWindowToken(),
            Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
        endOnGoingFadeAnimation();
        ...
    }
};

為了滿足Material Design優(yōu)雅而靈活的設(shè)計原則顷歌,Google推出了更加靈活的Toolbar锰蓬。你可以在一個Activity中聲明多個Toolbar并且放在任意位置。并且你可以在自己的Toolbar中塞入任何你想要的View眯漩。Toolbar不是Actionbar的替代芹扭,Toolbar是Actionbar的布局方式的擴展,就像一個家庭的小孩長大了赦抖,它可以去外面干更多的事情舱卡,而也可以回家繼續(xù)做一個晚輩。所以我們可以自己定義一個Toolbar队萤,然后調(diào)用setActionBar()來讓這個Toolbar充當(dāng)Actionbar的功能轮锥,前提你需要把當(dāng)前Activity主題或feature設(shè)為NoActionBar。

Toolbar的使用

這里只簡單介紹下Toolbar的一種用法要尔。關(guān)于Toolbar的詳細(xì)用法舍杜,可以參考:Google的官方文檔新娜。我們用向Toolbar中加入一個搜索按鈕來舉個例子。

首先你需要在布局中加入toolbar既绩,它可以如普通View一樣被放在布局的任意位置概龄,如下代碼布局所示。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cn.hadcn.test.MainActivity">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary" />
    <TextView
        android:layout_below="@+id/toolbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>

并且在Activity的onCreate方法中把該toolbar設(shè)置為ActionBar

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setLogo(R.mipmap.ic_launcher);

注:該Activity的Theme需要是NoActionBar的

這樣就成功用toolbar替換了本來的ActionBar了熬词,接下來我們要向這個toolbar加入搜索按鈕旁钧,因為該toolbar已經(jīng)作為actionbar了,所以添加方式也如操作ActionBar一樣互拾,首先創(chuàng)建一個menu文件,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="Search"
        app:showAsAction="ifRoom"/>
</menu>

最后在對應(yīng)的Activity中加入該menu嚎幸,成功后颜矿,就能得到如下圖所示的效果啦。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.test_menu, menu);
    return true;
}
最終效果

TIPS:有人可能注意到在使用showAsAction時使用了app作為命名空間嫉晶,而非使用android骑疆。這個是一個歷史遺留問題,因為ActionBar是在Android 3.0上引入的替废,它也具有android:showAsAction這個屬性箍铭,所以appcompat-v7包為了向下兼容,就用了自定義屬性來避免沖突椎镣。

原文地址:http://pengtao.me/2017-06-04/titlebar-actionbar-toolbar/

作者簡介
彭濤(@彭濤me) 致力于讓技術(shù)變得易懂且有趣
個人博客:http://pengtao.me
簡書:http://www.reibang.com/u/f9246f41945e
GitHub:https://github.com/CPPAlien

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诈火,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子状答,更是在濱河造成了極大的恐慌冷守,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惊科,死亡現(xiàn)場離奇詭異拍摇,居然都是意外死亡,警方通過查閱死者的電腦和手機馆截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門充活,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜡娶,你說我怎么就攤上這事混卵。” “怎么了翎蹈?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵淮菠,是天一觀的道長。 經(jīng)常有香客問我荤堪,道長合陵,這世上最難降的妖魔是什么枢赔? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮拥知,結(jié)果婚禮上踏拜,老公的妹妹穿的比我還像新娘。我一直安慰自己低剔,他們只是感情好速梗,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著襟齿,像睡著了一般姻锁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猜欺,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天位隶,我揣著相機與錄音,去河邊找鬼开皿。 笑死涧黄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赋荆。 我是一名探鬼主播笋妥,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窄潭!你這毒婦竟也來了春宣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤狈孔,失蹤者是張志新(化名)和其女友劉穎信认,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體均抽,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嫁赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了油挥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潦蝇。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖深寥,靈堂內(nèi)的尸體忽然破棺而出攘乒,到底是詐尸還是另有隱情,我是刑警寧澤惋鹅,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布则酝,位于F島的核電站,受9級特大地震影響闰集,放射性物質(zhì)發(fā)生泄漏沽讹。R本人自食惡果不足惜般卑,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爽雄。 院中可真熱鬧蝠检,春花似錦、人聲如沸挚瘟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘盖。三九已至焰檩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間订框,已是汗流浹背锅尘。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留布蔗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓浪腐,卻偏偏與公主長得像纵揍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子议街,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone閱讀 923評論 0 1
  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程泽谨,因...
    小菜c閱讀 6,401評論 0 17
  • 親愛的父母: 記憶中還沒有給你們寫過信呢!今天就隨手寫寫吧特漩!做為家中最小的我如今也過上了無憂無慮的生活吧雹。兩個...
    晨曦_3b3a閱讀 135評論 0 0
  • 文/白茶心 陳恪和5歲的女兒住在風(fēng)景優(yōu)美的古鎮(zhèn)上雄卷。古鎮(zhèn)被開發(fā)成一個景點,蘭兒和一些朋友到古鎮(zhèn)去玩蛤售。見了她們丁鹉,陳恪悄...
    白茶心閱讀 315評論 9 2