乌市泽哥 发表于 2025-2-13 21:17:51

项目条记——安卓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;

      }
    }); 这里是笼统的处理,也可以根据页面需求举行精准处理。
参考:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 项目条记——安卓WebView加载H5页面题目处理