9

我有一个 WebView,它通过单击 Android 按钮将一些 JavaScript 加载到 WebView 中。

我的问题是如何在加载时将 Android 变量传递给 JavaScript。

我当前将 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');");
    }
};

initialize()所以我需要从 Android向 JavaScript 传递一些东西。

4

5 回答 5

13

Java 类:

public class JavaScriptInterface {
    Context mContext;
    JavaScriptInterface(Context c) {
        mContext = c;
    }    
    @JavascriptInterface
    public String getFromAndroid() {
        return "This is from android.";
    }
}

网页浏览代码:

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和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>
于 2016-03-18T16:42:53.260 回答
9

首先你只需要加载一次脚本(你onClick每次都加载它),然后调用loadUrl("javascript:initialize(" + myNumber + ");")

于 2013-09-25T11:55:12.633 回答
2

对我有用的正确语法是

StringBuilder buf=new StringBuilder("javascript:testFunction('"+bar+"','"+foo+"')");
Log.d(TAG, "returned string:"+buf.toString());
mWebView.loadUrl(buf.toString());
于 2015-05-21T20:49:53.917 回答
0

您需要在 webView 中加载 URL,我在以前的应用程序中得到了类似的内容:

webView.loadUrl("javascript:wrapJS.functionName("+value+","+value+")"+);
于 2013-09-25T09:52:05.780 回答
0

将 JitPack 存储库添加到您的构建文件

allprojects {
      repositories {
        ...
        maven { url 'https://jitpack.io' }
      }
}

将此添加到应用程序 gradle 文件:

dependencies {
      compile 'com.github.wendux:WebViewJavascriptBridge:master-SNAPSHOT'
    }

像这样准备你的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>

如果您想要更多处理程序,只需复制此行并更改 [jsToJava] 和数据部分(成功:true)

 bridge.callHandler('sendToJava', { success:'true' }, function(response) {
            })

在你的 xml 中:

        <wendu.webviewjavascriptbridge.WVJBWebView
        android:id="@+id/webView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

和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");
于 2018-06-07T08:59:44.780 回答