zoukankan      html  css  js  c++  java
  • 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没有该属性提示,需要纯手打

  • 相关阅读:
    hdu4273Rescue(三维凸包重心)
    hdu4449Building Design(三维凸包+平面旋转)
    hdu3847Trash Removal(凸包)
    CodeForces 166B (凸包)
    机器学习文章导航
    梯度下降法深入
    插值法
    离散系统频域分析
    离散系统时域分析
    连续系统频域分析
  • 原文地址:https://www.cnblogs.com/cxsy/p/8267718.html
Copyright © 2011-2022 走看看