文档章节

webView(基本信息)

andyhe91
 andyhe91
发布于 2015/05/20 11:52
字数 1195
阅读 273
收藏 0

webView(基本信息)

2014-12-05 09:57:52| 发布人:android_Zero| 浏览(377)| 评论(0)

WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等。

使用WebView时需在AndroidManifest.xml添加如下权限,否则会出Web page not available错误。:

<uses-permission android:name="android.permission.INTERNET" />   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />(有的甚至要加这个权限)

设置WebView基本信息:

mWebview.getSettings().setJavaScriptEnabled(true);//设置支持Javascript requestFocus();//如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。 this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);  
mWebView.loadUrl(“http://www.google.com“); //互联网用 mWebView.loadUrl(“file:///android_asset/XX.html“);//本地文件用 本地文件存放在:assets文件中

一、基本用法

1、设置缩放页面自适应

ws.setSupportZoom(true); // support zoom //ws.setDefaultZoom(WebSettings.ZoomDensity.FAR) ; ws.setBuiltInZoomControls(true);   //page auto adapter ws.setUseWideViewPort(true); ws.setLoadWithOverviewMode(true);

2、页内跳转

WebView添加一个事件监&听对象(WebViewClient)并重写其中的一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。

mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边 view.loadUrl(url); return true; }

3、加载进度

//此方法可以处理webview 在加载时和加载完成时一些操作 mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { if(newProgress==100){ // 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作 title.setText(“加载完成”); }else{ title.setText(“加载中…….”); } } });

4、错误处理

5、获取网站图标

参考stackoverflow.

//先在onCreate()方法里设置icon存储的路径 WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath());   //再设置webview的WebChromeClient mWebView.setWebChromeClient(new MyWebChromeClient());   //最后MyWebChromeClient中重写以下方法 @Override public void onReceivedIcon(WebView view, Bitmap icon) { if(icon != null ){ mIconImgeView.setImageBitmap(icon); } }

6、处理back键

如果用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; }

7、使用缓存

WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 优先使用缓存 //WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存  
  //退出时删除缓存,可放到 OnDestory()方法里   File file = CacheManager.getCacheFileBaseDir(); if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete(); } file.delete(); }  
mWebView.clearCache(true); context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");

二、难点重点

1、长按处理

/**
 * 处理长按弹出的上下文菜单事件,包括网页链接,图片链接等...
 */ class Hao123ContextMenuListener implements OnCreateContextMenuListener{ @Override public void onCreateContextMenu(ContextMenu menu, View v,
		ContextMenuInfo menuInfo) { HitTestResult result = ((WebView)v).getHitTestResult() ; if(null == result) return ;   int type = result.getType(); if (type == WebView.HitTestResult.UNKNOWN_TYPE) return;   if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { // let TextView handles context menu return; }  
	 MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.browser_menu, menu);   // Show the correct menu group String extra = result.getExtra(); menu.setGroupVisible(R.id.PHONE_MENU,
	   type == WebView.HitTestResult.PHONE_TYPE); menu.setGroupVisible(R.id.EMAIL_MENU,
	   type == WebView.HitTestResult.EMAIL_TYPE); menu.setGroupVisible(R.id.GEO_MENU,
	   type == WebView.HitTestResult.GEO_TYPE); menu.setGroupVisible(R.id.IMAGE_MENU,
	   type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); menu.setGroupVisible(R.id.ANCHOR_MENU,
	   type == WebView.HitTestResult.SRC_ANCHOR_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);   // Setup custom handling depending on the type Intent intent; switch (type) { case WebView.HitTestResult.PHONE_TYPE: //处理拨号 break; case WebView.HitTestResult.EMAIL_TYPE: //处理Email break; case WebView.HitTestResult.GEO_TYPE: //TODO break; case WebView.HitTestResult.SRC_ANCHOR_TYPE: case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项  break; default: break; } }   private OnMenuItemClickListener menuItemListener = new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // TODO 各菜单项事件处理  } };   }

2、播放flash

1、判断是否安装了flash,若没有跳转到市场安装 http://blog.csdn.net/zircon_1973/article/details/8067041

2、代码里设置支持flash播放

WebSettings ws = mWebView.getSettings(); ws.setJavaScriptEnabled(true) ; ws.setPluginsEnabled(true); //Flash support if(DeviceInfo.getSDKVersionNumber()>7){ //flash support since android 2.2  ws.setPluginState(PluginState.ON); ws.setAllowFileAccess(true); }

AndroidManifest里相应的Activity加上如下代码:

   android:name=".BrowserActivity"  ......  android:hardwareAccelerated="true"  .......  >

3、实现点击下载

mWebView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) { //实现下载的代码,这里跳转到其他浏览器下载 Uri uri = Uri.parse(url); // Uri uri = Uri.parse("http://www.abc.com/a.apk");如果只下载单个文件 Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); } });

4、cookie保存

http://blog.csdn.net/jdsjlzx/article/details/7761333

5、支持视频播放

可以参考这个项目

6、处理JS事件

三、疑难杂症

1、空白底部

垂直滚动条总是显示白色轨迹底图(无法消掉) 在xml中给WebView设置一下属性发觉不起一点作用:

android:fadeScrollbars = "true" android:scrollbarStyle = "outsideOverlay" android:scrollbarAlwaysDrawVerticalTrack = "false"

必须在代码中对WebView进行设置才能奏效:

webview .setScrollbarFadingEnabled( true ); webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );

2、Uncaught TypeError

E/Web Console(804): Uncaught TypeError: Cannot call method 'getItem' of null at http://z.cdn.turner.com/cnn/tmpl_asset/static/mobile_phone/2273/js/global-min.js:3

加上以下这句即可:

WebSettings settings = webView.getSettings(); settings.setDomStorageEnabled(true);

四、webkit剖析

1、http://mogoweb.net/categories/webkit-research


© 著作权归作者所有

共有 人打赏支持
andyhe91
粉丝 58
博文 129
码字总数 209109
作品 0
长沙
私信 提问
Android WebView 问题总集

1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。   在Androidmanifest.xml文件中添加         2、在要Activit......

zchd
2013/03/28
0
0
Android WebView 总结

文章来源: http://www.eoeandroid.com/thread-25177-1-1.html 1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。 2、在......

无鸯
2011/08/26
7.4K
5
有关WebView开发问题

如何创建WebView: 1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。 2、在要Activity中生成一个WebView组件:WebView w......

无鸯
2011/11/09
733
0
android web view

1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。 2、在要Activity中生成一个WebView组件:WebView webView = new Web......

手绘灿烂
2014/03/13
0
0
Android WebView总结

1、添加权限:AndroidManifest.xml中必须使用许可"Android.permission.INTERNET",否则会出web page not available错误。 2、在要Activity中生成一个WebView组件:WebView webView = new Web......

android技术开发
2013/08/12
113
0

没有更多内容

加载失败,请刷新页面

加载更多

第11章 多线程

程序、进程、线程 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 **进程(process)**是程序的一次执行过程或是正在运行的一个程序。动...

流小文
11分钟前
0
0
SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部