1. 打開網頁時不調用系統瀏覽器, 而是在本WebView中顯示:
mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
2. 通過java代碼調用javascript
WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { webview.loadUrl("javascript:wave()"); } }); } }, "demo");
3. 按返回鍵時, 不退出程序而是返回上一瀏覽頁面:
public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }
4. 打開頁面時, 自適應屏幕:
WebSettings webSettings = mWebView .getSettings(); webSettings.setUseWideViewPort(true);//設置此屬性,可任意比例縮放 webSettings.setLoadWithOverviewMode(true);
5. 便頁面支持縮放:
WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true); webSettings.setSupportZoom(true);
6.如果webView中需要用戶手動輸入用戶名、密碼或其他,則webview必須設置支持獲取手勢焦點。
webview.requestFocusFromTouch();
7.WebView 加載界面主要調用三個方法:LoadUrl、LoadData、LoadDataWithBaseURL.
1、LoadUrl 直接加載網頁、圖片並顯示.(本地或是網絡上的網頁、圖片、gif) 2、LoadData 顯示文字與圖片內容 (模擬器1.5、1.6) 3、LoadDataWithBase 顯示文字與圖片內容(支持多個模擬器版本)
8.WebSettings 的常用方法介紹
setJavaScriptEnabled(true); //支持js setPluginsEnabled(true); //支持插件 setUseWideViewPort(false); //將圖片調整到適合webview的大小 setSupportZoom(true); //支持縮放 setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持內容重新佈局 supportMultipleWindows(); //多窗口 setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關閉webview中緩存 setAllowFileAccess(true); //設置可以訪問文件 setNeedInitialFocus(true); //當webview調用requestFocus時爲webview設置節點 webview webSettings.setBuiltInZoomControls(true); //設置支持縮放 setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 setLoadWithOverviewMode(true); // 縮放至屏幕的大小 setLoadsImagesAutomatically(true); //支持自動加載圖片
9.WebViewClient 的方法全解
doUpdateVisitedHistory(WebView view, String url, boolean isReload) //(更新歷史記錄) onFormResubmission(WebView view, Message dontResend, Message resend) //(應用程序重新請求網頁數據) onLoadResource(WebView view, String url) // 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。 onPageStarted(WebView view, String url, Bitmap favicon) //這個事件就是開始載入頁面調用的,通常我們可以在這設定一個loading的頁面,告訴用戶程序在等待網絡響應。 onPageFinished(WebView view, String url) //在頁面加載結束時調用。同樣道理,我們知道一個頁面載入完成,於是我們可以關閉loading 條,切換程序動作。 onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (報告錯誤信息) onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(獲取返回信息授權請求) onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重寫此方法可以讓webview處理https請求。 onScaleChanged(WebView view, float oldScale, float newScale) // (WebView發生改變時調用) onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加載時調用) shouldOverrideKeyEvent(WebView view, KeyEvent event)//重寫此方法才能夠處理在瀏覽器中的按鍵事件。 shouldOverrideUrlLoading(WebView view, String url) //在點擊請求的是鏈接是纔會調用,重寫此方法返回true表明點擊網頁裏面的鏈接還是在當前的webview裏跳轉,不跳到瀏覽器那邊。這個函數我們可以做很多操作,比如我們讀取到某些特殊的URL,於是就可以不打開地址,取消這個操作。我們可以截取點擊的鏈接地址,並對它重新定向。
-------------------------------------------------------------另一種角度------------------------------------------------------------
一、WebView基於webkit引擎展現web頁面的控件,使用前需要在Android Manifest file中配置internet訪問權限,否則提示頁面無法訪問。
- <</span>manifest
... ><</span>uses-permission android:name="android.permission.INTERNET" /> ... - </</span>manifest>
二、WebView屬性的設置
1、設置WebSettings類 WebSettings用來對WebView的配置進行配置和管理,比如是否可以進行文件操作、緩存的設置、頁面是否支持放大和縮小、是否允許使用數據庫api、字體及文字編碼設置、是否允許js腳本運行、是否允許圖片自動加載、是否允許數據及密碼保存等等 示例代碼如下:
- WebSettings
webSettings = mWebView.getSettings(); - webSettings.setJavaScriptEnabled(true);
- webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
- webSettings.setDomStorageEnabled(true);
- webSettings.setDatabaseEnabled(true);
- webSettings.setAppCacheEnabled(true);
- webSettings.setAllowFileAccess(true);
- webSettings.setSavePassword(true);
- webSettings.setSupportZoom(true);
- webSettings.setBuiltInZoomControls(true);
- webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
- webSettings.setUseWideViewPort(true);
- mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
- mWebView.setHorizontalScrollbarOv
erlay(true); - mWebView.setHorizontalScrollBarEn
abled(true); - mWebView.requestFocus();
2、設置WebChromeClient子類 WebChromeClient會在一些影響瀏覽器ui交互動作發生時被調用,比如WebView關閉和隱藏、頁面加載進展、js確認框和警告框、js加載前、js操作超時、webView獲得焦點等等
mWebView.setWebChromeClient(new
MyWebChromeClient()); 3、設置WebViewClient子類
WebViewClient會在一些影響內容渲染的動作發生時被調用,比如表單的錯誤提交需要重新提交、頁面開始加載及加載完成、資源加載中、接收到https認證需要處理、頁面鍵盤響應、頁面中的url打開處理等等
4、設置addJavascriptInterface方法mWebView.setWebViewClient(newMyWebViewClient()); 使Js調用Native本地Java對象,實現本地Java代碼和HTML頁面進行交互, 注意:因爲安全問題的考慮 Google在使用Android API 17以上的版本的時候 需要通過@JavascriptInterface來註解的Java函數才能被識別可以被Js調用。
三、設置當前網頁的鏈接仍在WebView中跳轉,而不是跳到手機瀏覽器裏顯示,
在WebViewClient的子類中重寫shouldOverrideUrlLoading 函數 代碼如下: shouldOverrideUrlLoading
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading (WebView view, String url) { view.loadUrl(url); return true; } - });
表示當前webView中的一個新url需要加載時,給當前應用程序一個處理機會,如果沒有重寫此函數,webView請求ActivityManage選擇合適的方式處理請求,就像彈出uc和互聯網讓用戶選擇瀏覽器一樣。重寫後return true表示讓當前程序處理,return false表示讓當前webView處理 四、設置開始加載網頁、加載完成、加載錯誤時處理 在WebViewClient子類中分別重寫如下父類函數 代碼如下: 五、處理https請求,爲WebView處理ssl證書設置
- webView.setWebViewClient(new
WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // 開始加載網頁時處理 如:顯示"加載提示" 的加載對話框 DialogManager.showLoadingDialog(this); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 網頁加載完成時處理 如:讓 加載對話框 消失 DialogManager.dismissLoadingDialog(); } @Override public void onReceivedError(WebView intview, errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); // 加載網頁失敗時處理 如: view.loadDataWithBaseURL(null, , "網頁加載失敗" "text/html", "utf-8", null); } - });
WebView默認是不處理https請求的,頁面顯示空白,需要進行如下設置 在WebViewClient子類中重寫父類的onReceivedSslError函數 代碼如下:
- webView.setWebViewClient(new
WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // 接受信任所有網站的證書 // handler.cancel(); // 默認操作 不處理 // handler.handleMessage(null); // 可做其他處理 } - });
六、顯示頁面加載進度在WebChromeClient子類中重寫父類的onProgressChanged函數 代碼如下: onProgressChanged通知應用程序當前頁面加載的進度 progress表示當前頁面加載的進度,爲1至100的整數 七、back鍵控制網頁後退
- webView.setWebChromeClient(new
WebChromeClient() { public void onProgressChanged(WebView intview, progress) { setTitle("頁面加載中,請稍候..." + "%");progress + setProgress(progress * 100); if (progress 100)== { setTitle(R.string.app_name); } } - });
Activity默認的back鍵處理爲結束當前Activity,WebView查看了很多網頁後,希望按back鍵返回上一次瀏覽的頁面,這個時候我們就需要覆蓋WebView所在Activity的onKeyDown函數,告訴他如何處理,代碼如下: 其中webView.canGoBack()在webView含有一個可後退的瀏覽記錄時返回true webView.goBack();表示返回至webView的上次訪問頁面。
- public
boolean onKeyDown( intkeyCode, KeyEvent event) { if (webView.canGoBack() 0)&& event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == { webView.goBack(); return true; } return super.onKeyDown(keyCode, event); - }
八、使用addJavascriptInterface完成和js交互 1、Js中調Native本地Java方法
設置webView的addJavascriptInterface方法,該方法有兩個參數,第一個參數爲被綁定到js中的類實例,第二個參數爲在js中暴露的類別名,在js中引用java對象就是用這個名字 在Native Java代碼如下: 在HTML中Js調用Native方法 代碼如下:
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.addJavascriptInterface(new
JavaScriptInterface( this),"Android"); - class
JavaScriptInterface{ Context mContext; JavaScriptInterface(Context c) { mContext = c; } @JavascriptInterface public void showToast(String toast) { Log.d("TAG", "Js Invoker );Native Function" Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } - }
2、Java調Js方法 比如在HTML中有如下Js函數
- <</span>input
type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> - <</span>script
type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } - </</span>script>
在Native調Js方法如下:
- "text/javascript">
function showAlert() { alert("Be executed );by Native" }
- mWebView.loadUrl("javascript:showAlert()");
九、WebView緩存模式的設置 1、網頁數據緩存 當使用WebView加載HTML網頁時,會在我們data/應用package下生成database與cache兩個文件夾: 我們請求的Url記錄是保存在webviewCache.db裏,而url的內容是保存在webviewCache文件夾下. 五種緩存模式的設置setCacheMode: LOAD_CACHE_ONLY:不使用網絡,只讀取本地緩存數據。 LOAD_DEFAULT: 根據cache-control決定是否從網絡上取數據。 LOAD_CACHE_NORMAL: API level 17中已經廢棄, 從API level 11開始作用同LOAD_DEFAULT模式。 LOAD_NO_CACHE: 不使用緩存,只從網絡獲取數據。 LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數據。 如示例代碼:
- WebSettings
webSettings = mWebView.getSettings(); - webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
//設置 緩存模式 - //
開啓 DOM storage API 功能 - webSettings.setDomStorageEnabled(true);
- //開啓
database storage API 功能 - webSettings.setDatabaseEnabled(true);
2、H5緩存
通過setAppCacheEnabled(boolean flag)設置H5的緩存是否打開,默認關閉。
根據setAppCachePath(String appCachePath)提供的路徑,在H5使用緩存過程中生成的緩存文件。
通過setAppCacheMaxSize(long appCacheMaxSize)設置緩存最大容量。
如示例代碼:
- String
cacheDirPath "/webViewCache= getCacheDir().getAbsolutePath()+ " ;- WebSettings
webSettings = mWebView.getSettings(); - //開啓
database storage API 功能 - webSettings.setDatabaseEnabled(true);
- //設置數據庫緩存路徑
- webSettings.setDatabasePath(cacheDirPath);
- //開啓Application
H5 Caches 功能 - webSettings.setAppCacheEnabled(true);
- //設置Application
Caches 緩存目錄 - webSettings.setAppCachePath(cacheDirPath);
十、加快HTML網頁加載完成速度默認情況html代碼下載到WebView後,webkit開始解析網頁各個節點,發現有外部樣式文件或者外部腳本文件時,會異步發起網絡請求下載文件,但如果在這之前也有解析到image節點,那勢必也會發起網絡請求下載相應的圖片。在網絡情況較差的情況下,過多的網絡請求就會造成帶寬緊張,影響到css或js文件加載完成的時間,造成頁面空白loading過久。解決的方法就是告訴WebView先不要自動加載圖片,等頁面finish後再發起圖片加載。 故在WebView初始化時設置如下代碼: 同時在WebView的WebViewClient子類中重寫onPageFinished()方法添加如下代碼:
- public
void int () { if(Build.VERSION.SDK_INT >= 19){ webView.getSettings().setLoadsImagesAutomatica lly(true); } else { webView.getSettings().setLoadsImagesAutomatica lly(false); } - }
從上面的代碼,可以看出我們對系統API在19以上的版本作了兼容。因爲4.4以上系統在onPageFinished時再恢復圖片加載時,如果存在多張圖片引用的是相同的src時,會只有一個image標籤得到加載,因而對於這樣的系統我們就先直接加載。
- @Override
- public
void onPageFinished(WebView view, String url) { if(!webView.getSettings().getLoadsImagesAutomatica lly()) { webView.getSettings().setLoadsImagesAutomatica lly(true); } - }
十一、WebView硬件加速導致頁面渲染閃爍問題解決方法
關於Android硬件加速 開始於Android 3.0 (API level 11),在四個級別上開啓/關閉硬件加速 1、Application級別:爲整個應用程序開啓硬件加速,在AndroidManifest中加入如下配置
- <</span>application
android:hardwareAccelerated="true" ... >2、Activity級別:控制每個activity是否開啓硬件加速,只需在activity元素中添加android:hardwareAccelerated屬性即可
- <</span>activity
android:hardwareAccelerated="true" ... >3、Window級別:注:目前還不支持在Window級別上關閉硬件加速
- getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 4、View級別:運行時單個view硬件加速,目前Android還不支持在View級別開啓硬件加速 代碼如下:
- mView.setLayerType(View.LAYER_TYPE_SOFTWARE,
null);
[//TODO 關於Android硬件加速 小呂有時間會更詳細的單獨整理成一篇來做介紹 先提供學習地址:http://android.toolib.net/guide/topics/graphics/hardware-accel.html ] 我們開啓硬件加速後,WebView渲染頁面更加快速,拖動也更加順滑。但有個副作用就是容易會出現頁面加載白塊同時界面閃爍現象。解決這個問題的方法是設置WebView暫時關閉硬件加速 代碼如下: 十二、其他注意事項:
- if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); - }
1> 從網絡上下載html頁面的過程應放在工作線程(後臺線程)中 2> html下載成功後渲染出html的步驟應放在UI主線程,不然WebView加載網頁過程會容易報錯