最新文章專題視頻專題關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 16:38:47
文檔

史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose

史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose:如果本文幫助到你,本人不勝榮幸,如果浪費(fèi)了你的時(shí)間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯(cuò)誤,請一定指出,以免誤導(dǎo)大家、也誤導(dǎo)我。 本文來自: http://www.jianshu.com/users/320f9e8f7fc9/latest
推薦度:
導(dǎo)讀史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose:如果本文幫助到你,本人不勝榮幸,如果浪費(fèi)了你的時(shí)間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯(cuò)誤,請一定指出,以免誤導(dǎo)大家、也誤導(dǎo)我。 本文來自: http://www.jianshu.com/users/320f9e8f7fc9/latest

如果本文幫助到你,本人不勝榮幸,如果浪費(fèi)了你的時(shí)間,本人深感抱歉。

希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯(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 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

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

將上面定義的WebViewClient設(shè)置給WebView:

 webView.setWebViewClient(webViewClient);

WebChromeClient

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

同樣,將上面定義的WebChromeClient設(shè)置給WebView:

 webView.setWebChromeClient(mWebChromeClient);

調(diào)用JS代碼

 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/11808557

WebView的方法

前進(jìn)、后退

goBack () //后退goForward ()//前進(jìn)goBackOrForward (int steps) //以當(dāng)前的index為起始點(diǎn)前進(jìn)或者后退到歷史記錄中指定的steps,    如果steps為負(fù)數(shù)則為后退,正數(shù)則為前進(jìn)canGoForward () //是否可以前進(jìn)canGoBack () //是否可以后退

清除緩存數(shù)據(jù):

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ù)。

WebView的狀態(tài):

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

文檔

史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose

史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose:如果本文幫助到你,本人不勝榮幸,如果浪費(fèi)了你的時(shí)間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯(cuò)誤,請一定指出,以免誤導(dǎo)大家、也誤導(dǎo)我。 本文來自: http://www.jianshu.com/users/320f9e8f7fc9/latest
推薦度:
標(biāo)簽: 使用 html5 html
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top