Toolbar 的使用

0. 寫在前面

Android 新人脑奠,博文是我的學(xué)習(xí)筆記,用于加深理解和記憶左刽。這篇文章是我的第一篇文章捺信,難免有錯漏之處,或者不嚴謹?shù)牡胤健S袉栴}和意見迄靠,歡迎提出秒咨。

1. 基本使用

1.1 xml

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:title="Title" />

1.2 Java

與普通控件差別不大,方法很多掌挚,這里不再贅述雨席,具體可看 Android Studio 的補全提醒

2. Toolbar 上的 menu

2.1 先在 menu 文件夾中新建一個 tool_bar_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/andro
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/search_btn"
        android:icon="@drawable/ic_search_white_24dp"
        android:title="search"
        app:showAsAction="always"/>
    <item
        android:id="@+id/refresh_btn"
        android:icon="@drawable/ic_refresh_white_24dp"
        android:title="refresh"
        app:showAsAction="always"/>
    <item
        android:id="@+id/action_item_1"
        android:title="item 1"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_item_2"
        android:title="item 2"
        app:showAsAction="never"/>
</menu>

可以看到,我在這里定義了四個 item吠式,分別對應(yīng)著搜索陡厘,刷新和兩個隱藏的子菜單。為何說是隱藏的子菜單特占?后兩個 item 和 前兩個 item 有什么區(qū)別嗎?顯然糙置,區(qū)別在于每個 item 最后一句的代碼app:showAsAction="",可選的值有但不限于:

  • always (顯示在 Toolbar 上)
  • never (二級菜單是目,隱藏在最右邊的三點圖標內(nèi))
  • ifRoom (Toolbar 上有足夠的空間才顯示出來)

注意:app:showAsAction="" 的命名空間要是 app谤饭,若改其命名空間為 android,會報錯

2.2 再在 Java 代碼中使用菜單的 xml

toolbar.inflateMenu(R.menu.tool_bar_menu);

2.3 給 menu 設(shè)置監(jiān)聽

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { //toolbar上菜單的監(jiān)聽事件
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.search_btn:
                Toast.makeText(MainActivity.this, "click search button", Toast.LENGTH_SHORT).show();
                break;
            case R.id.refresh_btn:
                Toast.makeText(MainActivity.this, "click refresh button", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_item_1:
                Toast.makeText(MainActivity.this, "click item1", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_item_2:
                Toast.makeText(MainActivity.this, "click item2", Toast.LENGTH_SHORT).show();
        }
        return true;
    }
});

如此一來懊纳,就不必在 activity 中另建菜單揉抵。

注意:如果通過 Toolbar 這樣的方法創(chuàng)建 menu 之后,再在 Java 代碼中將 Toolbar 設(shè)為 actionBar 的話嗤疯,會讓這個 menu 失效冤今,即看不到 menu 啦,悲傷 ╮(╯_╰)╭茂缚,這實在是個坑戏罢,當初找了很久才找出這個 bug...所以大家要是選擇通過 Toolbar 設(shè)置菜單,就不要再將其設(shè)為 acitonBar 了阱佛。

3. 與 AppBarLayout 聯(lián)合

借助 CoordinatorLayout 后帖汞,Toolbar 與 AppBarLayout 的聯(lián)合使用,可比較簡單地實現(xiàn)一些酷炫的交互凑术。當然翩蘸,要想使用 CoordinatorLayout,要先引入 Desinn 庫的依賴:

compile 'com.android.support:design:23.1.1'

關(guān)于 CoordinatorLayout淮逊,可以看這篇文章:CoordinatorLayout與滾動的處理催首,我這里就當作補充吧,從實踐角度講一下細節(jié)泄鹏。

3.1 滑動隱藏 Toolbar

亮圖:

滑動隱藏 Toolbar
滑動隱藏 Toolbar

上代碼:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        
        <android.support.v7.widget.Toolbar
            android:id="@+id/tool_bar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:title="Title" />
            
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabTextColor="#83c7fd"
            app:tabSelectedTextColor="#ffffff"
            app:tabIndicatorColor="#ffffff"
            app:tabIndicatorHeight="3dp"/>
            
    </android.support.design.widget.AppBarLayout>
    
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
        
</android.support.design.widget.CoordinatorLayout>

結(jié)構(gòu)上郎任,CoordinatorLayout 里包含 AppBarLayout 和 ViewPager,其中 AppBarLayout 包含著 Toolbar 和 TabLayout备籽。Toolbar 里的 app:layout_scrollFlags="scroll|enterAlways"舶治,和 ViewPager 里的 app:layout_behavior="@string/appbar_scrolling_view_behavior"分井,這兩句是實現(xiàn)聯(lián)動效果的關(guān)鍵!
當然霉猛,其中的 app:layout_scrollFlags="" 有好幾個值可選:

  • scroll
  • exitUntilCollapsed
  • enterAlways
  • enterAlwaysCollapsed
  • exitUntilCollapsed

在這里尺锚,要想實現(xiàn) Toolbar 的隱藏,
Toolbar 的 app:layout_scrollFlags="" 應(yīng)選擇 scroll|enterAlways惜浅,而 TabLayout 因不需滾動出屏幕瘫辩,則不用設(shè)置該屬性。
關(guān)于其他幾個的區(qū)別坛悉,讀者可自行試試伐厌。

注意:ViewPager 里面的 Fragment,要么是 RecycleView裸影,要么父布局是 NestedScrollView挣轨,總而言之,是能與 CoordinatorLayout 聯(lián)動的部件空民。

關(guān)于 TabLayout 和 ViewPager 刃唐,有時間的話可以再寫篇文章了,給自己挖坑 orz界轩,不過還是挺好的,多寫寫博客嘛 _

3.2 實現(xiàn) Toolbar 的折疊效果

要想實現(xiàn)折疊效果衔瓮,就要在 CoordinatorLayout浊猾,AppBarLayout 和 Toolbar 的基礎(chǔ)上,再加上 CollapsingToolbarLayout 了热鞍。顧名思義葫慎,CollapsingToolbarLayout 就是實現(xiàn) Toolbar 折疊的關(guān)鍵所在!

廢話少說薇宠,先上代碼:

<android.support.design.widget.CoordinatorLayout
    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">
    
    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:theme="@style/AppTheme.AppBarOverlay">
        
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/coolapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="@color/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:expandedTitleMarginStart="16dp"
            app:expandedTitleMarginBottom="10dp"
            app:titleEnabled="true"
            app:title="Hello">
            
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"
                android:src="@drawable/croatian_coast"/>
            
            <android.support.v7.widget.Toolbar
                android:id="@+id/rv_tool_bar"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:navigationIcon="@drawable/ic_arrow_back_white_24dp"
                app:title="Hi">
            </android.support.v7.widget.Toolbar>
            
        </android.support.design.widget.CollapsingToolbarLayout>
        
    </android.support.design.widget.AppBarLayout>
    
    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    </android.support.v7.widget.RecyclerView>
    
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_anchor="@id/app_bar"
        app:layout_anchorGravity="bottom|right"
        android:layout_marginRight="16dp"
        android:src="@drawable/ic_search_white_24dp"/>
        
</android.support.design.widget.CoordinatorLayout>

可以看到偷办,主父布局仍然是 CoordinatorLayout。只需要把 Toolbar 放進 CollapsingToolbarLayout 里面澄港,然后再一起放進 AppBarLayout 里就行椒涯。難道這就可以實現(xiàn)折疊效果嗎?不不不回梧,圖樣圖森破废岂!

這里面的關(guān)鍵代碼是 ImageView 里的:

app:layout_collapseMode="parallax"

和 Toolbar 里的:

app:layout_collapseMode="pin"

parallax,是指視差滾動
pin狱意,指固定不動

如此一來就可實現(xiàn)折疊效果湖苞,接下來再簡單說下 CollapsingToolbarLayout 里的一些重要屬性:

  • app:contentScrim=""
    srim,Google 翻譯是麻布详囤。通過實踐财骨,我想,這里的意思應(yīng)該是 Toolbar 折疊后的背景,所以可填的值為顏色隆箩,或者圖片背景
  • app:layout_scrollFlags=""
    這個屬性在上面的3-1 滑動隱藏 Toolbar有介紹该贾。在這里,如果沒有設(shè)置這個屬性摘仅,則不會產(chǎn)生折疊效果靶庙,布局會固定在原地。要想實現(xiàn)圖片上折疊的效果娃属,應(yīng)選擇scroll|exitUntilCollapsed六荒,其他幾個選項的區(qū)別就不一一列出了。
  • app:expandedTitleMargin
    這個是一系列的屬性矾端,包括MarginStart掏击,MarginBottom等等,顧名思義秩铆,這些屬性是調(diào)整展開后 title 的位置的
  • app:title=""
    顯然砚亭,這個屬性是設(shè)置 Toolbar 的 title 的,可能你會問:為什么不在 Toolbar 里面設(shè)置 title 呢殴玛?有什么區(qū)別呢捅膘?我在這里做一個對比吧。

CollapsingToolbarLayout 里:

app:titleEnabled="true"
app:title="Hello"

Toolbar 里:

app:title="Hi"

來看看效果:


Toolbar 1
Toolbar 1

然后我們把 CollapsingToolbarLayout 改一下:

app:titleEnabled="false"

再看下效果:


Toobar 2
Toobar 2

對比之下滚粟,就很清楚了寻仗。同時在 CollapsingToolbarLayout 和 Toolbar 都設(shè)置了 title 的話,前者的 title 會覆蓋后者的凡壤,即只顯示前者的 title署尤。

關(guān)于 Toolbar,以后遇到什么問題亚侠,我會更新在此曹体。

感謝閱讀!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硝烂,一起剝皮案震驚了整個濱河市箕别,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钢坦,老刑警劉巖究孕,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爹凹,居然都是意外死亡厨诸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門禾酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來微酬,“玉大人绘趋,你說我怎么就攤上這事】殴埽” “怎么了陷遮?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垦江。 經(jīng)常有香客問我帽馋,道長,這世上最難降的妖魔是什么比吭? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任绽族,我火速辦了婚禮,結(jié)果婚禮上衩藤,老公的妹妹穿的比我還像新娘吧慢。我一直安慰自己,他們只是感情好赏表,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布检诗。 她就那樣靜靜地躺著,像睡著了一般瓢剿。 火紅的嫁衣襯著肌膚如雪逢慌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天间狂,我揣著相機與錄音涕癣,去河邊找鬼。 笑死前标,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的距潘。 我是一名探鬼主播炼列,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼音比!你這毒婦竟也來了俭尖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤洞翩,失蹤者是張志新(化名)和其女友劉穎稽犁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骚亿,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡已亥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了来屠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虑椎。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡震鹉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捆姜,到底是詐尸還是另有隱情传趾,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布泥技,位于F島的核電站浆兰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏珊豹。R本人自食惡果不足惜簸呈,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望平夜。 院中可真熱鬧蝶棋,春花似錦、人聲如沸忽妒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽段直。三九已至插勤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枪萄,已是汗流浹背词渤。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喧务,地道東北人赖歌。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像功茴,于是被迫代替她去往敵國和親庐冯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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