使用WebView时一般会在外层使用下拉刷新控件如(SwipeRefreshLayout)。但是测试时会发现网页无法上拉,往上滑动就会触发下拉刷新控件的refresh事件。所以这里记录一下解决该问题的办法。
1、通过webView.getScrollY() 的值来判断是否滚动到顶部
private SwipeRefreshLayout mSwipe;
mSwipe.setColorSchemeResources(R.color.green_ying_guang, R.color.goods_price_size, R.color.colorRed);/* * 设置下拉刷新的监听 */mSwipe.setOnRefreshListener(() -> {//刷新需执行的操作 webView.reload(); mSwipe.setRefreshing(false);});mSwipe.setOnChildScrollUpCallback(new SwipeRefreshLayout.OnChildScrollUpCallback() {@Override public boolean canChildScrollUp(@NonNull SwipeRefreshLayout swipeRefreshLayout, @Nullable View view) { return webView.getScrollY()>0;
}
});
这方法适用于html端是一个类似于线性布局的,内部控件没有上下滑动的监听。如果html内部有控件监听了上下滑动,就会有滑动冲突,所以需要方法2来解决。
2、自定义webview
在onTouchEvent中监听DOWN事件,然后设置mScrolly的值为1,这样在子布局消耗完滑动事件前,mScrolly的值一直为1,SwipeRefreshLayout就不会拦截滑动事件(方法1中设置了mScrolly>0时不拦截)
@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (this.getScrollY() <= 0)this.scrollTo(0, 1); break; default:break; }return super.onTouchEvent(event);}
以上方法试用于绝大多数的webview下拉刷新滑动冲突,如果有不适用的,请联系作者。