Android 與WebView中的js程式碼的互動記錄
最近公司的專案用到原生和WebView的HTML中程式碼進行互動,遇到到不少問題,在這裡記錄一下,以後再用的時候方便。
- 首先說一下WebSettings的配置,它是用來管理WebView配置的類
WebSettings webSettings = webView.getSettings();//通過webView獲取WebSettings
/*WebSettings常用方法*/
webSettings.setUseWideViewPort(true);// 設定此屬性,可任意比例縮放
webSettings.setSupportZoom(true);//設定是否支援縮放
webSettings.setBuiltInZoomControls(true);//顯示或不顯示縮放按鈕(wap網頁不支援)
webSettings.setJavaScriptEnabled(true); //支援js
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); /*設定 快取模式LOAD_DEFAULT:預設的快取使用模式。在進行頁面前進或後退的操作時,如果快取可用並未過期就優先載入快取,否則從網路上載入資料。這樣可以減少頁面的網路請求次數。
LOAD_CACHE_ELSE_NETWORK:只要快取可用就載入快取,哪怕它們已經過期失效。如果快取不可用就從網路上載入資料。
LOAD_NO_CACHE:不載入快取,只從網路載入資料。
LOAD_CACHE_ONLY:不從網路載入資料,只從快取載入資料*/
webSettings.setAppCacheEnabled(true);//啟用或禁用應用快取
webSettings.setAppCachePath(String appCachePath);//設定應用快取路徑,這個路徑必須是可以讓app寫入檔案的。該方法應該只被呼叫一次
webSettings.setBlockNetworkImage(true);//關閉載入網路圖片,在一開始載入的時候可以設定為true,當載入完網頁的時候再設定為false
- WebView的WebChromeClient中常用的方法的說明
webView.setWebChromeClient(new WebChromeClient(){
//當頁面載入的進度發生改變時回撥,用來告知主程式當前頁面的載入進度。
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
}
//用來接收web頁面的icon
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
// TODO Auto-generated method stub
super.onReceivedIcon(view, icon);
}
//用來接收web頁面的title
@Override
public void onReceivedTitle(WebView view, String title) {
// TODO Auto-generated method stub
super.onReceivedTitle(view, title);
}
//處理Javascript中的Alert對話方塊,返回為true,就是攔截html頁面不彈出 Alert,
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// TODO Auto-generated method stub
return super.onJsAlert(view, url, message, result);
}
//處理Javascript中的Prompt對話方塊
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue, result);
}
//處理Javascript中的Confirm對話方塊
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
}
});
- WebView的WebViewClient中常用的方法的說明
webView.setWebViewClient(new WebViewClient(){
//WebView載入資源呼叫,返回為true的話就在本app裡面呼叫,false就在外部瀏覽器中開啟。
//這個方法還可以攔截到開啟的連結的地址,可以在此跟原生的做一些互動
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// TODO Auto-generated method stub
return true;
}
//該方法只在WebView完成一個頁面載入時呼叫一次
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
}
//頁面發生錯誤時候呼叫,這些錯誤通常都是由無法與伺服器正常連線引起的,最常見的就是網路問題
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
// TODO Auto-generated method stub
super.onReceivedError(view, request, error);
}
});
- 在Activity中呼叫html的js方法
String data = "\"我是app\""
webView.loadUrl("javascript:queryRecomend(" + data + ")");
呼叫js方法要特別注意一下,如果傳遞的是字串,就用引號把字串包裹起來,要不然資料就傳遞不成功。。。。
- 在html中js呼叫Activity的方法
android中的程式碼:
/**
* 注意第二個引數JsTest,這個是JS網頁呼叫Android方法的一個類似ID的東西
*/
mWebView.addJavascriptInterface(new JavaScriptinterface (this), "android");
public class JavaScriptinterface {
Context context;
public JavaScriptinterface(Context c) {
context= c;
}
/**
* 與js互動時用到的方法,在js裡直接呼叫的
*/
@JavascriptInterface
public void showToast(String ssss) {
Toast.makeText(mContext, ssss, Toast.LENGTH_LONG).show();
}
}
/**
*JS程式碼:注意這裡android.JsCallAndroid中的android和activity中的*addJavascriptInterface中的android名字要一樣
*/
<script type="text/javascript">
function showToast() {
android.JsCallAndroid("哈哈啊哈 ");
}
</script>
</head>
<body>
<input type="button" value="呼叫"
onClick="showToast()"/>
</body>
注意:如果用shouldOverrideUrlLoading方法中通過返回的url來響應原生的一些方法時候(url中帶有特殊符號,比如:& = 等。。),html的url要通過encodeURIComponent(url)進行轉碼,手機端通過URLDecoder.decode(url)轉碼獲取都這個url,如果不轉碼進行傳送回收不到這個url(IOS是這樣的)。還有就是,在 原生呼叫JS的方法時候,傳遞的引數是字串,要用 \” 把這個字串包裹起來比如:(”\”我是app\”“),如果是數字就不必了,要不html識別不了這個字串。
相關文章
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- Android webview JS 互動AndroidWebViewJS
- WebView與APP互動實戰記錄WebViewAPP
- WKWebView和WebView與JS的互動方式WebViewJS
- Android與WebView資料互動AndroidWebView
- WebView與JS的互動,以及注意事項WebViewJS
- Flutter WebView與JS互動簡易指南FlutterWebViewJS
- 記一則iOS封裝SDK的開發過程之WebView與JS的互動iOS封裝WebViewJS
- WebView和js的互調WebViewJS
- Android WebView:這是一份 詳細 & 易懂的WebView學習攻略(含與JS互動、快取構建等)AndroidWebViewJS快取
- JockeyJS——優秀的WebView與JS互動開源庫使用和解析JSWebView
- flutter webView 使用以及與 js 互操作FlutterWebViewJS
- Flutter使用JsBridge與WebView互動FlutterJSWebView
- Flutter 與 Android 的互動FlutterAndroid
- Android中WebView的使用指南:AndroidWebView
- Android 中 WebView 的除錯方法AndroidWebView除錯
- JS中的Promise 物件記錄JSPromise物件
- js 與WKWebView 互動JSWebView
- Android原始碼學習中遇到的標籤記錄Android原始碼
- WebView詳解與簡單實現Android與H5互調WebViewAndroidH5
- Cordova外掛中JavaScript程式碼與Java的互動細節介紹JavaScript
- Android WebView的坑AndroidWebView
- Android 原生和 JS 互動實踐AndroidJS
- weex與android互動初步接入,遇到的坑Android
- flash如何與js互動?JS
- Android WebView 中的 Html 網頁定位操作AndroidWebViewHTML網頁
- Android 與 JavaScript 互動 支援的資料型別AndroidJavaScript資料型別
- 深入淺析React Native與web的基本互動(附程式碼)React NativeWeb
- 使用 JSBridge 與原生 IOS、Android 進行互動(含 H5、Android、IOS 端程式碼,附 Demo)JSiOSAndroidH5
- android程式碼中動態調整圖片的位置Android
- MySQL與Python的互動學習筆記MySqlPython筆記
- GraphQL.js 與服務端互動的新方式JS服務端
- Flutter 與 Android 原生 WebView 對比FlutterAndroidWebView
- React Native與Android通訊互動React NativeAndroid
- JS 互動程式碼這樣寫可能好維護點JS
- 程式碼記錄
- iOS高階-WebView & JavaScript互動(附DEMO)iOSWebViewJavaScript
- H5與APP混合開發通訊互動記錄H5APP
- android中將原生請求的介面url的cookie同步到webview中。AndroidCookieWebView