美文网首页Android Dev各种长见识涨姿势android实用技术
Android--WebView开发项目使用这些就够了

Android--WebView开发项目使用这些就够了

作者: 落魄的安卓开发 | 来源:发表于2016-11-09 23:56 被阅读944次

    WebView基本使用:

    1、加载网页、刷新网页、前进、后退

    在xml文件中

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

    在java代码中:

    WebView wvTest = (WebView)findViewById(R.id.wv_banner);
    //加载网络网页
    wvTest.loadUrl("http://www.baidu.com");
    //加载本地网页
    wvTest.loadData("file:///android_asset/refresh/refresh.html");
    //返回上个页面
    if(wvTest.canGoBack()){
      wvTest.goBack();
    }
    //去刚才浏览的页面
    if(wvTest.canGoForward()){
      wvTest.goForward();
    }
    //刷新当前页面
    wvTest.reload();
    
    2、设置一些参数

    注: 需要用到什么设置,随时查一下即可。最后一条在加载含有Html5新标签的网页的时候需要加上这句话。

    WebSettings settings = wvTest.getSettings();
    settings.setJavaScriptEnabled(true);//支持javascript
    settings.setUseWideViewPort(true);//适配屏幕
    settings.setLoadWithOverviewMode(true);
    settings.setBuiltInZoomControls(true);//支持放大缩小
    settings.setDisplayZoomControls(false);//隐藏放大缩小的按钮
    settings.setDomStorageEnabled(true);//支持Html5标签
    ……等
    
    3、获取网页标题
    class MyWebViewChromeClient extends WebChromeClient{
        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            L.D("title就是网页标题:" + title);
        }
    }
    wvTest.setWebChromeClient(new MyWebViewChromeClient());
    
    4、下载文件
    wvTest.setDownloadListener(new DownloadListener() {
        @Override
        public void onDownloadStart(String url, String userAgent,
                        String contentDisposition, String mimetype, long contentLength) {
            //需要下载的文件的地址就是url,及可以下载文件       
        }
    });
    

    调用系统浏览器去下载文件(updateUrl是下载地址):

    Intent intent= new Intent();
    intent.setAction("android.intent.action.VIEW");
    Uri content_url = Uri.parse(updateUrl);
    intent.setData(content_url);  
    startActivity(Intent.createChooser(intent, "请选择浏览器"));    
    
    5、WebView错误码处理

    就在网页加载失败、没有网络的情况下WebView会把加载的网页地址显示出来。为了避免这种情况,我们需要做如下处理:

    class MyWebViewClient extends WebViewClient{
        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
                        //在这里进行加载错误、没有网络情况的处理
                        //方式1:加载一个本地的默认页面
                        wvTest.loadData("file:///android_asset/refresh/refresh.html");
                        //方式2:显示一个默认布局
                        tvDefault.setText("网页加载失败");
                        wvTest.setVisibility(View.GONE);
        }
    }
    wvTest.setWebViewClient(new MyWebViewClient());
    
    6、和JavaScript交互(简单的调用、传值)

    Java代码:

    //被javascript调用的类
    class CalledByJs {
        private Context mContext;
        public CalledByJs(Context context){
            this.mContext = context;
        }
                //在js中被调用的方法
        @JavascriptInterface
        public void callFromJs(){
            Toast.makeText(mContext, "js调用啦~", Toast.LENGTH_LONG).show();
        }
    }
    
    settings.setJavaScriptEnabled(true);
    wvTest.addJavascriptInterface(new CalledByJs(this), "demo");
    

    JavaScript代码:

    function call(){
        demo.callFromJs();
    }
    <img src="img/refreshicon.png" onclick="call()" alt="轻触屏幕重新刷新" />
    
    7、WebView自定义拦截
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      if(!TextUtils.isEmpty(url)){
        if("open_login".equals(url)){
            Intent intent = new Intent(this,LoginActivity.class);
            startActivity(intent);
            return true;
        }else {
            return false;
        }
      }
      return super.shouldOverrideUrlLoading(view, url);
    }
    

    这里解释一下这个方法的返回值:
    返回true:
    webview处理url是根据程序来执行的。即:如果返回为true,即不再会通过webview加载,而是执行你写的拦截的程序,如果没有的话就不执行(不执行就是,内容有href,超链接也不会跳转了)

    返回false:
    webview处理url是在webview内部执行。返回false的话就可以执行内容的超链接跳转。

    8、获取Web页面的标题,显示Web加载进度

    其中显示Web页面加载进度有两种方式:

    class MyChromeClient extends WebChromeClient{
        //获取Web页面标题
        @Override
        public void onReceivedTitle(WebView view, String title) {
            title(title);
            if(TextUtils.isEmpty(shareDesc)){
                shareDesc = title;
                shareTitle = title;
            }
        }
        //显示Web页面加载进度 方式1:
        @Override
        public void onProgressChanged(WebView view, int newProgress){
             if (newProgress == 100) {
                 pbWebLoad.setVisibility(View.GONE);
             } else {
                 if (View.GONE == pbWebLoad.getVisibility()) {
                     pbWebLoad.setVisibility(View.VISIBLE);
                 }
                 pbWebLoad.setProgress(newProgress);
             }
             super.onProgressChanged(view, newProgress);
        }
    }
    
    //显示Web页面加载进度 方式2:
    private class MyWebViewClient extends WebViewClient{
    @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            //弹Loading框进行加载
        }
        
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            //消失Loading框,加载完毕
        }
    }
    
    9、清空WebView缓存
    /**
     * WebView清空缓存
     */
    public static void clearCache(Context context) {
        CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
        context.deleteDatabase("webview.db");
        context.deleteDatabase("webviewCache.db");
        context.deleteDatabase("webviewCookiesChromium.db");
        context.deleteDatabase("webviewCookiesChromiumPrivate.db");
        //WebView 缓存文件  
        File webviewCacheDir = new File(context.getCacheDir().getAbsolutePath()+"/webviewCacheChromium");  
        //删除webview 缓存目录  
        if(webviewCacheDir.exists()){  
            deleteFile(webviewCacheDir);  
        }  
    }
    
    10、访问https地址
    wvTest.setWebViewClient(new WebViewClient(){
            @Override
            public void onReceivedSslError(WebView view,SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
                //handler.cancel(); // Android默认的处理方式
                handler.proceed();  // 接受所有网站的证书
                //handleMessage(Message msg); // 进行其他处理
            }
        });
    

    WebView内核:http://blog.csdn.net/typename/article/details/40425275

    http://www.jianshu.com/p/962a389301f4

    相关文章

      网友评论

      本文标题:Android--WebView开发项目使用这些就够了

      本文链接:https://www.haomeiwen.com/subject/mposettx.html