项目为Android应用,使用WebView加载H5页面。
此文仅记录项目开发中遇到的问题及解决方法。
目录
一,下拉刷新
页面Reload需要下拉刷新功能,所以使用了SwipeRefreshLayout包裹WebView。但使用时不管页面处在哪个位置只要下拉,都会触发刷新。
于是通过对WebView的位置进行判断,来决定是否允许SwipeRefreshLayout刷新功能生效。
现在H5页面大多都不再是页面本身滚动,反映到日志就是WebView的getScrollY() 得到的值一直是0,无法用于判断,于是采用迂回的方式。
首先自定义WebView的子类控件OverScrollWebView,重写过度滚动监听overScrollBy,当其被触发的时候,允许下拉刷新。注意:向上过度滑动也会触发这个回调,但SwipeRefreshLayout的刷新仅会被下拉触发,所以这里没有考虑方向问题。
private boolean isOverScroll = false;
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
if (!isOverScroll) {
isOverScroll = true;
}
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
public boolean isOverScroll() {
return isOverScroll;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
//在用户开始或结束触屏时复位
isOverScroll = false;
break;
}
return super.onTouchEvent(event);
}
同时,在页面中设置允许WebView过度滚动,并重写触屏事件监听,根据页面是否已处在顶部来设置是否允许SwipeRefreshLayout下拉刷新。
//允许webView过度滚动
webView.setOverScrollMode(View.OVER_SCROLL_ALWAYS);
if (webView instanceof OverScrollWebView) {
webView.setOnTouchListener((v, event) -> {
swipeRefreshLayout.setEnabled(((OverScrollWebView) webView).isOverScroll());
return false;
});
}
二,H5唤起支付宝
项目支付功能由H5页面调用支付宝接口,但无法正确唤起支付宝App,仅生成了吱口令。
因为安卓原生的谷歌浏览器自从 chrome25 版本开始,URL Scheme 就无法启动Android应用了。
所以,需要重写拦截逻辑,手动唤起App。
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading (WebView view, String url){
JCLog.i(TAG, " shouldOverrideUrlLoading url: " + url);
if (url.startsWith("http:") || url.startsWith("https:")) {
//正常的页面,不拦截不处理
return false;
}
try {
//将H5唤起App,变为App间互相唤起
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
});
这里是笼统的处理,也可以根据页面需求进行精准处理。
参考: