通过 Webview 将字符串变量从 Java 传递到 JavaScript(反之亦然)

Mbu*_*ert 2 javascript java android webview

我正在尝试制作一个应用程序,两个用户可以通过 webview 进行交互。我想从 javascript 获取一个 String 变量到 Java,以便我可以将它保存在我的 Sqlite 数据库中。(反之亦然)

Mau*_*ani 5

从 JavaScript 调用 Java/Kotlin 代码

Android WebView 有一个名为Javascript Interface的功能,您应该寻找它。

它允许您从 javascript 代码运行 java/kotlin 代码。

您可以通过以下方式定义接口

val webView: WebView = findViewById(R.id.webview)
webView.addJavascriptInterface(WebAppInterface(this), "Android")
Run Code Online (Sandbox Code Playgroud)

在这里,WebAppInterface定义了您想要从 javascript 调用的方法。

/** Instantiate the interface and set the context  */
class WebAppInterface(private val mContext: Context) {
     /** Show a toast from the web page  */
     @JavascriptInterface
     fun showToast(toast: String) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()
     }
}
Run Code Online (Sandbox Code Playgroud)

Android ”是添加到您的 webview 中的接口,可以在您的 javascript 代码中使用来调用 Android 方法。

完成此操作后,您可以从 javascript 调用这些方法,

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
function showAndroidToast(toast) {
    Android.showToast(toast);
}
</script>
Run Code Online (Sandbox Code Playgroud)

请记住,接口回调并不总是在主线程中调用。因此,如果您想执行任何 UI 操作,请确保使用runOnUiThread

从 Java/Kotlin 代码调用 JavaScript 函数

Android WebView 有一个名为Evaluate Javascript for API 19+ 的功能,可以从 java/kotlin 代码调用您的 javascript 函数。

例如,对于以下 JavaScript:

<script type="text/javascript">
function printName(name) {
    console.log(name); 
}
</script>
Run Code Online (Sandbox Code Playgroud)

您可以编写以下代码来调用此 JS 函数:

yourWebview.evaluateJavascript("printName(\'TEST\')")
Run Code Online (Sandbox Code Playgroud)