Android CoordinatorLayout、AppBarLayout、DrawerLayout、NavigationView 的使用及问题小结

这里只对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没有该属性提示,需要纯手打

posted @ 2018-01-11 12:07  )^程序猿^(  阅读(610)  评论(0编辑  收藏  举报