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

相關文章
相關標籤/搜索