Android CoordinatorLayout實(shí)戰(zhàn)案例學(xué)習(xí)《一》

在上篇文章中汪诉,和大家一起聊了聊AppBarLayout和CoordinatorLayout兩個(gè)新控件诅岩,以及CoordinatorLayout與FloatingActionButton歧斟、Snackbar的使用注意事項(xiàng)。至此,Android Material Design系列的學(xué)習(xí)已進(jìn)行到第五篇千诬,大家可以點(diǎn)擊以下鏈接查看之前的文章:

本文繼續(xù)以案例的形式學(xué)習(xí)CoordinatorLayout的使用,配合者為AppBarLayout莫辨。文中會(huì)介紹一些這種搭配使用的案例下可能出現(xiàn)的問題以及解決方案傲茄,目的還是一句話毅访,將我所知的分享出來,讓正在摸索的你少走一些彎路盘榨。老路子喻粹,先看一下本文要實(shí)現(xiàn)的效果圖:

Samples.gif

簡(jiǎn)單介紹下,這種設(shè)計(jì)經(jīng)常會(huì)出現(xiàn)在各個(gè)app中草巡,作為主頁顯示守呜,其中主要包含了三個(gè)效果:

  • 側(cè)拉導(dǎo)航菜單,這個(gè)是用v7包中的控件DrawerLayout實(shí)現(xiàn)的山憨,不是本文重點(diǎn)查乒,就不作過多說明了;

  • FAB與Snackbar的協(xié)調(diào)交互郁竟,在上篇文章中已經(jīng)介紹的很詳細(xì)了玛迄,大家可以另行查看;

  • 列表向上滑動(dòng)枪孩,Toolbar向上隱藏憔晒,TabLayout固定于頂部,給內(nèi)容區(qū)域留下更多的展示空間蔑舞,本文著重講述這種實(shí)現(xiàn)拒担。

知識(shí)點(diǎn)比較零碎,還是配合著代碼講解比較容易攻询,思路也會(huì)比較清晰一些从撼,主要布局文件的實(shí)現(xiàn):

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/dl_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <include layout="@layout/include_toolbar" />

            <android.support.design.widget.TabLayout
                android:id="@+id/tl_indicator"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.AppBarLayout>

        <android.support.v4.view.ViewPager
            android:id="@+id/vp_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/dp_16"
            android:onClick="onClickFab"
            android:src="@mipmap/ic_toolbar_add"
            app:backgroundTint="@color/fab_ripple"
            app:layout_anchor="@id/vp_content"
            app:layout_anchorGravity="bottom|right|end" />

    </android.support.design.widget.CoordinatorLayout>

    <LinearLayout
        android:id="@+id/ll_menu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical"
        android:gravity="center"
        android:background="@color/white">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Menu Content"
            android:textColor="@color/black"
            android:textSize="@dimen/sp_16"/>

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

Android Developer官網(wǎng)中在介紹CoordinatorLayout時(shí)有這么一段話:

CoordinatorLayout is intended for two primary use cases:

  1. As a top-level application decor or chrome layout
  2. As a container for a specific interaction with one or more child views

也就是說CoordinatorLayout主要有兩種使用場(chǎng)景,在我理解過來就是钧栖,作為Activity布局中的最外層容器和作為指定交互行為的多個(gè)子控件的父容器來使用低零。而本文中的案例就屬于第二種。

要實(shí)現(xiàn)這種滑動(dòng)交互效果拯杠,必須要滿足這么幾點(diǎn):

  1. CoordinatorLayout作為容器布局掏婶,來協(xié)調(diào)children view之間的交互行為;

  2. 使用AppBarLayout并設(shè)置其內(nèi)部需要移出屏幕的View的scrollFlags屬性潭陪,在這個(gè)例子中也就是給Toolbar設(shè)置雄妥。由于Toolbar是通用布局代碼,這里我用了include標(biāo)簽依溯,其包含的布局代碼為:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tb_toolbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_56"
    app:titleTextColor="@color/white"
    app:title="@string/app_name"
    app:theme="@style/OverFlowMenuTheme"
    app:popupTheme="@style/AppTheme"
    android:background="@color/blue"
    app:layout_scrollFlags="scroll|enterAlways"/>

可以看到老厌,我添加了app:layout_scrollFlags這個(gè)屬性,并將其值設(shè)為scroll|enterAlways黎炉,scroll表示滑動(dòng)型控件向上滑動(dòng)時(shí)toolbar將移出屏幕枝秤,enterAlways表示向下滑動(dòng)時(shí)toolbar將重新進(jìn)入屏幕。由于TabLayout不需要移出屏幕慷嗜,所以這里就不需要給它設(shè)置這個(gè)屬性了淀弹。需要注意的是:不要將app:layout_scrollFlags屬性單獨(dú)設(shè)置子include標(biāo)簽里丹壕,而是要放在include所加載的layout布局中,否則這個(gè)scrollFlags將失去作用垦页,這與include標(biāo)簽的使用有關(guān)雀费。

  1. 一個(gè)特殊的滑動(dòng)型控件并設(shè)置layout_behavior屬性,這里用的是ViewPager痊焊。注意盏袄,layout_behavior的屬性值用的是系統(tǒng)定義好的固定字符串@string/appbar_scrolling_view_behavior,大家感興趣的自己去翻閱源碼看看薄啥,后續(xù)介紹behavior時(shí)辕羽,我再仔細(xì)講解。

對(duì)于第三點(diǎn)垄惧,這里拿出來單獨(dú)強(qiáng)調(diào)一下刁愿,有沒有發(fā)現(xiàn)滑動(dòng)型控件前我用了“特殊”兩個(gè)字來修飾!CoordinatorLayout之所以能夠協(xié)調(diào)Children View之間的交互行為到逊,主要就是依賴于NestedScrolling這個(gè)東西铣口,這里涉及到兩個(gè)接口類NestedScrollingParentNestedScrollingChild。CoordinatorLayout實(shí)現(xiàn)了前者觉壶,而CoordinatorLayout的Children核心之一脑题,滑動(dòng)型控件,實(shí)現(xiàn)了后者铜靶,所以才能夠做出這個(gè)交互行為叔遂。關(guān)于NestedScrolling,后續(xù)再寫文單獨(dú)介紹争剿。所以已艰,這個(gè)特殊的滑動(dòng)型控件必須是實(shí)現(xiàn)了NestedScrollingChild接口的控件,比如v7包中的RecyclerView蚕苇,看一下它的定義就知道了:

public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild

故哩掺,本文中的ViewPager里面的列表控件必須是RecyclerView。如果你僅僅是簡(jiǎn)單地使用ListView涩笤,還是達(dá)不到這樣的效果疮丛。聰明如你,肯定又看出了我的措辭辆它,對(duì)的,我又用了一個(gè)詞:“簡(jiǎn)單地使用”履恩,那就說明其實(shí)稍作處理锰茉,復(fù)雜點(diǎn)使用,也能夠使用ListView的切心。

在API Level 21及更高版本飒筑,為了支持NestedScrolling片吊,所有控件的基類View對(duì)外新增了一個(gè)方法setNestedScrollingEnabled(boolean enabled),所以协屡,我們可以對(duì)ListView稍作處理俏脊,就能在Android L及以上版本的系統(tǒng)中使用了:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      listView.setNestedScrollingEnabled(true);
}

或者借助 v4 包中的 ViewCompat 類為 ListView 添加設(shè)置,避免版本判斷:

ViewCompat.setNestedScrollingEnabled(listView, true);

但是肤晓,這兩種方法均只支持 Android Lollipop 及更高版本爷贫,在 pre-lollipop 上是沒有效果的。其實(shí)补憾,ListView真的已經(jīng)過氣了漫萄,我們應(yīng)該全方位掌握RecyclerView的使用,就像Android Studio取代Eclipse一樣盈匾。

其他的代碼就很簡(jiǎn)單了腾务,就是給DrawerLayout設(shè)置ActionBarDrawerToggle,就是圖中ToolBar左側(cè)的菜單按鈕削饵。然后用Fragment填充ViewPager岩瘦,這里就不貼代碼了,工程Demo都在GitHub上窿撬,大家可以自己下載參考启昧。

其實(shí)這個(gè)案例的實(shí)現(xiàn)還是蠻簡(jiǎn)單的,文中零零碎碎地講述了很多使用過程中的細(xì)節(jié)技巧尤仍,幫助大家解決實(shí)際問題箫津。下篇文章繼續(xù)使用案例,介紹CoordinatorLayout的使用方法宰啦,同時(shí)引入另一個(gè)控件的使用苏遥,歡迎關(guān)注!

示例源碼


我在GitHub上建立了一個(gè)Repository赡模,用來存放整個(gè)Android Material Design系列控件的學(xué)習(xí)案例田炭,會(huì)伴隨著文章逐漸更新完善,歡迎大家補(bǔ)充交流漓柑,Star地址:

https://github.com/Mike-bel/MDStudySamples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末教硫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辆布,更是在濱河造成了極大的恐慌瞬矩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋玲,死亡現(xiàn)場(chǎng)離奇詭異景用,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惭蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伞插,熙熙樓的掌柜王于貴愁眉苦臉地迎上來割粮,“玉大人,你說我怎么就攤上這事媚污∫ㄆ埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵耗美,是天一觀的道長(zhǎng)京髓。 經(jīng)常有香客問我,道長(zhǎng)幽歼,這世上最難降的妖魔是什么朵锣? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮甸私,結(jié)果婚禮上诚些,老公的妹妹穿的比我還像新娘。我一直安慰自己皇型,他們只是感情好诬烹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弃鸦,像睡著了一般绞吁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唬格,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天家破,我揣著相機(jī)與錄音,去河邊找鬼购岗。 笑死汰聋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喊积。 我是一名探鬼主播烹困,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乾吻!你這毒婦竟也來了髓梅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喷屋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了养盗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诉植。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袱巨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碳抄,到底是詐尸還是另有隱情愉老,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布剖效,位于F島的核電站嫉入,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏璧尸。R本人自食惡果不足惜咒林,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爷光。 院中可真熱鬧垫竞,春花似錦、人聲如沸蛀序。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徐裸。三九已至遣鼓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間重贺,已是汗流浹背骑祟。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留气笙,地道東北人次企。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像健民,于是被迫代替她去往敵國(guó)和親抒巢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,766評(píng)論 22 665
  • CoordinatorLayout與滾動(dòng)的處理 CoordinatorLayout實(shí)現(xiàn)了多種Material De...
    cxm11閱讀 6,588評(píng)論 1 15
  • (文/習(xí)酒鎮(zhèn)?趙半仙) 樹葉被施了定身法 停在空中不說話 月亮撇撇嘴 俯視著人間的燈光 有點(diǎn)刺眼睛 星星啊 又偷懶...
    2632385d067a閱讀 422評(píng)論 3 14
  • 如果二婚和小孩只能選一個(gè)秉犹, 當(dāng)然選小孩蛉谜,小孩是專屬資產(chǎn),老婆是共享資產(chǎn)崇堵, 小孩是一種儲(chǔ)蓄型诚,老婆是一種消費(fèi), 老婆是...
    陳穩(wěn)閱讀 148評(píng)論 0 0