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](http://7xttuv.com2.z0.glb.qiniucdn.com/blog/toolbar/sceenshot_3.gif-blogsize)
上代碼:
<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](http://7xttuv.com2.z0.glb.qiniucdn.com/blog/toolbar/sceenshot_1.gif-blogsize)
然后我們把 CollapsingToolbarLayout 改一下:
app:titleEnabled="false"
再看下效果:
![Toobar 2](http://7xttuv.com2.z0.glb.qiniucdn.com/blog/toolbar/2.gif-blogsize)
對比之下滚粟,就很清楚了寻仗。同時在 CollapsingToolbarLayout 和 Toolbar 都設(shè)置了 title 的話,前者的 title 會覆蓋后者的凡壤,即只顯示前者的 title署尤。
關(guān)于 Toolbar,以后遇到什么問題亚侠,我會更新在此曹体。
感謝閱讀!