项目笔记——安卓WebView加载H5页面问题处理

项目为Android应用,使用WebView加载H5页面。

此文仅记录项目开发中遇到的问题及解决方法。

目录

一,下拉刷新

二,H5唤起支付宝

三,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;

        }
    });

这里是笼统的处理,也可以根据页面需求进行精准处理。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值