希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯(cuò)誤,請一定指出,以免誤導(dǎo)大家、也誤導(dǎo)我。
本文來自: http://www.jianshu.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注。
WebView在現(xiàn)在的項(xiàng)目中使用的頻率應(yīng)該還是非常高的。
我個(gè)人總覺得HTML5是一種趨勢。找了一些東西,在此總結(jié)。
本篇最后有一個(gè)非常不錯(cuò) 的 Html5Activity 加載類,不想看的可以直接跳下載。
WebSettings webSettings = mWebView .getSettings();//支持獲取手勢焦點(diǎn),輸入用戶名、密碼或其他webview.requestFocusFromTouch();setJavaScriptEnabled(true); //支持jssetPluginsEnabled(true); //支持插件 設(shè)置自適應(yīng)屏幕,兩者合用setUseWideViewPort(true); //將圖片調(diào)整到適合webview的大小 setLoadWithOverviewMode(true); // 縮放至屏幕的大小setSupportZoom(true); //支持縮放,默認(rèn)為true。是下面那個(gè)的前提。setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件。 若上面是false,則該WebView不可縮放,這個(gè)不管設(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時(shí)為webview設(shè)置節(jié)點(diǎn)setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 setLoadsImagesAutomatically(true); //支持自動加載圖片setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式
加載一個(gè)網(wǎng)頁:
webView.loadUrl(" http://www.google.com/");
加載apk包中的一個(gè)html頁面
webView.loadUrl("file:///android_asset/test.html");
加載手機(jī)本地的一個(gè)html頁面的方法:
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
WebViewClient就是幫助WebView處理各種通知、請求事件的。
打開網(wǎng)頁時(shí)不調(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)過這個(gè)方法,這個(gè)函數(shù)我們可以做很多操作。 //比如獲取url,查看url.contains(“add”),進(jìn)行添加操作 shouldOverrideKeyEvent(WebView view, KeyEvent event) //重寫此方法才能夠處理在瀏覽器中的按鍵事件。 onPageStarted(WebView view, String url, Bitmap favicon) //這個(gè)事件就是開始載入頁面調(diào)用的,我們可以設(shè)定一個(gè)loading的頁面,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。 onPageFinished(WebView view, String url) //在頁面加載結(jié)束時(shí)調(diào)用。同樣道理,我們可以關(guān)閉loading 條,切換程序動作。 onLoadResource(WebView view, String url) // 在加載頁面資源時(shí)會調(diào)用,每一個(gè)資源(比如圖片)的加載都會調(diào)用一次。 onReceivedError(WebView view, int errorCode, String description, String failingUrl) // (報(bào)告錯(cuò)誤信息) 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ā)生改變時(shí)調(diào)用) onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加載時(shí)調(diào)用) }
webView.setWebViewClient(webViewClient);
WebChromeClient是輔助WebView處理Javascript的對話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等 :
方法中的代碼都是由Android端自己處理。
WebChromeClient mWebChromeClient = new WebChromeClient() { //獲得網(wǎng)頁的加載進(jìn)度,顯示在右上角的TextView控件中 @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress < 100) { String progress = newProgress + "%"; } else { } } //獲取Web頁中的title用來設(shè)置自己界面中的title //當(dāng)加載出錯(cuò)的時(shí)候,比如無網(wǎng)絡(luò),這時(shí)onReceiveTitle中獲取的標(biāo)題為 找不到該網(wǎng)頁, //因此建議當(dāng)觸發(fā)onReceiveError時(shí),不要使用獲取到的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; }};
webView.setWebChromeClient(mWebChromeClient);
WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(getHtmlObject(), "jsObj");
上面這是前提?。?!
然后實(shí)現(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有個(gè)漏洞:
http://blog.csdn.net/leehong2005/article/details/11808557goBack () //后退goForward ()//前進(jìn)goBackOrForward (int steps) //以當(dāng)前的index為起始點(diǎn)前進(jìn)或者后退到歷史記錄中指定的steps, 如果steps為負(fù)數(shù)則為后退,正數(shù)則為前進(jìn)canGoForward () //是否可以前進(jìn)canGoBack () //是否可以后退
clearCache(true); //清除網(wǎng)頁訪問留下的緩存,由于內(nèi)核緩存是全局的因此這個(gè)方法不僅僅針對webview而是針對整個(gè)應(yīng)用程序.clearHistory () //清除當(dāng)前webview訪問的歷史記錄,只會webview訪問歷史記錄里的所有記錄除了當(dāng)前訪問記錄.clearFormData () //這個(gè)api僅僅清除自動完成填充的表單數(shù)據(jù),并不會清除WebView存儲到本地的數(shù)據(jù)。
onResume () //激活WebView為活躍狀態(tài),能正常執(zhí)行網(wǎng)頁的響應(yīng)onPause () //當(dāng)頁面被失去焦點(diǎn)被切換到后臺不可見狀態(tài),需要執(zhí)行onPause動過, onPause動作通知內(nèi)核暫停所有的動作,比如DOM的解析、plugin的執(zhí)行、JavaScript執(zhí)行。pauseTimers () //當(dāng)應(yīng)用程序被切換到后臺我們使用了webview, 這個(gè)方法不僅僅針對當(dāng)前的webview而是全局的全應(yīng)用程序的webview,它會暫停所有webview的layout,parsing,javascripttimer。降低CPU功耗。resumeTimers () //恢復(fù)pauseTimers時(shí)的動作。destroy () //銷毀,關(guān)閉了Activity時(shí),音樂或視頻,還在播放。就必須銷毀。
但是注意:webview調(diào)用destory時(shí),webview仍綁定在Activity上.這是由于自定義webview構(gòu)建時(shí)傳入了該Activity的context對象,因此需要先從父容器中移除webview,然后再銷毀webview:
rootLayout.removeView(webView); webView.destroy();
判斷WebView是否已經(jīng)滾動到頁面底端 或者 頂端:
getScrollY() //方法返回的是當(dāng)前可見區(qū)域的頂端距整個(gè)頁面頂端的距離,也就是當(dāng)前內(nèi)容滾動的距離.
getHeight()或者getBottom() //方法都返回當(dāng)前WebView 這個(gè)容器的高度
getContentHeight() 返回的是整個(gè)html 的高度,但并不等同于當(dāng)前整個(gè)頁面的高度,因?yàn)閃ebView 有縮放功能, 所以當(dāng)前整個(gè)頁面的高度實(shí)際上應(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); }
有一個(gè)非常不錯(cuò)的 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)簽就是新建窗口打開,有時(shí)會打不開,需要加以下 //然后 復(fù)寫 WebChromeClient的onCreateWindow方法 mWebSettings.setSupportMultipleWindows(true); mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); } /** * HTML5數(shù)據(jù)存儲 */ private void saveData(WebSettings mWebSettings) { //有時(shí)候網(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(){ /** * 多頁面在同一個(gè)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)限 // // // @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);//注意個(gè)函數(shù),第二個(gè)參數(shù)就是是否同意定位權(quán)限,第三個(gè)是是否希望內(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
覺得不錯(cuò)的點(diǎn)個(gè)喜歡唄,要是直接贊賞的話,那真是太榮幸了。
參考鏈接:
Android webview使用詳解
Android WebView 開發(fā)詳解(一)
還有一些零散的鏈接。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:0731-84117792 E-MAIL:11247931@qq.com