原文:http://ping8080.iteye.com/blog/1019362
webview总结:
1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
在Androidmanifest.xml文件中添加 |
|
<uses-permission android:name= "android.permission.INTERNET" /> |
</manifest> |
2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
3、设置WebView基本信息:
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用
requestFocus();
取消滚动条
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4、设置WevView要显示的网页:
互联网用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl(file:///android_asset/xx.html);固定格式
本地文件存放在:assets文件中
5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
给WebView添加一个事件监听对象(WebViewClient)
并重写其中的一些方法
shouldOverrideUrlLoading:对网页中超链接按钮的响应。
当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
public boolean onKeyDown( int keyCoder,KeyEvent event ){ |
if (webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){ |
webview.goBack(); //goBack()表示返回webView的上一页面 |
return true ; |
} |
return false ; |
} |
webview控件返回事件 :
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if ((keyCode == KeyEvent.KEYCODE_BACK)
&& webView.canGoBack()) {
webView.goBack();
return true;
}
}
return false;
}
});
String strURI = ("file:///android_asset/first/first.html"); //本地文件
// String strURI="http://www.baidu.com"; //网络文件
//String strURI="content://com.android.htmlfileprovider/sdcard/index.html"; //打开本地sd卡内的index.html文件
final WebView mWebView;
mWebView = new WebView(this);
mWebView.loadUrl(strURI);
mWebView.setWebViewClient(new WebViewClient() {
// 得到请求时的错误 提示
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
System.out.println("2222222222222222222222222222222"
+ errorCode);
}
// 打开连接前的事件
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebView.loadUrl(strURI1);
return false;
}
});
webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);//滚动条风格
setContentView(webView);
webView.setWebViewClient(new ViewClient());
webView.getSettings().setJavaScriptEnabled(true);//js可用
webView.getSettings().setPluginsEnabled(true);//设置支持flash插件
webView.getSettings().setLoadsImagesAutomatically(true); //自动加载图片
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//设置缓存模式
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);//设置页面固定大小
webView.getSettings().setBuiltInZoomControls(true); //支持多点触摸
原文:http://androiddada.iteye.com/blog/1280946
在做Webview显示服务器的html功能时 需要加入离线功能。
开始思路很狭隘,以为一定应该是从服务器得到的html文件,下载到本地后加载~
但是这样不能离线查看图片,因为图片数据并不再html中,只是连接地址。
后来,经过上网各种搜寻学习,发现原来Webview有自己的缓存,如图:
在手机本地 data/data/包名/cache/webviewCache 中放的是Webview显示过的图片。我们可以把它导出,后缀改成对应图片的格式 打开看看~
而databases中的webviewCache.db 中放的就是图片地址和图片名字对应等信息 的表~ 导出后也可用SQLite Database Browser 等工具查看
1.优先缓存
好了,这里你是不是想问:既然这些图片已经存在手机缓存里面了,为什么Webview不能再把它显示出来呢?
这里我们需要设置下:
WebSettings webSettings= webView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 默认不使用缓存!
LOAD_CACHE_ELSE_NETWORK的意思是:
Use cache if content is there, even if expired (eg, history nav) If it is not in the cache, load from network. Use withsetCacheMode(int)
.
如果内容已经存在cache 则使用cache,即使是过去的历史记录。如果cache中不存在,从网络中获取!
所以加上这句,不仅可以使用cache离线显示用户浏览过的内容,还可以在有网络的情况下优先调用缓存,为用户减少流量!~
我有些费解的是,这个设置在我看来是很有利于用户体验的 为什么google不把它设置成默认的呢? 还需要开发者手动打开。猜想可能是因为相同页面可能会更新的原因!
如果离线加载出现乱码 可参考: http://androidturing.iteye.com/blog/1280656
2.缓存管理:
(1)clearCacheFolder(Activity.getCacheDir(), System.currentTimeMillis());//删除此时之前的缓存.
- // clear the cache before time numDays
- 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) {
- e.printStackTrace();
- }
- }
- return deletedFiles;
- }
(2) 退出应用前删除缓存的方法!
- File file = CacheManager.getCacheFileBaseDir();
- if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete();
- }
- file.delete();
- }
- context.deleteDatabase("webview.db");
- context.deleteDatabase("webviewCache.db");