webView(基本信息)

webView(基本信息)

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

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

使用WebView时需在AndroidManifest.xml添加以下权限,不然会出Web page not available错误。:java

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

设置WebView基本信息:android

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);

二、页内跳转

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

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

三、加载进度

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

四、错误处理

五、获取网站图标

参考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); } }

六、处理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; }

七、使用缓存

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");

2、难点重点

一、长按处理

/**
 * 处理长按弹出的上下文菜单事件,包括网页连接,图片连接等...
 */ 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 各菜单项事件处理  } };   }

二、播放flash

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

二、代码里设置支持flash播放ide

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"  .......  >

三、实现点击下载

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); } });

四、cookie保存

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

五、支持视频播放

能够参考这个项目

六、处理JS事件

3、疑难杂症

一、空白底部

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

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

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

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

二、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);

4、webkit剖析

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

相关文章
相关标签/搜索