Android中Scrollview、ViewPager冲突问题汇总(已解决)
2015-01-14 13:05
543 查看
显示问题:
显示问题:
1、设置ScrollView的fillViewPort为true
2、设置ViewPager的layout_height为一个固定高度,比如:100dip
冲突问题:
不过ViewPager显示出来以后,还有另外一个冲突:ViewPager左右不能滑动了!是的,因为这个事件其实已经被外层的ScrollView截获!
重写ScrollView控件!
重写ScrollView,然后嵌套使用无任何问题,如何重写,具体看以下地址
http://stackoverflow.com/questions/2646028/android-horizontalscrollview-within-scrollview-touch-handling
备注:ListView嵌套无法滑动也可以解决,listview布局推荐线性布局,相对布局有小问题,如何解决请google
第二种方案:viewpager结合下拉刷新组件,重写Viewpager组件,如何重写参考以下代码,
package com.bavariama.base.widget;
import java.net.ContentHandler;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
/**
* 此ViewPager解决与父容器ScrollView冲突的问题,无法完美解决.有卡顿
* 此自定义组件和下拉刷新scrollview配合暂时小完美,有待改善
* @author bavariama
*
*/
public class InsideViewPager extends ViewPager {
float curX = 0f;
float downX = 0f;
OnSingleTouchListener onSingleTouchListener;
public InsideViewPager(Context context) {
// TODO Auto-generated constructor stub
super(context);
}
public InsideViewPager(Context context, AttributeSet attrs) {
// TODO Auto-generated constructor stub
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
curX = ev.getX();
// TODO Auto-generated method stub
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
downX = curX;
}
int curIndex = getCurrentItem();
if (curIndex == 0) {
if (downX <= curX) {
getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
} else if (curIndex == getAdapter().getCount() - 1) {
if (downX >= curX) {
getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(ev);
}
public void onSingleTouch() {
if (onSingleTouchListener != null) {
onSingleTouchListener.onSingleTouch();
}
}
public interface OnSingleTouchListener {
public void onSingleTouch();
}
public void setOnSingleTouchListner(
OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
}
显示问题:
1、设置ScrollView的fillViewPort为true
2、设置ViewPager的layout_height为一个固定高度,比如:100dip
冲突问题:
不过ViewPager显示出来以后,还有另外一个冲突:ViewPager左右不能滑动了!是的,因为这个事件其实已经被外层的ScrollView截获!
重写ScrollView控件!
重写ScrollView,然后嵌套使用无任何问题,如何重写,具体看以下地址
http://stackoverflow.com/questions/2646028/android-horizontalscrollview-within-scrollview-touch-handling
备注:ListView嵌套无法滑动也可以解决,listview布局推荐线性布局,相对布局有小问题,如何解决请google
第二种方案:viewpager结合下拉刷新组件,重写Viewpager组件,如何重写参考以下代码,
package com.bavariama.base.widget;
import java.net.ContentHandler;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
/**
* 此ViewPager解决与父容器ScrollView冲突的问题,无法完美解决.有卡顿
* 此自定义组件和下拉刷新scrollview配合暂时小完美,有待改善
* @author bavariama
*
*/
public class InsideViewPager extends ViewPager {
float curX = 0f;
float downX = 0f;
OnSingleTouchListener onSingleTouchListener;
public InsideViewPager(Context context) {
// TODO Auto-generated constructor stub
super(context);
}
public InsideViewPager(Context context, AttributeSet attrs) {
// TODO Auto-generated constructor stub
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
curX = ev.getX();
// TODO Auto-generated method stub
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
downX = curX;
}
int curIndex = getCurrentItem();
if (curIndex == 0) {
if (downX <= curX) {
getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
} else if (curIndex == getAdapter().getCount() - 1) {
if (downX >= curX) {
getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(ev);
}
public void onSingleTouch() {
if (onSingleTouchListener != null) {
onSingleTouchListener.onSingleTouch();
}
}
public interface OnSingleTouchListener {
public void onSingleTouch();
}
public void setOnSingleTouchListner(
OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
}
相关文章推荐
- Android中Scrollview、ViewPager冲突问题汇总(已解决)
- Android中Scrollview、ViewPager冲突问题汇总(已解决)
- Android中Scrollview与ViewPager冲突问题解决方案
- 【Android】ScrollView与ViewPager手势冲突问题解决
- android scrollView 内嵌ViewPager或Gallery等水平滑动控件冲突问题解决实现同时滑动
- Android中Scrollview、ViewPager冲突问题汇总
- Android ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题解决方案
- Android ScrollView 与 viewpager冲突问题
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- 基于ViewPager的自动轮播模块–解决与ScrollView冲突问题
- android 图片缩放后划屏拖动图片与Viewpager切换Item冲突(拖动图片的事件相应被屏蔽)问题解决
- 解决scrollView中嵌套viewPager的冲突问题
- android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题
- android 教您完美解决viewpager嵌套viewpager冲突问题
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- Android中Scrollview、ViewPager、ListView冲突问题
- 完美解决Android里面scrollview嵌套及listview嵌套viewpager的滑动冲突问题的简单方法
- android listview嵌套viewpager,viewpager嵌套gridview,解决内嵌无法显示以及时间冲突的问题
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- 解决ScrollView和VerticalViewPager滑动事件冲突问题