Android Webview使用小結(jié)
本文實(shí)例為大家分享了Android Webview使用小結(jié),供大家參考,具體內(nèi)容如下
#采用重載URL的方式實(shí)現(xiàn)Java與Js交互
在Android中,常用的Java與Js交互的實(shí)現(xiàn)方式是通過(guò)函數(shù)addJavascriptInterface進(jìn)行添加在Js中使用的回調(diào)代理類。
這種方法雖然方便,但是寫(xiě)出來(lái)的js代碼并不通用。如果IOS也要實(shí)現(xiàn)類似的功能或業(yè)務(wù),則IOS要另外寫(xiě)一套Js代碼。所以不太推薦。
推薦使用重載URL的方式來(lái)實(shí)現(xiàn),因?yàn)榛舅械钠脚_(tái)都擁有在加載某個(gè)URL之前進(jìn)行一些處理的回調(diào)函數(shù)。所以這種方式會(huì)更加的通用。
#響應(yīng)Javascript中的alert
在Android的WebView控件中,默認(rèn)對(duì)JS的alert函數(shù)是沒(méi)有任何反應(yīng)的
要想彈出對(duì)應(yīng)的對(duì)話框,則需要我們自己進(jìn)行實(shí)現(xiàn)
具體實(shí)現(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("測(cè)試alert");
builder.setMessage(message);
builder.setPositiveButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
});
builder.show();
return true;
}
});
通過(guò)以上代碼就可以實(shí)現(xiàn)當(dāng)JS中執(zhí)行alert時(shí),在Android上以原生的對(duì)話框顯示出來(lái),當(dāng)然這里也可以直接Toast。
而這段代碼中需要注意的地方有兩點(diǎn):
1、返回值必須為true。
返回true,則說(shuō)明已經(jīng)處理了,不需要交由WebChromeClient來(lái)執(zhí)行。而如果返回的是false,則Webview會(huì)繼續(xù)執(zhí)行后續(xù)的js代碼,現(xiàn)象就是,彈出對(duì)話框之后,用戶還沒(méi)點(diǎn)確定,后續(xù)的js代碼已經(jīng)執(zhí)行完了.
2、最后必須調(diào)用result.confirm()。
原因在于,如果沒(méi)有調(diào)用此函數(shù),則后續(xù)的JS代碼將無(wú)法繼續(xù)執(zhí)行下去。最常見(jiàn)的現(xiàn)象就是,alert對(duì)話框只出現(xiàn)一次,第二次再進(jìn)行alert的時(shí)候沒(méi)有任何反應(yīng)。其實(shí)這里是因?yàn)闆](méi)有調(diào)用confirm函數(shù),就相當(dāng)于在瀏覽器中alert之后,用戶沒(méi)有點(diǎn)確定。
3、result.confirm()應(yīng)該放到onClick回調(diào)中。
正如前面說(shuō)的,調(diào)用confirm函數(shù),就相當(dāng)于用戶點(diǎn)擊了確定按鈕。因此,我們要把confirm函數(shù)的調(diào)用放到Android原生對(duì)話框的“確定”按鈕的回調(diào)函數(shù)中進(jìn)行調(diào)用。
之前沒(méi)理解透,把confirm函數(shù)放在了builder.show之后進(jìn)行調(diào)用,結(jié)果現(xiàn)象是alert之后,對(duì)話框彈出來(lái)了,但是后續(xù)的js代碼沒(méi)有阻塞,而是繼續(xù)執(zhí)行下去了,變得就像是異步了一樣,和在chrome中調(diào)用js代碼的執(zhí)行邏輯不一致。
不過(guò),如果需求就是要直接執(zhí)行下去,那也可以,只要理解了就行。
#訪問(wèn)證書(shū)有問(wèn)題的SSL網(wǎng)頁(yè)
對(duì)于有證書(shū)問(wèn)題的網(wǎng)頁(yè),比如過(guò)期、信息不正確、發(fā)行機(jī)關(guān)不被信任等,Webview默認(rèn)情況下會(huì)拒絕訪問(wèn)。而PC端瀏覽器的處理則是提供用戶進(jìn)行選擇是否要繼續(xù),在android也是可以實(shí)現(xiàn)的。
首先第一種是直接繼續(xù),不需要讓用戶進(jìn)行選擇
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 默認(rèn)為調(diào)用handler.cancel()方法,因此不要調(diào)用super的onReceivedSslError方法
// super.onReceivedSslError(view, handler, error);
handler.proceed();
}
這里要注意的是,千萬(wàn)不要調(diào)用super的onReceivedSslError方法,因?yàn)榇朔椒ㄖ幸呀?jīng)調(diào)用了handler.cancel()。
如果調(diào)用了,則會(huì)出現(xiàn)第一次無(wú)法加載,第二次卻能正常訪問(wèn)的現(xiàn)象。
#慎重在shouldoverrideurlloading中返回true
當(dāng)設(shè)置了WebviewClient時(shí),在shouldoverrideurlloading中如果不需要對(duì)url進(jìn)行攔截做處理,而是簡(jiǎn)單的繼續(xù)加載此網(wǎng)址。
則建議采用返回false的方式而不是loadUrl的方式進(jìn)行加載網(wǎng)址。
為什么這么建議呢?
因?yàn)槿绻捎胠oadUrl的方式進(jìn)行加載,那么對(duì)于加載有跳轉(zhuǎn)的網(wǎng)址時(shí),進(jìn)行webview.goBack就會(huì)特別麻煩。
例如加載鏈接如下:
A->(B->C->D)->E 括號(hào)內(nèi)為跳轉(zhuǎn)
如果采用return false的方式,那么在goBack的時(shí)候,可以從第二步直接回到A網(wǎng)頁(yè)。從E回到A只需要執(zhí)行兩次goBack
而如果采用的是loadUrl,則沒(méi)辦法直接從第二步回到A網(wǎng)頁(yè)。因?yàn)閘oadUrl把第二步的每個(gè)跳轉(zhuǎn)都認(rèn)為是一個(gè)新的網(wǎng)頁(yè)加載,因此從E回到A需要執(zhí)行四次goBack
只有當(dāng)不需要加載網(wǎng)址而是攔截做其他處理,如攔截tel:xxx等特殊url做撥號(hào)處理的時(shí)候,才應(yīng)該返回true。
#onFormResubmission
原文鏈接:http://zlv.me/posts/2015/01/14/08_Android-Webview使用小結(jié)/
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)可瀏覽和搜索的聯(lián)系人列表
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可瀏覽和搜索的聯(lián)系人列表的相關(guān)代碼,瀏覽所有聯(lián)系人和根據(jù)名稱搜索聯(lián)系人,感興趣的小伙伴們可以參考一下2016-07-07
Android 修改viewpage滑動(dòng)速度的實(shí)現(xiàn)代碼
由于Viewpager的滑動(dòng)速度是固定的,所以很頭疼,下面小編通過(guò)實(shí)例代碼給大家分享android 修改viewpage滑動(dòng)速度的方法,需要的朋友參考下吧2017-09-09
Android 實(shí)現(xiàn)自動(dòng)打電話與發(fā)短信的實(shí)例
這篇文章主要介紹了Android 實(shí)現(xiàn)自動(dòng)打電話與發(fā)短信的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android使用NestedScrollView?內(nèi)嵌RecycleView滑動(dòng)沖突問(wèn)題解決
這篇文章主要介紹了Android使用NestedScrollView?內(nèi)嵌RecycleView滑動(dòng)沖突問(wèn)題解決,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06
android中圖片加載到內(nèi)存的實(shí)例代碼
這篇文章主要介紹了android中圖片加載到內(nèi)存的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Android實(shí)現(xiàn)可折疊式標(biāo)題欄

