Android Webview使用小結(jié)
本文實例為大家分享了Android Webview使用小結(jié),供大家參考,具體內(nèi)容如下
#采用重載URL的方式實現(xiàn)Java與Js交互
在Android中,常用的Java與Js交互的實現(xiàn)方式是通過函數(shù)addJavascriptInterface進行添加在Js中使用的回調(diào)代理類。
這種方法雖然方便,但是寫出來的js代碼并不通用。如果IOS也要實現(xiàn)類似的功能或業(yè)務,則IOS要另外寫一套Js代碼。所以不太推薦。
推薦使用重載URL的方式來實現(xiàn),因為基本所有的平臺都擁有在加載某個URL之前進行一些處理的回調(diào)函數(shù)。所以這種方式會更加的通用。
#響應Javascript中的alert
在Android的WebView控件中,默認對JS的alert函數(shù)是沒有任何反應的
要想彈出對應的對話框,則需要我們自己進行實現(xiàn)
具體實現(xiàn)代碼如下:
webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("測試alert"); builder.setMessage(message); builder.setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); builder.show(); return true; } });
通過以上代碼就可以實現(xiàn)當JS中執(zhí)行alert時,在Android上以原生的對話框顯示出來,當然這里也可以直接Toast。
而這段代碼中需要注意的地方有兩點:
1、返回值必須為true。
返回true,則說明已經(jīng)處理了,不需要交由WebChromeClient來執(zhí)行。而如果返回的是false,則Webview會繼續(xù)執(zhí)行后續(xù)的js代碼,現(xiàn)象就是,彈出對話框之后,用戶還沒點確定,后續(xù)的js代碼已經(jīng)執(zhí)行完了.
2、最后必須調(diào)用result.confirm()。
原因在于,如果沒有調(diào)用此函數(shù),則后續(xù)的JS代碼將無法繼續(xù)執(zhí)行下去。最常見的現(xiàn)象就是,alert對話框只出現(xiàn)一次,第二次再進行alert的時候沒有任何反應。其實這里是因為沒有調(diào)用confirm函數(shù),就相當于在瀏覽器中alert之后,用戶沒有點確定。
3、result.confirm()應該放到onClick回調(diào)中。
正如前面說的,調(diào)用confirm函數(shù),就相當于用戶點擊了確定按鈕。因此,我們要把confirm函數(shù)的調(diào)用放到Android原生對話框的“確定”按鈕的回調(diào)函數(shù)中進行調(diào)用。
之前沒理解透,把confirm函數(shù)放在了builder.show之后進行調(diào)用,結(jié)果現(xiàn)象是alert之后,對話框彈出來了,但是后續(xù)的js代碼沒有阻塞,而是繼續(xù)執(zhí)行下去了,變得就像是異步了一樣,和在chrome中調(diào)用js代碼的執(zhí)行邏輯不一致。
不過,如果需求就是要直接執(zhí)行下去,那也可以,只要理解了就行。
#訪問證書有問題的SSL網(wǎng)頁
對于有證書問題的網(wǎng)頁,比如過期、信息不正確、發(fā)行機關(guān)不被信任等,Webview默認情況下會拒絕訪問。而PC端瀏覽器的處理則是提供用戶進行選擇是否要繼續(xù),在android也是可以實現(xiàn)的。
首先第一種是直接繼續(xù),不需要讓用戶進行選擇
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 默認為調(diào)用handler.cancel()方法,因此不要調(diào)用super的onReceivedSslError方法 // super.onReceivedSslError(view, handler, error); handler.proceed(); }
這里要注意的是,千萬不要調(diào)用super的onReceivedSslError方法,因為此方法中已經(jīng)調(diào)用了handler.cancel()。
如果調(diào)用了,則會出現(xiàn)第一次無法加載,第二次卻能正常訪問的現(xiàn)象。
#慎重在shouldoverrideurlloading中返回true
當設(shè)置了WebviewClient時,在shouldoverrideurlloading中如果不需要對url進行攔截做處理,而是簡單的繼續(xù)加載此網(wǎng)址。
則建議采用返回false的方式而不是loadUrl的方式進行加載網(wǎng)址。
為什么這么建議呢?
因為如果采用loadUrl的方式進行加載,那么對于加載有跳轉(zhuǎn)的網(wǎng)址時,進行webview.goBack就會特別麻煩。
例如加載鏈接如下:
A->(B->C->D)->E 括號內(nèi)為跳轉(zhuǎn)
如果采用return false的方式,那么在goBack的時候,可以從第二步直接回到A網(wǎng)頁。從E回到A只需要執(zhí)行兩次goBack
而如果采用的是loadUrl,則沒辦法直接從第二步回到A網(wǎng)頁。因為loadUrl把第二步的每個跳轉(zhuǎn)都認為是一個新的網(wǎng)頁加載,因此從E回到A需要執(zhí)行四次goBack
只有當不需要加載網(wǎng)址而是攔截做其他處理,如攔截tel:xxx等特殊url做撥號處理的時候,才應該返回true。
#onFormResubmission
原文鏈接:http://zlv.me/posts/2015/01/14/08_Android-Webview使用小結(jié)/
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android BadTokenException異常解決案例詳解
這篇文章主要介紹了Android BadTokenException異常詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-08-08Android Bitmap和Drawable相互轉(zhuǎn)換的簡單代碼
Android Bitmap和Drawable相互轉(zhuǎn)換的簡單代碼,需要的朋友可以參考一下2013-05-05Android開發(fā)中requestfocus()無效的原因及解決辦法
這篇文章主要介紹了Android開發(fā)中requestfocus()無效的原因及解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08Android基于hover組件實現(xiàn)監(jiān)控鼠標移動事件的方法
這篇文章主要介紹了Android基于hover組件實現(xiàn)監(jiān)控鼠標移動事件的方法,結(jié)合實例形式分析了hover組件監(jiān)控鼠標光標在view上變化的操作技巧,需要的朋友可以參考下2017-02-02解決Android popupWindow設(shè)置背景透明度無效的問題
這篇文章主要介紹了解決Android popupWindow設(shè)置背景透明度無效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08