main/assets/JavaAndJavaScriptCall
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript">
function javaCallJs() {
document.getElementById("content").innerHTML +=
"<br\>java調用了js無參函數";
}
function javaCallJs(arg) {
document.getElementById("content").innerHTML =
("賬號:" + arg);
}
function showDialog() {
alert("我是來自javascript");
}
</script>
</head>
<body>
<div align="left" id="content"> </div>
<div align="left">歡迎光臨</div>
<input type="button" value="點擊Android被調用" onclick="window.Android.showToast()" />
</body>
</html>
WebView的常用初始化操作
val settings = webView.settings
//設置支持javaScript腳步語言
settings.javaScriptEnabled = true
//支持縮放按鈕-前提是頁面要支持才顯示
settings.builtInZoomControls = true
//設置客戶端-不跳轉到默認瀏覽器中
webView.webViewClient = WebViewClient()
webView.loadUrl("file:///android_asset/RealNetJSCallJavaActivity.htm");
定義接口,實現js與java互相調用
①javaScript 調用Java
// javascript 調用Java
webView!!.addJavascriptInterface(JavaScriptInterface(), "Android")
inner class JavaScriptInterface {
@JavascriptInterface
fun showToast() {//方法名相同
Log.e("TAG", "我被js調用了")
Toast.makeText(
this@JavaAndJSActivity,
"javascript 調用Java,我被js調用了", Toast.LENGTH_LONG
).show()
}
}```
②Java 調javaScript
webView!!.loadUrl("javascript:javaCallJs('$numebr')");
WebView.addJavascriptInterface接口不起作用
①有可能是未在JavaScript接口類的方法加上@JavascriptInterface註解
常用的WebSettings的方法及說明如下:
/**
* 是否支持縮放,配合方法setBuiltInZoomControls使用,默認true
*/
setSupportZoom(boolean support)
/**
* 是否需要用戶手勢來播放Media,默認true
*/
setMediaPlaybackRequiresUserGesture(boolean require)
/**
* 是否使用WebView內置的縮放組件,由浮動在窗口上的縮放控制和手勢縮放控制組成,默認false
*/
setBuiltInZoomControls(boolean enabled)
/**
* 是否顯示窗口懸浮的縮放控制,默認true
*/
setDisplayZoomControls(boolean enabled)
/**
* 是否允許訪問WebView內部文件,默認true
*/
setAllowFileAccess(boolean allow)
/**
* 是否允許獲取WebView的內容URL ,可以讓WebView訪問ContentPrivider存儲的內容。 默認true
*/
setAllowContentAccess(boolean allow)
/**
* 是否啓動概述模式瀏覽界面,當頁面寬度超過WebView顯示寬度時,縮小頁面適應WebView。默認false
*/
setLoadWithOverviewMode(boolean overview)
/**
* 是否保存表單數據,默認false
*/
setSaveFormData(boolean save)
/**
* 設置頁面文字縮放百分比,默認100%
*/
setTextZoom(int textZoom)
/**
* 是否支持ViewPort的meta tag屬性,如果頁面有ViewPort meta tag 指定的寬度,則使用meta tag指定的值,否則默認使用寬屏的視圖窗口
*/
setUseWideViewPort(boolean use)
/**
* 是否支持多窗口,如果設置爲true ,WebChromeClient#onCreateWindow方法必須被主程序實現,默認false
*/
setSupportMultipleWindows(boolean support)
/**
* 指定WebView的頁面佈局顯示形式,調用該方法會引起頁面重繪。默認LayoutAlgorithm#NARROW_COLUMNS
*/
setLayoutAlgorithm(LayoutAlgorithm l)
/**
* 設置標準的字體族,默認”sans-serif”。font-family 規定元素的字體系列。
* font-family 可以把多個字體名稱作爲一個“回退”系統來保存。如果瀏覽器不支持第一個字體,
* 則會嘗試下一個。也就是說,font-family 屬性的值是用於某個元素的字體族名稱或/及類族名稱的一個
* 優先表。瀏覽器會使用它可識別的第一個值。
*/
setStandardFontFamily(String font)
/**
* 設置混合字體族。默認”monospace”
*/
setFixedFontFamily(String font)
/**
* 設置SansSerif字體族。默認”sans-serif”
*/
setSansSerifFontFamily(String font)
/**
* 設置SerifFont字體族,默認”sans-serif”
*/
setSerifFontFamily(String font)
/**
* 設置CursiveFont字體族,默認”cursive”
*/
setCursiveFontFamily(String font)
/**
* 設置FantasyFont字體族,默認”fantasy”
*/
setFantasyFontFamily(String font)
/**
* 設置最小字體,默認8. 取值區間[1-72],超過範圍,使用其上限值。
*/
setMinimumFontSize(int size)
/**
* 設置最小邏輯字體,默認8. 取值區間[1-72],超過範圍,使用其上限值。
*/
setMinimumLogicalFontSize(int size)
/**
* 設置默認字體大小,默認16,取值區間[1-72],超過範圍,使用其上限值。
*/
setDefaultFontSize(int size)
/**
* 設置默認填充字體大小,默認16,取值區間[1-72],超過範圍,使用其上限值。
*/
setDefaultFixedFontSize(int size)
/**
* 設置是否加載圖片資源,注意:方法控制所有的資源圖片顯示,包括嵌入的本地圖片資源。
* 使用方法setBlockNetworkImage則只限制網絡資源圖片的顯示。值設置爲true後,
* webview會自動加載網絡圖片。默認true
*/
setLoadsImagesAutomatically(boolean flag)
/**
* 是否加載網絡圖片資源。注意如果getLoadsImagesAutomatically返回false,則該方法沒有效果。
* 如果使用setBlockNetworkLoads設置爲false,該方法設置爲false,也不會顯示網絡圖片。
* 當值從true改爲false時。WebView會自動加載網絡圖片。
*/
setBlockNetworkImage(boolean flag)
/**
* 設置是否加載網絡資源。注意如果值從true切換爲false後,WebView不會自動加載,
* 除非調用WebView#reload().如果沒有android.Manifest.permission#INTERNET權限,
* 值設爲false,則會拋出java.lang.SecurityException異常。
* 默認值:有android.Manifest.permission#INTERNET權限時爲false,其他爲true。
*/
setBlockNetworkLoads(boolean flag)
/**
* 設置是否允許執行JS。
*/
setJavaScriptEnabled(boolean flag)
/**
* 是否允許Js訪問任何來源的內容。包括訪問file scheme的URLs。考慮到安全性,
* 限制Js訪問範圍默認禁用。注意:該方法隻影響file scheme類型的資源,其他類型資源如圖片類型的,
* 不會受到影響。ICE_CREAM_SANDWICH_MR1版本以及以下默認爲true,JELLY_BEAN版本
* 以上默認爲false
*/
setAllowUniversalAccessFromFileURLs(boolean flag)
/**
* 是否允許Js訪問其他file scheme的URLs。包括訪問file scheme的資源。考慮到安全性,
* 限制Js訪問範圍默認禁用。注意:該方法隻影響file scheme類型的資源,其他類型資源如圖片類型的,
* 不會受到影響。如果getAllowUniversalAccessFromFileURLs爲true,則該方法被忽略。
* ICE_CREAM_SANDWICH_MR1版本以及以下默認爲true,JELLY_BEAN版本以上默認爲false
*/
setAllowFileAccessFromFileURLs(boolean flag)
/**
* 設置存儲定位數據庫的位置,考慮到位置權限和持久化Cache緩存,Application需要擁有指定路徑的
* write權限
*/
setGeolocationDatabasePath(String databasePath)
/**
* 是否允許Cache,默認false。考慮需要存儲緩存,應該爲緩存指定存儲路徑setAppCachePath
*/
setAppCacheEnabled(boolean flag)
/**
* 設置Cache API緩存路徑。爲了保證可以訪問Cache,Application需要擁有指定路徑的write權限。
* 該方法應該只調用一次,多次調用自動忽略。
*/
setAppCachePath(String appCachePath)
/**
* 是否允許數據庫存儲。默認false。查看setDatabasePath API 如何正確設置數據庫存儲。
* 該設置擁有全局特性,同一進程所有WebView實例共用同一配置。注意:保證在同一進程的任一WebView
* 加載頁面之前修改該屬性,因爲在這之後設置WebView可能會忽略該配置
*/
setDatabaseEnabled(boolean flag)
/**
* 是否存儲頁面DOM結構,默認false。
*/
setDomStorageEnabled(boolean flag)
/**
* 是否允許定位,默認true。注意:爲了保證定位可以使用,要保證以下幾點:
* Application 需要有android.Manifest.permission#ACCESS_COARSE_LOCATION的權限
* Application 需要實現WebChromeClient#onGeolocationPermissionsShowPrompt的回調,
* 接收Js定位請求訪問地理位置的通知
*/
setGeolocationEnabled(boolean flag)
/**
* 是否允許JS自動打開窗口。默認false
*/
setJavaScriptCanOpenWindowsAutomatically(boolean flag)
/**
* 設置頁面的編碼格式,默認UTF-8
*/
setDefaultTextEncodingName(String encoding)
/**
* 設置WebView代理,默認使用默認值
*/
setUserAgentString(String ua)
/**
* 通知WebView是否需要設置一個節點獲取焦點當
* WebView#requestFocus(int,android.graphics.Rect)被調用的時候,默認true
*/
setNeedInitialFocus(boolean flag)
/**
* 基於WebView導航的類型使用緩存:正常頁面加載會加載緩存並按需判斷內容是否需要重新驗證。
* 如果是頁面返回,頁面內容不會重新加載,直接從緩存中恢復。setCacheMode允許客戶端根據指定的模式來
* 使用緩存。
* LOAD_DEFAULT 默認加載方式
* LOAD_CACHE_ELSE_NETWORK 按網絡情況使用緩存
* LOAD_NO_CACHE 不使用緩存
* LOAD_CACHE_ONLY 只使用緩存
*/
setCacheMode(int mode)
/**
* 設置加載不安全資源的WebView加載行爲。KITKAT版本以及以下默認爲MIXED_CONTENT_ALWAYS_ALLOW方
* 式,LOLLIPOP默認MIXED_CONTENT_NEVER_ALLOW。強烈建議:使用MIXED_CONTENT_NEVER_ALLOW
*/
setMixedContentMode(int mode)
更多、詳細的關於Java與javaScript的互調或屬性:
https://blog.csdn.net/qy274770068/article/details/51243751
https://www.jianshu.com/p/7066bedb4607
https://www.jianshu.com/p/ce80b62952b2
https://juejin.im/post/5924dbf58d6d810058fdde43
https://mp.weixin.qq.com/s/80PoBB8W_0J5tAKmwuC6BQ
https://blog.csdn.net/u012808234/article/details/104010258