android viewpager滑动与slidingpanelayout冲突怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android viewpager滑动与slidingpanelayout冲突怎么解决相关的知识,希望对你有一定的参考价值。

ListView中嵌套ViewPage有或者滑动手势冲突解决

在listview 上使用 addHeaderView 在第一栏添加 viewpager 当做header
如:

当触发 滑动事件 的时候容易引起 滑动冲突 (比如斜着滑动viewpager 的时候 listview会跳动)
特别是在 下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中

查阅了很多的帖子 发现修改起来都非常麻烦

(1)解决方案
1. 针对viewpager 做了些修改
替换掉support.v4当中的viewpager即可:

[java] view plain copy
package com.example.bz_viewpager;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;

/**
* viewpage 和listview 相互冲突 将父view 传递到viewpage 里面
*
* 使用父类的方法 parent.requestDisallowInterceptTouchEvent(true);
*
* 当 requestDisallowInterceptTouchEvent 如果为true的时候 表示:父view 不拦截子view的touch 事件
*
* 这个方法只是改变flag
*
* @author baozi
*
*/
public class DecoratorViewPager extends ViewPager
private ViewGroup parent;

public DecoratorViewPager(Context context)
super(context);
// TODO Auto-generated constructor stub


public DecoratorViewPager(Context context, AttributeSet attrs)
super(context, attrs);


public void setNestedpParent(ViewGroup parent)
this.parent = parent;


@Override
public boolean dispatchTouchEvent(MotionEvent ev)
if (parent != null)
parent.requestDisallowInterceptTouchEvent(true);

return super.dispatchTouchEvent(ev);


@Override
public boolean onInterceptTouchEvent(MotionEvent arg0)
if (parent != null)
parent.requestDisallowInterceptTouchEvent(true);

return super.onInterceptTouchEvent(arg0);


@Override
public boolean onTouchEvent(MotionEvent arg0)
if (parent != null)
parent.requestDisallowInterceptTouchEvent(true);

return super.onTouchEvent(arg0);


参考技术A 学下事件分发,(设置条件)拦截其中一个的滑动事件

Android 解决viewPager中嵌套webView的滑动冲突

参考技术A    在工作中遇到了一种情况,在可以横向滑动的viewPager其中的一项中嵌套着一个webView,并且在这个webView中也有可以横向滑动的的类似viewPager的组件,因为webView其中的H5组件我们是无法控制的,因此便会发生滑动冲突,现象则是webView中的H5组件无法滑动。比如下图

   经过笔者的一阵搜索,借鉴了 Viewpager与webview滑动冲突的解决方案 一文的解决方案,并在其基础上改进了一下,使之处理起来更加简单一些。

   首先我们先确定滑动冲突是事件分发机制的事情。解决办法需要在需要的地方进行事件的拦截和分发可以使用下面的方法

   当为true的时候则说明父控件(也就是viewPager)不拦截事件,点击事件由子控件(也就是webView)来处理,反之为false的时候,父控件则拦截点击事件,子控件无法响应点击事件。

   此时我们需要Android原生和JS交互一下,来通知我们什么时候拦截事件,什么时候不拦截事件。首先我们要先和H5的小伙伴商量好方法名和参数,在H5中可以监听到是否点击了或者滑动了轮播图,H5的小伙伴可以在监听值判断,如果点击或者滑动了H5中的轮播图则,调用Android原生的方法参数为true,Android端则进行事件的拦截,反之没有点击或者滑动的时候,则调用方法参数为false。
交互方法:

   如果有不懂Android原生与H5交互方法的可以看我的一篇文章 <Android中webveiw与H5进行交互>

此时我们拿到参数以后就可以进行事件的拦截

   这样就可以对事件分发进行处理,不过此处需要注意的是拦截事件的方法 wb.requestDisallowInterceptTouchEvent(isIntercept);必须要写在Touch事件中才可以生效,写在webview初始化的地方是不可以的。
  ok,笔者认为这种方法比H5端去测量轮播图的位置,然后告诉Android端,Android端再去判断位置去拦截事件要简单一些。当然这只是个人想法,还是要感谢借鉴文章的大佬,毕竟是站在了巨人的肩膀上。

以上是关于android viewpager滑动与slidingpanelayout冲突怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

Android 解决viewPager中嵌套webView的滑动冲突

Android Tricks 6ViewPager首页与尾页的滑动动作响应

Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突

在viewpager中图片滑动展示时图片与文字对应不上?

垂直 ViewPager 和 Android Pie 与滑动手势不一致的行为

ViewPager2嵌套RecyclerView滑动冲突解决办法