前言:
想必大家都是奔着标题而来的,那么不管实际开发中是否有遇到过,这个确实是一个坑点!!!
问题描述:
在Android开发中难免遇到Android与Js交互,要想实现交互,第一步就得使用WebView去加载一个html页面,这样才会有许多接下来的操作,使用WebView加载的时候难面遇到一屏幕元素多,但是还得让WebView的界面可滑动时,那外层布局就必须得套一层ScrollView,这样就会发现你你内部的WebView不可滑动了,只可以滑动ScrollView。
解决思路:
就是控制touch事件的分发,当WebView的touch事件收到了ACTION_UP事件时,就控制该事件由WebView接收,不在向下分发了,当WebView的touch事件检测非ACTION_UP事件时,则向下分发,交由ScrollView处理,这样就避免了touch事件分发下去WebView无滑动响应的问题。
mWebView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
mWebView.requestDisallowInterceptTouchEvent(false);
} else {
mWebView.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
2023.7.19补充
因在webview内部控制了touch事件不在向下分发,就会导致在此区域滑动到顶或底不在触发scrollView滑动,也会很奇怪,所以重新了WebView的onOverScrolled方法监听内部view滑动来释放焦点,下面是完整代码!
public class MWebView extends WebView {
public MWebView(Context context) {
this(context, null);
}
public MWebView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@SuppressLint("ClickableViewAccessibility")
public MWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnTouchListener((v, event) -> {
requestDisallowInterceptTouchEvent(
event.getAction() != MotionEvent.ACTION_UP);
return false;
});
}
//判断webview内部滑动到极限后释放touch事件
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if (scrollY == 0 && clampedY) {
requestDisallowInterceptTouchEvent(false);
}
}