Android WebView之Java與javaScript互調

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

發佈了17 篇原創文章 · 獲贊 31 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章