1、ScrollView+match_parent失效
ScrollView本身的高度设置为match_parent,其子View的高度也设置为match_parent,自然状态下该子View的高度并不会占满ScrollView的高度。
原因是match_parent针对一般布局而言,是子view的高度和parent的高度一致,但在ScrollView身上,工作机制并非如此,
而是ScrollView的高度随着子View的高度变化而变化(子View高度大于ScrollView时)。在子View高度小于ScrollView高度时,
必需在xml里为ScrollView加上android:fillViewport="true",这样子View小于ScrollView高度时就会占满父View.
原因分析:这是两个控件的滑动事件产生了冲突的问题
public class MyScrollView extends ScrollView {
private GestureDetector mGestureDetector;
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
//初始化手势
mGestureDetector = new GestureDetector(context, new YScrollDetector());
}
/**
* touch事件的拦截函数
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//根据手势决定是否拦截子控件的onTouch事件
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
/**
* 控件的手势监听
*/
class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//当纵向滑动的距离大于横向滑动的距离的时候,返回true
if (Math.abs(distanceY) > Math.abs(distanceX)) {
return true;
}
return false;
}
}
}
基本方案就是拦截webview的触摸事件,在ScrollView里面进行消费
问题:
ScrollView里面有一个imageView的和webview,webview遇到问题后采用上一篇文章中的解决方法1解决后,上头的imageview不能随着webview一起滑动,变成固定了。
解决方法:
在页面加载完的方法中重新测量一下webview的高度
public void onPageFinished(WebView view, String url) {
// (两个参数为0表示不对webview的宽和高进行限制)
view.measure(0, 0);
}
不过这么多也有问题,这么设置后,每次点击webview里面的连接后都不会从头开始显示,
而是从中间的页面开始展示,就算调用webview的滑动到顶端的方法也不成功。
我的问题是WebView设置wrap_content,结果前端给的页面没有高度大小,而是100%,也就是适应webview大小,导致没有高度,显示白屏,
解决方法:
1、webView设置match-parent,并给ScrollView设置android:fillViewport="true"
2、给webview设置一定的高度比如300dp
3、让前端把给的网页改成有高度的