将变量从 Android 传递给在 WebView 中启动的 JavaScript
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19001500/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Pass variable from Android to JavaScript launched in WebView
提问by Zac Powell
I have a WebView which in the click of an Android button loads some JavaScript into the WebView.
我有一个 WebView,单击 Android 按钮即可将一些 JavaScript 加载到 WebView 中。
My question is how would I go about passing an Android variable to the JavaScript when it's loaded.
我的问题是如何在加载时将 Android 变量传递给 JavaScript。
My Current code to load the JavaScript into the WebView
我的当前代码将 JavaScript 加载到 WebView 中
private OnClickListener OnClick_grabit = new OnClickListener() {
public void onClick(View v) {
webView.loadUrl("javascript: function loadScript(scriptURL) {
var scriptElem = document.createElement('SCRIPT');
scriptElem.setAttribute('language', 'JavaScript');
scriptElem.setAttribute('src', scriptURL);
document.body.appendChild(scriptElem);
} loadScript('http://www.pathtojavascript/javascript.js');");
}
};
SO I need to pass something to the JavaScript initialize()
from Android.
所以我需要将一些东西initialize()
从 Android传递给 JavaScript 。
采纳答案by gunar
First of all you need to load the script only once (your onClick
is loading it every time), then call loadUrl("javascript:initialize(" + myNumber + ");")
首先你只需要加载一次脚本(你onClick
每次都加载它),然后调用loadUrl("javascript:initialize(" + myNumber + ");")
回答by Taner
Java Class:
Java类:
public class JavaScriptInterface {
Context mContext;
JavaScriptInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public String getFromAndroid() {
return "This is from android.";
}
}
Webview code :
网页浏览代码:
WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient() {});
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
Html and javascript:
Html 和 JavaScript:
<input type="button" value="Get from android" onClick="getFromAndroid()" />
<script type="text/javascript">
var myVar = null;
function getFromAndroid() {
myVar = Android.getFromAndroid();
alert(myVar);
}
</script>
回答by hariszaman
The correct syntax that worked for me is
对我有用的正确语法是
StringBuilder buf=new StringBuilder("javascript:testFunction('"+bar+"','"+foo+"')");
Log.d(TAG, "returned string:"+buf.toString());
mWebView.loadUrl(buf.toString());
回答by goodm
You need to loadUrl in your webView, I got something like this in my previous app:
你需要在你的 webView 中加载Url,我在我以前的应用程序中得到了这样的东西:
webView.loadUrl("javascript:wrapJS.functionName("+value+","+value+")"+);
回答by Mehdico
Add the JitPack repository to your build file
将 JitPack 存储库添加到您的构建文件中
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Add this to app gradle file:
将此添加到应用程序 gradle 文件中:
dependencies {
compile 'com.github.wendux:WebViewJavascriptBridge:master-SNAPSHOT'
}
prepare your java script like this:
像这样准备你的java脚本:
<!doctype html>
<html><head>
</head><body>
<p>Mehdico</p>
<script>
function setupWebViewJavascriptBridge(callback) {
var bridge=window.WebViewJavascriptBridge||window.WKWebViewJavascriptBridge
if (bridge) { return callback(bridge); }
var callbacks=window.WVJBCallbacks||window.WKWVJBCallbacks
if (callbacks) { return callbacks.push(callback); }
window.WVJBCallbacks=window.WKWVJBCallbacks = [callback];
if(window.WKWebViewJavascriptBridge){
window.webkit.messageHandlers.iOS_Native_InjectJavascript.postMessage(null)
}else{
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
}
setupWebViewJavascriptBridge(function(bridge) {
bridge.callHandler('sendToJava', { success:'true' }, function(response) {
})
})
</script>
</body></html>
if you want more handlers just duplicate this lines and change [jsToJava] and data part (success:true)
如果您想要更多处理程序,只需复制此行并更改 [jsToJava] 和数据部分 (success:true)
bridge.callHandler('sendToJava', { success:'true' }, function(response) {
})
in your xml:
在您的 xml 中:
<wendu.webviewjavascriptbridge.WVJBWebView
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
and java:
和爪哇:
webView = findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setWebViewClient(new AppWebViewClients((ProgressBar) findViewById(R.id.progressBar)));
if (Build.VERSION.SDK_INT >= 21) { // for fix invalid https certification
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webView.registerHandler("sendToJava", new WVJBWebView.WVJBHandler() {
@Override
public void handler(Object data, WVJBWebView.WVJBResponseCallback callback) {
Toast.makeText(ActivityPaymentStepBank.this, data.toString(), LENGTH_SHORT).show();
Log.d("wvjsblog", data.toString());
callback.onResult(data);
}
});
webView.loadUrl("URL OF YOUR HTML FILE");