设为首页 加入收藏

TOP

Android WebView使用深入浅出(一)
2015-07-16 12:55:45 来源: 作者: 【 】 浏览:20
Tags:Android WebView 使用 深入浅出

先说下WebView的一些优点:
?可以直接显示和渲染web页面,直接显示网页
?webview可以直接用html文件(网络上或本地assets中)作布局
?和java script交互调用


一、基本使用


首先layout中即为一个基本的简单控件:


? ? ? ? android:id="@+id/webView1"
? ? ? ? android:layout_width="fill_parent"
? ? ? ? android:layout_height="fill_parent"
? ? ? ? android:layout_marginTop="10dp" />


同时,因为要房访问网络,所以manifest中必须要加uses-permission:



在activity中即可获得webview的引用,同时load一个网址:


webview = (WebView) findViewById(R.id.webView1);
webview.loadUrl("http://www.baidu.com/");
//webview.reload();// reload page


这个时候发现一个问题,启动应用后,自动的打开了系统内置的浏览器,解决这个问题需要为webview设置 WebViewClient,并重写方法:


webview.setWebViewClient(new WebViewClient(){
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean shouldOverrideUrlLoading(WebView view, String url) {
? ? ? ? ? ? ? ? view.loadUrl(url);
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? });


若自己定义了一个页面加载进度的progressbar,需要展示给用户的时候,可以通过如下方式获取webview内页面的加载进度:


webview.setWebChromeClient(new WebChromeClient(){
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onProgressChanged(WebView view, int newProgress) {
? ? ? ? ? ? ? ? //get the newProgress and refresh progress bar
? ? ? ? ? ? }
? ? ? ? });


每个页面,都有一个标题,比如www.baidu.com这个页面的title即“百度一下,你就知道”,那么如何知道当前webview正在加载的页面的title呢:


webview.setWebChromeClient(new WebChromeClient(){
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onReceivedTitle(WebView view, String title) {
? ? ? ? ? ? ? ? titleview.setText(title);//a textview
? ? ? ? ? ? }
? ? ? ? });


二、通过webview控件下载文件


通常webview渲染的界面中含有可以下载文件的链接,点击该链接后,应该开始执行下载的操作并保存文件到本地中。webview来下载页面中的文件通常有两种方式:


1. 自己通过一个线程写java io的代码来下载和保存文件(可控性好)


2. 调用系统download的模块(代码简单)


方法一:


首先要写一个下载并保存文件的线程类


public class HttpThread extends Thread {



? ? private String mUrl;


? ? public HttpThread(String mUrl) {
? ? ? ? this.mUrl = mUrl;
? ? }
? ?
? ? @Override
? ? public void run() {
? ? ? ? URL url;
? ? ? ? try {
? ? ? ? ? ? url = new URL(mUrl);
? ? ? ? ? ? HttpURLConnection conn = (HttpURLConnection) url.openConnection();
? ? ? ? ? ? conn.setDoInput(true);
? ? ? ? ? ? conn.setDoOutput(true);
? ? ? ? ? ? InputStream in = conn.getInputStream();
? ? ? ? ? ?
? ? ? ? ? ? File downloadFile;
? ? ? ? ? ? File sdFile;
? ? ? ? ? ? FileOutputStream out = null;
? ? ? ? ? ? if(Environment.getExternalStorageState().equals(Environment.MEDIA_UNMOUNTED)){
? ? ? ? ? ? ? ? downloadFile = Environment.getExternalStorageDirectory();
? ? ? ? ? ? ? ? sdFile = new File(downloadFile, "test.file");
? ? ? ? ? ? ? ? out = new FileOutputStream(sdFile);
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? ? ? //buffer 4k
? ? ? ? ? ? byte[] buffer = new byte[1024 * 4];
? ? ? ? ? ? int len = 0;
? ? ? ? ? ? while((len = in.read(buffer)) != -1){
? ? ? ? ? ? ? ? if(out != null)
? ? ? ? ? ? ? ? ? ? out.write(buffer, 0, len);
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? ? ? //close resource
? ? ? ? ? ? if(out != null)
? ? ? ? ? ? ? ? out.close();
? ? ? ? ? ?
? ? ? ? ? ? if(in != null){
? ? ? ? ? ? ? ? in.close();
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ?
}



随后要实现一个DownloadListener接口,这个接口实现方法OnDownloadStart(),当用户点击一个可以下载的链接时,该回调方法被调用同时传进来该链接的URL,随后即可以对该URL塞入HttpThread进行下载操作:


//创建DownloadListener (webkit包)
class MyDownloadListenter implements DownloadListener{


? ? ? ? @Override
? ? ? ? public void onDownloadStart(String url, String userAgent,
? ? ? ? ? ? ? ? String contentDisposition, String mimetype, long contentLength) {
? ? ? ? ? ? System.out.println("url ==== >" + url);
? ? ? ? ? ? new HttpThread(url).start();
? ? ? ? }
? ? ? ?
? ? }


//给webview加入监听
webview.setDownloadListener(new MyDownloadListenter());



方法二:


直接发送一个action_view的intent即可:


class MyDown

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇EventBus框架在Android多Pane(Fra.. 下一篇Ruby 2.2 的增量垃圾收集机制

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: