Android-Webview加载进度条及获取网页内容

  • Post author:
  • Post category:其他




记录一下一个相对完整的加载WebView的功能。



1. web.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <ProgressBar
        android:id="@+id/pb"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_2"
        android:max="100"
        android:progress="50"
        android:visibility="gone" />
</RelativeLayout>



2. Activity



1 获取控件 (略)
    WebView mWebView;
    ProgressBar pb;

2 桥

(日志1)

 public class InJavaScriptInterface
    {
        @JavascriptInterface
        public void showSource(String content) {
            LogUtil.e("web --content",content);
        }

        @JavascriptInterface
        public void showTitle(String content) {
            LogUtil.e("web --title",content);
        }
    }

3 设置 Webview getSettings

       //声明WebSettings子类
        WebSettings webSettings = mWebView.getSettings();
        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.setJavaScriptEnabled(true);
        // 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)
        // 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可
    
        //支持插件
        //webSettings.setPluginsEnabled(true);
        //设置自适应屏幕,两者合用
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        
        //缩放操作
        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
        
        //其他细节操作
        //webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
        webSettings.setAllowFileAccess(true); //设置可以访问文件
        webSettings.setDomStorageEnabled(true);
        webSettings.setAppCacheMaxSize(1024 * 1024 * 8);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

        //不使用缓存:
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        webSettings.setPluginState(WebSettings.PluginState.ON);
        //String userAgent = settings.getUserAgentString();
        //settings.setUserAgentString(userAgent + "==xxx");
		//添加与js交互事件 ,js 调用 android(日志2) 
        mWebView.addJavascriptInterface(new InJavaScriptInterface(), "java_obj");
         /*
         *WebViewClient主要展示webview网页加载的一个过程,用于帮助webview处理一些请求事件和通知
         */
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
                handler.cancel();
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                LogUtil.e("web","onReceivedError error="+error);
                super.onReceivedError(view, request, error);

            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                pb.setVisibility(View.VISIBLE);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
            (日志3) 
                // 获取页面内容
                view.loadUrl("javascript:"
                        + "window.java_obj.showSource(document.getElementsByTagName('html')[0].innerHTML);"
                        //+ "window.java_obj.showTitle(document.title);"
                       // + "window.java_obj.showIdContent(document.getElementsById('s_language').innerHTML);"
                       // + "window.java_obj.showIdContent(document.getElementsByTagName('p')[0].innerHTML);"
                );

                super.onPageFinished(view, url);
                pb.setVisibility(View.GONE);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                LogUtil.e("web","shouldOverrideUrlLoading url="+url);
                //return super.shouldOverrideUrlLoading(view, url);
                view.loadUrl(url);
                return true;
            }
        });
        /*
         *WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
         */
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                LogUtil.e("web","title="+title);
            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                if (newProgress <= 100) {
                    pb.setProgress(newProgress);
                }
            }
        });
        // 特别注意:5.1以上默认禁止了https和http混用,以下方式是开启
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        
        mWebView.loadUrl(xxxx);
        //mWebView.loadData(content, "text/html",  "utf-8");
        //若包含’#’, ‘%’, ‘\’, ‘?’四个特殊字符,需要用UrlEncoder编码为%23, %25, %27, %3f
        //mWebView.loadData(URLEncoder.encode(content, "utf-8"), "text/html",  "utf-8");
  //处理中 3秒后返回
  Observable.timer(3000, TimeUnit.MILLISECONDS)
           .subscribe(new Consumer<Long>() {
               @Override
               public void accept(Long aLong) throws Exception {
                   LogUtil.e("timer","long="+aLong);
                   finish();
               }
           });

主要是转载下面一篇文章 还可以修改网页内容, nb


获取WebView加载的网页内容并进行动态修改


安卓Webview网页秒开策略探索



版权声明:本文为zuochunsheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。