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

打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

项目为Android应用,使用WebView加载H5页面。
此文仅记载项目开发中遇到的题目及解决方法。
目次
一,下拉革新
二,H5唤起付出宝
三,H5本地文件选择
四,加载图片失败
五,输入框被软键盘遮挡


一,下拉革新

页面Reload必要下拉革新功能,所以使用了SwipeRefreshLayout包裹WebView。但使用时不管页面处在哪个位置只要下拉,都会触发革新。
于是通过对WebView的位置举行判断,来决定是否允许SwipeRefreshLayout革新功能生效。
现在H5页面大多都不再是页面自己滚动,反映到日记就是WebView的getScrollY() 得到的值一直是0,无法用于判断,于是采用迂回的方式。
起首自界说WebView的子类控件OverScrollWebView,重写过度滚动监听overScrollBy,当其被触发的时候,允许下拉革新。留意:向上过度滑动也会触发这个回调,但SwipeRefreshLayout的革新仅会被下拉触发,所以这里没有考虑方向题目。
  1.     private boolean isOverScroll = false;
  2.     @Override
  3.     protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
  4.         if (!isOverScroll) {
  5.             isOverScroll = true;
  6.         }
  7.         return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
  8.     }
  9.    
  10.     public boolean isOverScroll() {
  11.         return isOverScroll;
  12.     }
  13.     @Override
  14.     public boolean onTouchEvent(MotionEvent event) {
  15.         switch (event.getAction()) {
  16.             case MotionEvent.ACTION_DOWN:
  17.             case MotionEvent.ACTION_UP:
  18.                 //在用户开始或结束触屏时复位
  19.                 isOverScroll = false;
  20.                 break;
  21.         }
  22.         return super.onTouchEvent(event);
  23.     }
复制代码
同时,在页面中设置允许WebView过度滚动,并重写触屏事件监听,根据页面是否已处在顶部来设置是否允许SwipeRefreshLayout下拉革新。
  1.     //允许webView过度滚动
  2.     webView.setOverScrollMode(View.OVER_SCROLL_ALWAYS);
  3.     if (webView instanceof OverScrollWebView) {
  4.          webView.setOnTouchListener((v, event) -> {
  5.             swipeRefreshLayout.setEnabled(((OverScrollWebView) webView).isOverScroll());
  6.             return false;
  7.          });
  8.     }
复制代码

二,H5唤起付出宝

项目付出功能由H5页面调用付出宝接口,但无法正确唤起付出宝App,仅生成了吱口令。
由于安卓原生的谷歌欣赏器自从 chrome25 版本开始,URL Scheme 就无法启动Android应用了。
所以,必要重写拦截逻辑,手动唤起App。
  1. webView.setWebViewClient(new WebViewClient() {
  2.         
  3.         @Override
  4.         public boolean shouldOverrideUrlLoading (WebView view, String url){
  5.             JCLog.i(TAG, " shouldOverrideUrlLoading url: " + url);
  6.             if (url.startsWith("http:") || url.startsWith("https:")) {
  7.                 //正常的页面,不拦截不处理
  8.                 return false;
  9.             }
  10.             try {
  11.                 //将H5唤起App,变为App间互相唤起
  12.                 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  13.                 startActivity(intent);
  14.             } catch (Exception e) {
  15.                 e.printStackTrace();
  16.             }
  17.             return true;
  18.         }
  19.     });
复制代码
这里是笼统的处理,也可以根据页面需求举行精准处理。
参考:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表