项目为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企服之家,中国第一个企服评测及商务社交产业平台。 |