WebView的使用

一、WebView简介:
  WebView组件本身是一个浏览器,它的内核基于开源WebKit引擎。Android系统自带的浏览器也是基于WebKit引擎实现。

二、WebView加载网页:

1.WebView的loadUrl(String url)方法的使用:
    webView.loadUrl(String url) ;                                                //加载指定URL的页面。
    webView.loadUrl("file:///android_asset/test.html");           //加载assets文件夹下的HTML页面。
    webView.loadUrl("file:///mnt/sdcard/test.html");              //加载SD卡下的HTML文件。
   
  如果test.html中有中文,则需要在html中设置下面的头字段,并保存为utf-8格式,否则会乱码。
   <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

  
2.WebView的loadData()与loadDataWithBaseURL()的使用:
  ① loadData(String data,String mimetype.String encoding) :
    webView.loadData(htmlString,"text/html","utf-8");     //会出现中文乱码
    解决方法:
    webView.loadData(htmlString,"text/html;charset=utf-8",null);  //无中文乱码
    webView.loadDataWithBaseURL(null, htmlString,"text/html", "utf-8", null);  //无中文乱码

②loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl):
  String baseURL="file:///mnt/sdcard/";
  String html="<html><body>"
    +"<h2> image from sdcard :</h2><br> "
    +"<h3>加载HTML文件</h3>"
    +"<img src='capture.jpg' />"
    +"</body></html>";
  //加载相对于根baseURL下的数据,capture.jpg保存在/mnt/sdcard/目录下 
  webView.loadDataWithBaseURL(baseURL, html, "text/html", "utf-8", null);
 //当test.html与html内容相同时,效果一样,capture.jpg保存在/mnt/sdcard/目录下 
 webView.loadUrl("file:///mnt/sdcard/test.html");

  ③两个方法的区别:
   loadData():不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使loadDataWithBaseURL,刷新时从缓存区读取。
   loadDataWithBaseURL():能加载图片,如果不传入URL,则刷新时会造成白屏,刷新时调用的是reLoad()方法,会重新加载URL,不传入URL时,默认是空。


三、使用WebView截取当前显示的页面:
 1.截图当前WebView显示的内容,并将图片输出到相应的文件夹中。
  Picture picture =webView.capturePicture();                //截取当前webView显示的内容
  int width =picture.getWidth();                                    //得到图片的宽、高
  int height=picture.getHeight();
 
  if(width>0 && height>0){
   //创建指定宽高的BItmap
   Bitmap bitmap =Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
   Canvas canvas =new Canvas(bitmap);                       //以固定大小的bitmap创建画布
   picture.draw(canvas);                                                //将picture画在canvas上
   
    //打开/data/data/包名/files文件下的输出流
    FileOutputStream fos =openFileOutput("capture.jpg", Context.MODE_PRIVATE);
   //或者打开SD卡的输出流
   File file =new File(Environment.getExternalStorageDirectory(),"capture.jpg");
   //String filePath=Environment.getExternalStorageDirectory().getPath()+"/capture.jpg";
    FileOutputStream fos =new FileOutputStream(file);
  // FileOutputStream fos =new FileOutputStream(filePath);
    //压缩bitmap到输出流,PNG代表无损的,90代表图片质量,数值越大质量越高。
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
    fos.close();
  
四、使用WebView处理页面浏览。
  1.WebSettings setting =webView.getSettings();        
     setting.setSupportZoom(true);                                           //设置支持缩放
     setting.setBuiltInZoomControls(true);                              //设置内置缩放装置      
     setting.setJavaScriptEnabled(true);                                 //设置JavaScript能调用Android方法

     webView.goBack();                                                           //后退
     webView.goForward();                                                     //前进
     webView.canGoBack();                                                      //是否能后退
     webView.canGoForward();                                                //是否能前进
     webView.zoomOut();                                                       //缩小网页
     webView.zoomIn();                                                          //放大网页
     webView.requestFocus();                                                //获取焦点
    
     webView.clearHistory();                                                  //清除历史记录
     webView.clearCache(boolean includeDiskFiles);            //清楚缓存
     webView.destroy();                                                         //销毁WebView

2.  WebViewClient:
当事情发生,影响呈现的内容,例如,错误或表单提交,也可以拦截URL加载。
 //打开网页时,覆盖而不是打开新的窗口 
   webView.setWebViewClient(new WebViewClient(){
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url);
         return true;  //返回true,处理此事件
   }
 //覆盖返回键,如果不覆盖返回键,则按返回时会退出整个WebView。
  @Override
   public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
    if(event.getKeyCode()==KeyEvent.KEYCODE_BACK){
     if(view.canGoBack()){   
       view.goBack();         //后退
     }
    }
    return true;
   }
  });

3.  WebChromeClient: 
这个类会影响浏览器用户界面发生的事情,例如,进度更新和JavaScript发送警报。
//设置窗口的进度条,范围from 0 to 10000
  getWindow().requestFeature(Window.FEATURE_PROGRESS);
  //requestWindowFeature(Window.FEATURE_PROGRESS);

webView.setWebChromeClient(new WebChromeClient(){
   //当WebView的进度改变时更新窗口进度条
   @Override
   public void onProgressChanged(WebView view, int newProgress) {
       //Activity的进度范围是0-10000,newProgress是0-100
        MainActivity.this.setProgress(newProgress*100);
   }
  });


五、使用WebView与JavaScript进行交互:
      ①
开启JavaScript调用:
webView.getSettings()
.setJavaScriptEnabled(true);
      ②将MyObject对象暴露给JavaScript:
webView.addJavascriptInterface(new MyObject(this), "js");
      ③在被调用的方法上添加:  @JavascriptInterface   。
 
      简单的示例:

public class MainActivity extends Activity {
 
 private WebView webView;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  webView=(WebView) findViewById(R.id.webView);
 
  //加载assets文件夹下的HTML页面
  webView.loadUrl("file:///android_asset/test.html");
  //得到WebSettings对象
  WebSettings setting =webView.getSettings();
  //开启JavaScript调用
  setting.setJavaScriptEnabled(true);
 //设置默认utf-8格式
  setting.setDefaultTextEncodingName("utf-8");
  //将MyObject对象暴露给JavaScript
  webView.addJavascriptInterface(new MyObject(this), "js");            //方法一
 
  webView.addJavascriptInterface(new Object(){                               //方法二:
   
   @JavascriptInterface             //只需要在被调用的方法上添加
   public void showToast(String name){
   
    Toast.makeText(MainActivity.this, name+",您好!", Toast.LENGTH_SHORT).show();
   }
   public void showDialog(){
    final String [] str ={"张三","李四","王五"};
    new AlertDialog.Builder(MainActivity.this).setTitle("姓名列表")
    .setIcon(R.drawable.ic_launcher).setItems(str, new OnClickListener() {
     
     @Override
     public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(MainActivity.this, "您点击了"+str[which], Toast.LENGTH_SHORT).show();
     }
    }).setPositiveButton("确定", null).create().show();
   }
  },"js1");
 
 }
 
 /**
  *
  * 自定义类
  */
 class MyObject {
 
  private Context context;
  public MyObject(Context context){
   this.context=context;
  }
  /**
   * 显示吐司
   * @param name
   */
  @JavascriptInterface        
  public void showToast(String name){
   
   Toast.makeText(context, name+",您好!", Toast.LENGTH_SHORT).show();
  }
  /**
   * 显示姓名列表
   */
  @JavascriptInterface  
  public void showDialog(){
   final String [] str ={"张三","李四","王五"};
   new AlertDialog.Builder(context).setTitle("姓名列表")
   .setIcon(R.drawable.ic_launcher).setItems(str, new OnClickListener() {
   
    @Override
    public void onClick(DialogInterface dialog, int which) {
     Toast.makeText(context, "您点击了"+str[which], Toast.LENGTH_SHORT).show();
    }
   }).setPositiveButton("确定", null).create().show();
  }
 }
}

test.html 代码:需要保存为utf-8格式,否则中文乱码。
  <html>
<head>
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
  <input type="button" value="showToast" οnclick="js.showToast('张三');" />
   
  <input type="button" value="showDialog" οnclick="js.showDialog();"   />
  <input type="button" value="showToast" οnclick="js1.showToast('李四');" />
   
</body>
</html>








    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值