这里只对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方法
*/
@Override
public 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没有该属性提示,需要纯手打