Backlight87
10/25/2017 - 6:33 AM

ScrollView+webView可能出现的各种bug



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、让前端把给的网页改成有高度的