各位看官们大家好,上一回中咱们说的例子是"事件拦截之外部拦截",本章回介绍的例子是" 解决ViewPage2中的滑动冲突"。闲话休提,言归正转,让我们一起Talk Android吧!
概念介绍
我们在前面章回中介绍了View中事件拦截的两种方法:内部拦截和外部拦截,并且通过文字结合代码的方式进行了介绍。这两种方法是拦截事件的通用方法,也可以用来解决ViewPager
中的滑动冲突,不过在ViewPager2
中只能使用内部拦截法,因为ViewPager2
不能被继承,所以无法在ViewPager2中拦截事件。
本章回中我们将介绍另外一种思路来解决ViewPager2中的滑动冲突:关闭ViewPager2的滑动功能。
实现思路
整体上还是使用内部拦截的思路,在ViewPager2
中包含的子View中拦截事件,当按下事件(ACTION_DOWN
)触发时关闭ViewPager2中的滑动功能,当弹起事件(ACTION_UP
)触发时打开ViewPager2的滑动功能。这样就可以让ViewPager2中的子View响应用户事件,而不是让ViewPager2
去滑动页面。
示例代码
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
ViewPager2 viewPager = ActivityViewPagerContainer.mViewPager;
switch (action) {
case MotionEvent.ACTION_DOWN:
if(viewPager != null) {
Log.d("printData", "onTouchEvent: down viewpage false");
viewPager.setUserInputEnabled(false);
}else {
Log.d("printData", "onTouchEvent: down viewpage is null");
}
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
if(viewPager != null) {
viewPager.setUserInputEnabled(true);
Log.d("printData", "onTouchEvent: up viewpage true");
}else {
Log.d("printData", "onTouchEvent: up viewpage is null");
}
break;
}
上面的代码是List中的代码片段,我们的使用场景是一个Activiey
中包含ViewPager2
,该ViewPager2又包含了多个Fragment,在某个Fragment中包含List组件。我们利用内部拦截的思路在List中拦截用户事件,因此重写了List中的onTouchEvent
()方法,重写该方法时使用了ViewPager2的setUserInputEnabled
()方法来关闭和打开ViewPager2的滑动功能。
代码中使用的ViewPager2位于ActivityViewPagerContainer
这个Activity中,我们将其义成了静态成员变量,因此可以直接使用类名来获取ViewPager2.
看官们,关于"解决ViewPager2中的滑动冲突"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!