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

Android嵌套滑动冲突的解决方法,第1张

概述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嵌套滑动冲突的解决方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存