使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题。
我的问题原型:
这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了长按滑动图片的功能,而发现它们两者的
onTouchEvent事件冲突。
尝试过的解决方法:
1-----
遇到这问题,首先是百度,百度到的方法有,自定义 viewPager,在里面重写 onTouchEvent 和 onInterceptTouchEvent,具体代码是下面,这种方法,我尝试
后发现,只能在第一次加载 viewPager的 页面达到 阻断的效果,我这里详细说下,在MainActivity 页面里面,我们初始化了 viewPager,然后我们要在 第二个页面的
fragment 中实现阻断,这时候,你可能会尝试 在 fragment 中new 一个 MainActivity 的对象,然后想方设法 获取它 里面的 viewPager,或者是 引入与 MainActivity
绑定好了的 xml文件,再 在 fragment 中 findViewById() 来获取次 viewPager。 然后使用 自定义 viewPager 里面的 函数。
很不幸,我上述谈到的方法,我都试过了, all failed。
1 package com.LGH.weixin; 2 3 /** 4 * Created by Administrator on 2015/5/30. 5 */ 6 import android.content.Context; 7 import android.support.v4.view.ViewPager; 8 import android.util.AttributeSet; 9 import android.util.Log;10 import android.view.MotionEvent;11 12 13 public class myViewPager extends ViewPager {14 15 private boolean enabled = true; // 默认是 可以侧滑的16 17 18 public myViewPager(Context context, AttributeSet attrs) {19 super(context, attrs);20 }21 22 public void setStopViewPagerSlip(boolean enabled){23 this.enabled = enabled;24 Log.i("--------------------",""+this.enabled);25 }26 //触摸没有反应就可以了27 @Override28 public boolean onTouchEvent(MotionEvent event) {29 if (this.enabled) {30 return super.onTouchEvent(event);31 }32 return false;33 }34 35 36 @Override37 public boolean onInterceptTouchEvent(MotionEvent event) {38 if (this.enabled) {39 return super.onInterceptTouchEvent(event);40 }41 return false;42 }43 }
2-----
第二种方法是我最后真正解决了的。刚开始的时候,使用有误,导致失败。
方法: view.requestDisallowInterceptTouchEvent(true); //传入参数是 true 即可
我第一次使用它失败的原因是:
在 我的 fragment中,由于 viewPager 它本是就是一个 view,所以 我使用 该方法的时候,就直接
viewPager .requestDisallowInterceptTouchEvent(true); 结果是失败的。 在子 view 中正确使用方法是 下面 ↓
解决方法:
view.requestDisallowInterceptTouchEvent(true);中使用的 view 要求是你当前 fragment 引入的xml 返回的 view,而且 改为:
view.getParent().requestDisallowInterceptTouchEvent(true);
此时方能真正解决! 下面 引入些必要的 代码。
1 View main = inflater.inflate(R.layout.apart_center,container,false);
1 main.getParent().requestDisallowInterceptTouchEvent(true);