標籤:繼承 menu change always 判斷 重要 end snap 常見
這裡只對Material Design中這幾種組件使用的重要部分以及容易出現問題的地方進行匯總(遇坑請直接看最後常見問題部分),詳細用法請自行查閱官方文檔
一、CoordinatorLayout
介紹:CoordinatorLayout主要用來作為頂層布局來協調各子布局
使用:CoordinatorLayout包含一個Child和一個Dependency,最後還需要一個最重要的Behavior。
1)Child
是指要執行動作的CoordinatorLayout
的子View
;
2)Dependency
是指Child
依賴的View
;
3)簡單來講,就是如果Dependency
這個View發生了變化,那麼Child
這個View
就要相應發生變化;
4)Child
發生變化的具體執行的代碼都是放在Behavior
這個類裡面。
5)Behavior最基本的用法就是在Child這個View的XML檔案中定義一個app:layout_behavior="@string/appbar_scrolling_view_behavior"表示跟隨Dependency一起滑動
自訂Behavior:
1)首先,定義一個類,繼承CoordinatorLayout.Behavior<T>
,其中,泛型參數T是我們要執行動作的View
類,也就是Child
。然後就是去實現Behavior
的兩個方法:
/*** 判斷child的布局是否依賴dependency*/ @Override public boolean layoutDependsOn(CoordinatorLayout parent, T child, View dependency) { boolean rs; //根據邏輯判斷rs的取值,例如:rs = dependency instanceof CustomDependency
//返回false表示child不依賴dependency,ture表示依賴 return rs; }/*** 當dependency發生改變時(位置、寬高等),執行這個函數* 返回true表示child的位置或者是寬高要發生改變,否則就返回false
* 每次dependency位置發生變化,都會執行onDependentViewChanged方法
*/
@Overridepublic boolean onDependentViewChanged(CoordinatorLayout parent, T child, View dependency) { //child要執行的具體動作 return true;}
二、AppBarLayout
介紹:主要是通過AppBarLayout的五種ScrollFlags來定製可滑動VIew的手勢滑動效果
使用:有兩種設定ScrollFlags的方式以及五種ScrollFlags
1)通過在XML檔案中定義app:layout_scrollFlags屬性來設定,代碼中通過setScrollFlags(int)
方法設定
2)scroll:
·想要滾動出螢幕的view都需要設定這個值;
·在設定此flag的view之前如果有other_view沒有設定此值,那麼此view的設定將失效;
·其他四種flag的使用都必須與scroll配合使用。
3)enterAlways:
如果view設定了該flag,那麼該view將啟用quick return模式,即快速返回模式,也就是說在向下滑動中會優先滑動該view使其先顯示出來
4)enterAlwaysCollapsed:
enterAlways的附加值,如果view同時設定了該flag,並設定了最小高度minHeight,在向下滑動中,會優先使該view滑動到最小高度,再滑動其他scrolling view,當其他可滑動的view滑動到邊界,設定該flag的view再繼續滑動顯示完全
5)enterUntilCollapsed:
如果view設定了該flag,並設定了最小高度minHeight,在向上滑動過程中,會使該view只滑動出至最小高度,不會完全滑動出螢幕
6)snap:
主要是實現滑動中的一個吸附效果,要麼該view全部滑動出螢幕,要麼全部顯示在螢幕上,不會出現只有一半顯示在螢幕中的情況,類似於ViewPager的滑動效果
三、DrawerLayout與NavigationView
介紹:通過DrawerLayout與NavigationView這兩個主要是側滑及側滑菜單的實現
使用:將DrawerLayout作為父布局,首頁內容作為第一個子布局,而NavigationView作為最後一個布局
1)通常需要在NavigationView中指定一個頭布局和一個菜單布局,分別為app:menu="@menu/xxx"和app:headerLayout="@layout/xxx
"
2)menu的中有group和item兩個節點,區別是兩個group之間會有分割線隔開表示不同組
3)NavigationView的XML中還需要設定一個android:layout_gravity="start"屬性工作表示可以從左側或右側划出
常見問題:
1.在結合使用CoordinatorLayout、AppBarLayout的時候,設定了scroll_flag但無法實現沈浸式效果
原因:CoordinatorLayout的Child View為ViewPager,而ViewPager中嵌套的是Listview
解決方案:必須使用RecyclerView才可以
2.在結合使用DrawerLayout與NavigationView的時候出現無法通過左劃將側滑菜單收回的情況
原因:NavigationView沒有作為最後一個子布局
解決方案:需要將首頁作為首個子布局,將NavigationView作為最後一個子布局
3.在結合使用DrawerLayout與NavigationView的時候只顯示側邊欄並且佔滿全屏
原因:沒有設定NavigationView的android:layout_gravity="start"屬性
解決方案:設定該屬性即可,可能Android Studio沒有該屬性提示,需要純手打
Android CoordinatorLayout、AppBarLayout、DrawerLayout、NavigationView 的使用及問題小結