webView(基本信息)
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、获取网站图标
//先在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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。