全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android嵌套滑动冲突的解决方法

android在嵌套滑动的时候会产生滑动冲突。之前我也碰到,但是以前的笔记本丢失了,所以只能重新再写一章。

一.会产生滑动冲突的情况

那么什么时候会产生滑动冲突呢?比如你有个activity,activity的上半部分是一个布局,下半部分是一个可滑动控件(RecyclerView、ListView等),或者下半部分是个viewpager,里面的fragment布局是一个可滑动控件,这样的页面就会产生滑动冲突。

二.以前的做法

虽然我以前的笔记丢失了,但是当时的解决问题的思路我依然记得。

(1)重写一个viewpager继承系统的ViewPager,至于怎么重写的我不太记得了

(2)重写RecyclerView继承系统的RecyclerView,因为我记得会出现高度的原因导致RecyclerView不设置固定高度的话会不显示或者只显示一个Item,所以要重写RecyclerView去动态衡量Item x count 的高度。

当时虽然能解决,但是最后的效果很变扭。

三.现在的做法

现在我肯定不会像之前一样做,因为出了一个新控件NestedScrollView。它能够很好的帮我们解决滑动冲突,接下来我会尽我所能分析所有可能出现的情况。

1.布局只嵌套RecyclerView的情况

就是如下图的情况:


这种情况最容易解决,就直接使用NestedScrollView做父布局,然后嵌套RecyclerView就行。

<android.support.v4.widget.NestedScrollView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/m_nsv"
  android:fillViewport="true"
  xmlns:android="http://schemas.android.com/apk/res/android">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
      android:layout_width="match_parent"
      android:layout_height="150dp"
      android:text="Hello World!" />

    <android.support.v7.widget.RecyclerView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:id="@+id/c_rv"
      >
    
    </android.support.v7.widget.RecyclerView>

  </LinearLayout>

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

这样就行,切记要记住两点:

(1)在父布局NestedScrollView加android:fillViewport="true",然后RecyclerView会不显示出来,不显示出来的原因是RecyclerView是一个动态展示的View,而直接使用的话用我之前说的话叫做会被压扁,所以加这个属性让子View显示match_parent的效果。

(2)有的人说要给RecyclerView设setNestedScrollingEnabled(false),不然滑动时会卡,这个我没试过,我设的是true,目前感觉滑动时没什么影响。

2.布局嵌套其它可滚动控件的情况

就是在第一种情况下把RecyclerView换成其它可滑动控件。

直接说吧,你要用NestedScrollView才有用,原因是解决滑动冲突的关键在于NestedScrollingParent和NestedScrollingChild两个接口(下面会详细说)

而RecyclerView和NestedScrollView都实现NestedScrollingChild接口,并在内部封装了解决滑动冲突的逻辑处理,所以只有NestedScrollView直接嵌套RecyclerView或NestedScrollView不会产生滑动冲突。

NestedScrollView的用法和RecyclerView一样,记得加那些属性。

3.布局嵌套ViewPager,ViewPager嵌套RecyclerView等可滑动控件的情况

这种情况处理起来比较麻烦,而很多人都是碰到这种情况。如下图:

其实我之前写过一篇文章能解决这种情况,那就是使用CoordinatorLayout,使用CoordinatorLayout能解决这种情况。
但是,我文章里也说过了,CoordinatorLayout有BUG,使用起来卡得像坨屎一样,不管你能不能忍,反正我是不能忍,所以我不会使用CoordinatorLayout。

不用CoordinatorLayout还有以下三种解决办法:

(1)使用github上面开源的那个自定义CoordinatorLayout来解决,叫什么我忘了。

但是我们老大说了,最好别用别人的开源View。于是我只能用第二种方法。

(2)放弃使用ViewPager

为什么,因为系统的ViewPager做不到,上面有说到能解决冲突是因为NestedScrollingParent和NestedScrollingChild,并且NestedScrollingChild的ViewGroup要是实现NestedScrollingParent接口的View,NestedScrollingParent的ChildView要是实现NestedScrollingChild接口的View。

而图中的父布局和RecyclerView隔着一个ViewPager,也就是说NestedScrollingParent的ChildView是ViewPager,NestedScrollingChild的ViewGroup是ViewPager。所以说直接嵌套一层ViewPager的情况是无法解决滑动冲突的。

那有一个很直接的办法就是不用ViewPager,用FragmentManager,这样就能实现解决滑动冲突。

<android.support.v4.widget.NestedScrollView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:fillViewport="true"
  android:id="@+id/nsv"
  app:layout_behavior="@string/appbar_scrolling_view_behavior"
  xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

      <LinearLayout
        android:descendantFocusability="blocksDescendants"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:orientation="horizontal"
        android:minHeight="10dp"
        android:padding="10dp"
        android:id="@+id/ll_header">

        .........................................

       </LinearLayout>
      </LinearLayout>


      <android.support.v4.widget.NestedScrollView
        android:layout_marginTop="15dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:id="@+id/c_nsv"
        >
        <FrameLayout
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:id="@+id/fl_content"
          >

        </FrameLayout>

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

    </LinearLayout>
  </android.support.v4.widget.NestedScrollView>

这里的FrameLayout就是给FragmentManager来显示FrameLayout。

这样做就能解决一个activity多个fragment的情况下的滑动冲突。

但是有的朋友说不嘛,我就要Viewpager,我就要酷酷的滑动动画效果。唉,那你就用最实在的第三中方法吧。

(3)自定义

没办法了,那就用自定义吧,自定义一个VIewGroup实现NestedScrollingParent接口,然后自定义一个View实现NestedScrollingChild接口。或者你可以外层使用NestedScrollView,内层自定义ViewPager来实现NestedScrollingChild接口。

你以为这样就完啦?当然没这么简单。在NestedScrollingChild接口中有这些方法。

你需要在这些方法里面自己写上处理滑动冲突的逻辑,你可以参考RecyclerView的去写,也可以在网上找,网上有一些大神是真的有介绍,但也有一些人要么瞎JB抄别人的又不抄完,要么只会说用CoordinatorLayout。我其实也不是很会里面的细节处理,只是知道流程而已,所以也不装X了。

四.其它使用时的问题

并非解决滑动冲突就没有其它问题。

1.NestedScrollView(RecyclerView)重新加载数据时会自动滚动到底部。

如果你碰到这种情况,只要给父布局的NestedScrollView设.scrollTo(0, 0)就行,和ScrollView一样的。

2.禁止滑动。

如果你想在某些情况下禁止NestedScrollView滑动,可以像处理ScrollView一样,在父布局的NestedScrollView加入监听,例如我这:

public void isScroll(boolean bol){
    Nsv.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        return !bol;
      }
    });
  }

这个方法是设置可滑动和不可滑动。

3.记得设android:fillViewport="true"

如果你嵌套的布局没有显示,那有可能你忘了给父布局NestedScrollView设置android:fillViewport属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android  # 嵌套滑动  # Android嵌套滑动冲突  # Android解决viewpager嵌套滑动冲突并保留侧滑菜单功能  # 详解Android中的NestedScrolling机制带你玩转嵌套滑动  # Android中RecyclerView嵌套滑动冲突解决的代码片段  # Android深入探究自定义View之嵌套滑动的实现  # 这种情况  # 自定义  # 是一个  # 重写  # 就行  # 如果你  # 也不  # 你可以  # 就能  # 情况下  # 就用  # 要给  # 开源  # 那有  # 如下图  # 的是  # 都是  # 半部  # 我是  # 我也 


相关文章: 如何选择适合PHP云建站的开源框架?  如何快速查询域名建站关键信息?  ,在苏州找工作,上哪个网站比较好?  如何用虚拟主机快速搭建网站?详细步骤解析  建站之星在线版空间:自助建站+智能模板一键生成方案  外贸公司网站制作哪家好,maersk船公司官网?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  网站制作大概多少钱一个,做一个平台网站大概多少钱?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何快速搭建高效服务器建站系统?  名字制作网站免费,所有小说网站的名字?  c++怎么用jemalloc c++替换默认内存分配器【性能】  威客平台建站流程解析:高效搭建教程与设计优化方案  如何配置FTP站点权限与安全设置?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  建站之星展会模版如何一键下载生成?  建站之星安装模板失败:服务器环境不兼容?  如何在建站之星绑定自定义域名?  如何在建站之星网店版论坛获取技术支持?  如何彻底删除建站之星生成的Banner?  如何快速生成ASP一键建站模板并优化安全性?  专业公司网站制作公司,用什么语言做企业网站比较好?  建站之星如何快速解决建站难题?  如何在Tomcat中配置并部署网站项目?  网站制作需要会哪些技术,建立一个网站要花费多少?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  安徽网站建设与外贸建站服务专业定制方案  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何用低价快速搭建高质量网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  高防服务器:AI智能防御DDoS攻击与数据安全保障  简单实现Android验证码  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  非常酷的网站设计制作软件,酷培ai教育官方网站?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  定制建站方案优化指南:企业官网开发与建站费用解析  建站之星ASP如何实现CMS高效搭建与安全管理?  广州商城建站系统开发成本与周期如何控制?  如何快速完成中国万网建站详细流程?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  建站之星下载版如何获取与安装?  C++时间戳转换成日期时间的步骤和示例代码  建站与域名管理如何高效结合?  如何在Windows虚拟主机上快速搭建网站?  如何在香港服务器上快速搭建免备案网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。