如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。
希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯誤,請一定指出,以免誤導(dǎo)大家、也誤導(dǎo)我。
本文來自:http://www.jianshu.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注。
WebView在現(xiàn)在的項目中使用的頻率應(yīng)該還是非常高的。
我個人總覺得HTML5是一種趨勢。找了一些東西,在此總結(jié)。
本篇最后有一個非常不錯 的 Html5Activity 加載類,不想看的可以直接跳下載。
WebSettings webSettings = mWebView .getSettings();//支持獲取手勢焦點,輸入用戶名、密碼或其他webview.requestFocusFromTouch();setJavaScriptEnabled(true); //支持jssetPluginsEnabled(true); //支持插件 設(shè)置自適應(yīng)屏幕,兩者合用setUseWideViewPort(true); //將圖片調(diào)整到適合webview的大小 setLoadWithOverviewMode(true); // 縮放至屏幕的大小setSupportZoom(true); //支持縮放,默認(rèn)為true。是下面那個的前提。setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件。 若上面是false,則該WebView不可縮放,這個不管設(shè)置什么都不能縮放。setDisplayZoomControls(false); //隱藏原生的縮放控件setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持內(nèi)容重新布局 supportMultipleWindows(); //多窗口 setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關(guān)閉webview中緩存 setAllowFileAccess(true); //設(shè)置可以訪問文件 setNeedInitialFocus(true); //當(dāng)webview調(diào)用requestFocus時為webview設(shè)置節(jié)點setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 setLoadsImagesAutomatically(true); //支持自動加載圖片setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式
加載一個網(wǎng)頁:
webView.loadUrl("http://www.google.com/");
加載apk包中的一個html頁面
webView.loadUrl("file:///android_asset/test.html");
加載手機本地的一個html頁面的方法:
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
WebViewClient就是幫助WebView處理各種通知、請求事件的。
打開網(wǎng)頁時不調(diào)用系統(tǒng)瀏覽器, 而是在本W(wǎng)ebView中顯示:
mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
WebViewClient 方法
WebViewClient mWebViewClient = new WebViewClient() { shouldOverrideUrlLoading(WebView view, String url) 最常用的,比如上面的。 //在網(wǎng)頁上的所有加載都經(jīng)過這個方法,這個函數(shù)我們可以做很多操作。 //比如獲取url,查看url.contains(“add”),進行添加操作 shouldOverrideKeyEvent(WebView view, KeyEvent event) //重寫此方法才能夠處理在瀏覽器中的按鍵事件。 onPageStarted(WebView view, String url, Bitmap favicon) //這個事件就是開始載入頁面調(diào)用的,我們可以設(shè)定一個loading的頁面,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。 onPageFinished(WebView view, String url) //在頁面加載結(jié)束時調(diào)用。同樣道理,我們可以關(guān)閉loading 條,切換程序動作。 onLoadResource(WebView view, String url) // 在加載頁面資源時會調(diào)用,每一個資源(比如圖片)的加載都會調(diào)用一次。 onReceivedError(WebView view, int errorCode, String description, String failingUrl) // (報告錯誤信息) doUpdateVisitedHistory(WebView view, String url, boolean isReload) //(更新歷史記錄) onFormResubmission(WebView view, Message dontResend, Message resend) //(應(yīng)用程序重新請求網(wǎng)頁數(shù)據(jù)) onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm) //(獲取返回信息授權(quán)請求) onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重寫此方法可以讓webview處理https請求。 onScaleChanged(WebView view, float oldScale, float newScale) // (WebView發(fā)生改變時調(diào)用) onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加載時調(diào)用) }
將上面定義的WebViewClient設(shè)置給WebView:
webView.setWebViewClient(webViewClient);
WebChromeClient是輔助WebView處理Javascript的對話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進度等 :
方法中的代碼都是由Android端自己處理。
WebChromeClient mWebChromeClient = new WebChromeClient() { //獲得網(wǎng)頁的加載進度,顯示在右上角的TextView控件中 @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress < 100) { String progress = newProgress + "%"; } else { } } //獲取Web頁中的title用來設(shè)置自己界面中的title //當(dāng)加載出錯的時候,比如無網(wǎng)絡(luò),這時onReceiveTitle中獲取的標(biāo)題為 找不到該網(wǎng)頁, //因此建議當(dāng)觸發(fā)onReceiveError時,不要使用獲取到的title @Override public void onReceivedTitle(WebView view, String title) { MainActivity.this.setTitle(title); } @Override public void onReceivedIcon(WebView view, Bitmap icon) { // } @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { // return true; } @Override public void onCloseWindow(WebView window) { } //處理alert彈出框,html 彈框的一種方式 @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { // return true; } //處理confirm彈出框 @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { // return true; } //處理prompt彈出框 @Override public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { // return true; }};
同樣,將上面定義的WebChromeClient設(shè)置給WebView:
webView.setWebChromeClient(mWebChromeClient);
WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(getHtmlObject(), "jsObj");
上面這是前提!?。?/strong>
然后實現(xiàn)上面的方法。
private Object getHtmlObject(){ Object insertObj = new Object(){ //給html提供的方法,js中可以通過:var str = window.jsObj.HtmlcallJava(); 獲取到 public String HtmlcallJava(){ return "Html call Java"; } //給html提供的有參函數(shù) : window.jsObj.HtmlcallJava2("IT-homer blog"); public String HtmlcallJava2(final String param){ return "Html call Java : " + param; } //Html給我們提供的函數(shù) public void JavacallHtml(){ runOnUiThread(new Runnable() { @Override public void run() { //這里是調(diào)用方法 mWebView.loadUrl("javascript: showFromHtml()"); Toast.makeText(JSAndroidActivity.this, "clickBtn", Toast.LENGTH_SHORT).show(); } }); } //Html給我們提供的有參函數(shù) public void JavacallHtml2(final String param){ runOnUiThread(new Runnable() { @Override public void run() { mWebView.loadUrl("javascript: showFromHtml2('IT-homer blog')"); Toast.makeText(JSAndroidActivity.this, "clickBtn2", Toast.LENGTH_SHORT).show(); } }); } }; return insertObj;}
Android 調(diào)用js有個漏洞:
http://blog.csdn.net/leehong2005/article/details/11808557
前進、后退
goBack () //后退goForward ()//前進goBackOrForward (int steps) //以當(dāng)前的index為起始點前進或者后退到歷史記錄中指定的steps, 如果steps為負(fù)數(shù)則為后退,正數(shù)則為前進canGoForward () //是否可以前進canGoBack () //是否可以后退
清除緩存數(shù)據(jù):
clearCache(true); //清除網(wǎng)頁訪問留下的緩存,由于內(nèi)核緩存是全局的因此這個方法不僅僅針對webview而是針對整個應(yīng)用程序.clearHistory () //清除當(dāng)前webview訪問的歷史記錄,只會webview訪問歷史記錄里的所有記錄除了當(dāng)前訪問記錄.clearFormData () //這個api僅僅清除自動完成填充的表單數(shù)據(jù),并不會清除WebView存儲到本地的數(shù)據(jù)。
WebView的狀態(tài):
onResume () //激活WebView為活躍狀態(tài),能正常執(zhí)行網(wǎng)頁的響應(yīng)onPause () //當(dāng)頁面被失去焦點被切換到后臺不可見狀態(tài),需要執(zhí)行onPause動過, onPause動作通知內(nèi)核暫停所有的動作,比如DOM的解析、plugin的執(zhí)行、JavaScript執(zhí)行。pauseTimers () //當(dāng)應(yīng)用程序被切換到后臺我們使用了webview, 這個方法不僅僅針對當(dāng)前的webview而是全局的全應(yīng)用程序的webview,它會暫停所有webview的layout,parsing,javascripttimer。降低CPU功耗。resumeTimers () //恢復(fù)pauseTimers時的動作。destroy () //銷毀,關(guān)閉了Activity時,音樂或視頻,還在播放。就必須銷毀。
但是注意:
webview調(diào)用destory時,webview仍綁定在Activity上.這是由于自定義webview構(gòu)建時傳入了該Activity的context對象,因此需要先從父容器中移除webview,然后再銷毀webview:
rootLayout.removeView(webView); webView.destroy();
判斷WebView是否已經(jīng)滾動到頁面底端 或者 頂端:
getScrollY() //方法返回的是當(dāng)前可見區(qū)域的頂端距整個頁面頂端的距離,也就是當(dāng)前內(nèi)容滾動的距離.
getHeight()或者getBottom() //方法都返回當(dāng)前WebView 這個容器的高度
getContentHeight() 返回的是整個html 的高度,但并不等同于當(dāng)前整個頁面的高度,因為WebView 有縮放功能, 所以當(dāng)前整個頁面的高度實際上應(yīng)該是原始html 的高度再乘上縮放比例. 因此,更正后的結(jié)果,準(zhǔn)確的判斷方法應(yīng)該是:
if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) { //已經(jīng)處于底端 } if(webView.getScrollY() == 0){ //處于頂端 }
返回上一次瀏覽的頁面
public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }
有一個非常不錯的 Html5Activity 加載類帖出來:
package com.lyl.web;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.KeyEvent;import android.webkit.GeolocationPermissions;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import com.lyl.test.R;public class Html5Activity extends AppCompatActivity { private String mUrl; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web); Bundle bundle = getIntent().getBundleExtra("bundle"); mUrl = bundle.getString("url"); Log.d("Url:", mUrl); mWebView = (WebView) findViewById(R.id.web); WebSettings mWebSettings = mWebView.getSettings(); mWebSettings.setSupportZoom(true); mWebSettings.setLoadWithOverviewMode(true); mWebSettings.setUseWideViewPort(true); mWebSettings.setDefaultTextEncodingName("utf-8"); mWebSettings.setLoadsImagesAutomatically(true); //調(diào)用JS方法.安卓版本大于17,加上注解 @JavascriptInterface mWebSettings.setJavaScriptEnabled(true); saveData(mWebSettings); newWin(mWebSettings); mWebView.setWebChromeClient(webChromeClient); mWebView.setWebViewClient(webViewClient); mWebView.loadUrl(mUrl); } /** * 多窗口的問題 */ private void newWin(WebSettings mWebSettings) { //html中的_bank標(biāo)簽就是新建窗口打開,有時會打不開,需要加以下 //然后 復(fù)寫 WebChromeClient的onCreateWindow方法 mWebSettings.setSupportMultipleWindows(true); mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); } /** * HTML5數(shù)據(jù)存儲 */ private void saveData(WebSettings mWebSettings) { //有時候網(wǎng)頁需要自己保存一些關(guān)鍵數(shù)據(jù),Android WebView 需要自己設(shè)置 mWebSettings.setDomStorageEnabled(true); mWebSettings.setDatabaseEnabled(true); mWebSettings.setAppCacheEnabled(true); String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath(); mWebSettings.setAppCachePath(appCachePath); } WebViewClient webViewClient = new WebViewClient(){ /** * 多頁面在同一個WebView中打開,就是不新建activity或者調(diào)用系統(tǒng)瀏覽器打開 */ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }; WebChromeClient webChromeClient = new WebChromeClient() { //=========HTML5定位========================================================== //需要先加入權(quán)限 //<uses-permission android:name="android.permission.INTERNET"/> //<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> //<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> @Override public void onReceivedIcon(WebView view, Bitmap icon) { super.onReceivedIcon(view, icon); } @Override public void onGeolocationPermissionsHidePrompt() { super.onGeolocationPermissionsHidePrompt(); } @Override public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false);//注意個函數(shù),第二個參數(shù)就是是否同意定位權(quán)限,第三個是是否希望內(nèi)核記住 super.onGeolocationPermissionsShowPrompt(origin, callback); } //=========HTML5定位========================================================== //=========多窗口的問題========================================================== @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; transport.setWebView(mWebView); resultMsg.sendToTarget(); return true; } //=========多窗口的問題========================================================== }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }}
原諒我,忘了出自哪里,如果侵權(quán)請聯(lián)系我,一定刪除。
這是下載地址:http://yun.baidu.com/s/1eQWFDvG
覺得不錯的點個喜歡唄,要是直接贊賞的話,那真是太榮幸了。
參考鏈接:
Android webview使用詳解
Android WebView 開發(fā)詳解(一)
還有一些零散的鏈接。
聯(lián)系客服