viewpager跟HorizontalScrollView,listview冲突的问题,
viewpager跟HorizontalScrollView,listview冲突的问题,
这几天做到一个小qpp,发现一个严重的问题,因为主要布局是一个HorizontalScrollView里面装了个viewpager包含fragment,恰好我有又想实现一个侧边栏,所以发现app运行之后,侧滑栏虽然能够滑动,但是viewpager完全不能用了,不能滑动,就连tablelayout按钮都不能用了,就上网查询了下资料,原来是viewpager和HorizontalScrollView冲突了,HorizontalScrollView里面viewpager的活动被HorizontalScrollView父view拦截了,所以我们为了能够实现两者的协调,必须分情况到底父view是否该拦截子view的活动。拦截了侧滑栏就能活动,不拦截viewpager就能活动。
getParent().requestDisallowInterceptTouchEvent(true);把touch主动权交给子view处理,不拦截touch事件,也就是viewpager
getParent().requestDisallowInterceptTouchEvent(flse);把touch主动权交给父view处理,拦截touch事件,也就是HorizontalScrollView
具体代码如下:
package com.example.a1.myapplication.View;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
public class ChildViewPager extends ViewPager {
public ChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ChildViewPager(Context context) {
super(context);
}
// 滑动距离及坐标 归还父控件焦点
private float xDistance, yDistance, xLast, yLast,xDown, mLeft;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//把touch主动权交给子view处理,不拦截touch事件,也就是viewpager
getParent().requestDisallowInterceptTouchEvent(true);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
xDown = ev.getX();
mLeft = ev.getX();
// 解决与侧边栏滑动冲突
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if (mLeft < 100 || xDistance < yDistance) {
getParent().requestDisallowInterceptTouchEvent(false);
} else {
if (getCurrentItem() == 0) {
if (curX < xDown) {
getParent().requestDisallowInterceptTouchEvent(true);
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
} else if (getCurrentItem() == (getAdapter().getCount()-1)) {
if (curX > xDown) {
getParent().requestDisallowInterceptTouchEvent(true);
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
break;
}
return super.dispatchTouchEvent(ev);
}
}
在今后使用中只需要使用上述代码然后在layout布局文件中使用 <com.hk.View.ChildViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</com.hk.ChildViewPager>
然后就ok了,而且你觉得想实现侧滑栏实现的简单点,可以删除一些上面代码的东东西,当然listview也是同样的道理,相信大神的你们都会领悟。
评论暂时关闭