zoukankan      html  css  js  c++  java
  • 10.3.3 WebView的几个常见功能

    (1)背景设置,例如下面的代码。

            webView.setBackgroundColor(0);//先设置背景色为transparent
            webView.setBackgroundResource(R.drawable.ic_launcher);//然后设置背景图片

    (2)获得WebView网页加载

    (3)使用WebView阅读PDF文件

      Android本身不支持打开PDF文件,其实Google提供了在线解析PDF的方法,即使用WebView来实现。例如下面的代码。

            webView = (WebView) this.findViewById(R.id.webview);
            webView.getSettings().setJavaScriptEnabled(true);
            //webView.loadUrl("http://sports.sina.com.cn/");
            //webView.loadUrl("https://www.tmall.com/");        
            //webView.loadUrl("https://www.google.com");
            //webView.loadUrl("http://www.51cto.com/");
            String pdf = "http://www.*****.pdf";
            webView.loadUrl("http://docs.google.com/gview?embedded=true&url=" + pdf);

     

    当前主流的开发模式是“WebView+ProgressDialog”

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    
        <WebView
            android:id="@+id/webview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
    
    </LinearLayout>
    package com.example.progresstest;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.view.KeyEvent;
    import android.view.Menu;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    
    public class WebViewActivity extends Activity {
    
        private ProgressDialog progressBar;
        private WebView webView;
        private AlertDialog alertDialog;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.webview);
            //加载WebView
            initWebView();
        }
    
        private void initWebView() {
            progressBar = ProgressDialog.show(WebViewActivity.this, null, "正在进入网页,请稍后....");
            //获得WebView组件
            webView = (WebView) this.findViewById(R.id.webview);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.loadUrl("http://www.google.com");
            alertDialog = new AlertDialog.Builder(this).create();
            //设置视图客户端
            webView.setWebViewClient(new MyWebViewCLient());
        }
       @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
           if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){
               webView.goBack();
               return true;
           }
        return super.onKeyDown(keyCode, event);
    }
    /*    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }*/
        class MyWebViewCLient extends WebViewClient {
                 @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    // TODO Auto-generated method stub
                     view.loadUrl(url);
                    return true;
                }
                 @Override
                public void onPageFinished(WebView view, String url) {
                // TODO Auto-generated method stub
                   if(progressBar.isShowing()){
                       progressBar.dismiss();
                   }
                }
                 @Override
                public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
                // TODO Auto-generated method stub
                Toast.makeText(WebViewActivity.this, "网页加载出错!  ", Toast.LENGTH_LONG);
                alertDialog.setTitle("ERROR");
                alertDialog.setMessage(description);
                alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        
                    }
                });
                alertDialog.show();
                 }
        }
    
    }
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.progresstest"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.progresstest.WebViewActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    <uses-permission android:name="android.permission.INTERNET"/>
    </manifest>

    (6)拦截超链接

       可以使用WebView拦截超链接,用URL表示拦截到的链接,我们可以对URL做判断,如在线播放音乐的链接,即检测其中是否含有http://xxx.mp3这种链接,如果有就调用音乐播放器来播放。或者是在线播放 “rtsp://” 格式的。例如下面的代码。

     @Override
                /* 此处能拦截超链接的URL,即拦截href请求的内容
                 * */
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    // TODO Auto-generated method stub
                     //当有新连接时,使用当前的WebView
                     view.setWebChromeClient(new WebChromeClient(){
                         @Override
                        public void onProgressChanged(WebView view, int newProgress) {
                            // TODO Auto-generated method stub
                            //super.onProgressChanged(view, newProgress);
                            //Activity和WebView根据加载程度决定进度条的进度大小
                            //当加载到100%的时候,进度条自动消失
                            context.setProgress(newProgress * 100);
                         }
                     });
                     view.loadUrl(url);
                     
                     //调用拨号程序
    /*                 if (url.startsWith("mailto:") || url.startsWith("geo:") ||url.startsWith("tel:")){
                         Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
                         startActivity(intent);
                     }*/
                    return true;
                }

    (7)处理SslError

      在Android中,WebView是用来load加载HTTP和HTTPS网页到本地应用的控件。在默认情况下,通过loadUrl(String url)方法,可以顺利load如http://www.baidu.com之类的页面。但是当加载有SSL层的HTTPS页面时,如https://money.183.com.cn/,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框。因此,我们必须针对这种情况进行处理。在Android处理时需要用到如下两个类。

    import android.net.http.SslError;
    import android.webkit.SslErrorHandler;

    具体用法如下所示。

                @Override
                public void onReceivedSslError(WebView view, SslErrorHandler handler,
                SslError error) {
                // TODO Auto-generated method stub
                //super.onReceivedSslError(view, handler, error);
                handler.cancel();//默认的处理方式,WebView变成空白页
                handler.proceed();//接受证书
                //handleMessage(Message msg);//其他处理
                }

    (8)删除缓存

      我们可以使用WebView删除手机上的缓存,例如下面的代码。

         @SuppressWarnings("unused")
        private int clearCacheFolder(File dir,long numDays){
            int deletedFiles = 0;
            if (dir!=null && dir.isDirectory()){
                try {
                    for (File child:dir.listFiles()){
                        if (child.isDirectory()){
                            deletedFiles += clearCacheFolder(child,numDays);
                            
                        }
                        if(child.lastModified() < numDays){
                            if(child.delete()){
                                deletedFiles++;
                            }
                        }
                        
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return deletedFiles;
             
         }

    优先使用缓存的设置代码如下。

            webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

    使用缓存的设置代码如下。

            webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

    (9)使用WebView设置URL的加载

      当在WebView里打开一个链接时,默认地会通过ActivityManger寻找合适的浏览器进行打开,如果避免这种事情发生的话,可以通过如下流程解决。

      ● 添加权限

      在文件AndroidManifest.xml中声明“android.permission.INTERNET”权限,否则会出“Web page not available” 错误。

      ● 在要显示的Activity中生成一个WebView组件:

            webView = new WebView(this);

         设置WebView基本信息:

         如果访问的页面中有JavaScript,则WebView必须设置支持JavaScript。

            webView.getSettings().setJavaScriptEnabled(true);

          还需要设置触摸焦点起作用:

            webView.requestFocus();

           并取消滚动条功能:

            webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

          ● 设置WebView要显示的网页:

          互联网用:

            webView.loadUrl("https://www.google.com");

          本地文件用:   

            webView.loadUrl("file:///android_asset/XX.html");

       (10)用WebView单击链接看了很多网页以后,如果不做任何处理,单击系统“Back”键,整个浏览器会调用finish()而结束自身。如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件,并覆盖Activity类的public boolean onKeyDown(int keyCode, KeyEvent event) 方法。

          根据上述做法可知,其实就是实现了一个继承于WebViewClient的类,例如下面的代码。

         public class  TestClient extends WebViewClient {
             @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                 Log.d("TestClient", url);
                 // TODO Auto-generated method stub
                 // TODO:在此添加url 处理代码,如果返回true,则WebView不会请求ActivityManager打开这个url
                //return super.shouldOverrideUrlLoading(view, url);
                return false;
            }
         }

            从此以后,就可以通过WebView.setWebViewClient()设置上述类的实例化对象即可,这也可以算是一种另类的HTML页面与Java之间的通信手段,甚至可以用在浏览器插件和Java程序之间的通信。

  • 相关阅读:
    错误处理和调试 C++快速入门30
    错误处理和调试 C++快速入门30
    虚继承 C++快速入门29
    多继承 C++快速入门28
    界面设计01 零基础入门学习Delphi42
    鱼C记事本 Delphi经典案例讲解
    界面设计01 零基础入门学习Delphi42
    虚继承 C++快速入门29
    linux系统中iptables防火墙管理工具
    linux系统中逻辑卷快照
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/7559400.html
Copyright © 2011-2022 走看看