在Android和WebView之间传递多个数据

时间:2018-08-20 02:30:34

标签: javascript android kotlin android-webview

我是Android的新手,并且重用了IOS中使用的javascript代码。

该代码要求从Android传递数据。到目前为止,我看过的教程都传递了一条烤面包消息或一个简单的字符串。

我该如何从Android传递数据,在这里我可以通过javascript访问数据,就像访问data.questiondata.choices一样?

此外,下面的JavaScript在passData()函数中将用户选择的答案返回给Android。有人可以提供示例代码,说明我如何接受和处理Android的返回值吗?我正在使用Kotlin。

<script type="text/javascript">

            function printData(data) {

                var questionLabel = document.getElementById("question")
                questionLabel.innerHTML = data.question
                var counterLabel = document.getElementById("counter")
                counterLabel.innerHTML = "Question " + data.activityCounter + " of " + data.numberOfActivities

                var im = document.createElement('img');
                if (data.graphicURI != null) {
                    im.src = data.graphicURI;
                    im.className = 'img-fluid img-rounded image-question';
                    document.getElementById('imageContainer').appendChild(im)
                }

                var i=0, doc = document, docFrag = document.createDocumentFragment();
                for (; i < data.choices.length ; i++){

                    var elem = doc.createElement('input');
                    elem.type = 'button';
                    elem.className = 'card mb-3 col-10 card-body';
                    elem.value = data.choices[i];
                    elem.tag = i;

                    elem.addEventListener("click", function() {
                                          passData(this.value)
                                          }, false);
                    docFrag.appendChild(elem);
                }

                document.getElementById("choicesContainer").appendChild(docFrag);

                if (((window.innerHeight + window.scrollY) >= document.body.offsetHeight) == false) {
                    document.getElementById("seeBottom").style.display = "block";
                }
            }

            function passData(data) {


                if (confirm("Are you sure you want to submit?")) {
                    console.log("yes");
                    window.webkit.messageHandlers.answer.postMessage(data);
                } else {
                    console.log("nO");
                }

            }
        </script>

1 个答案:

答案 0 :(得分:0)

首先,我们需要在javascript代码和客户端android代码之间创建一个接口,

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void sendValueToAndroid(int value) {

        // Do your operations on value here
        // For example:
        value = value * 500;
        Toast.makeText(getContext(),"Value is :" + value , Toast.LENGTH_SHORT).show();

    }
}

注意:不要忘记在函数上方添加@JavascriptInterface注释,否则JS将无法识别该函数

然后我们可以将该界面绑定到网络视图,

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

现在设置了android代码和javascript之间的接口。我们可以将数据从javascript共享到android。

为了访问javascript端中的函数,请像这样调用函数,

Android.sendValueToAndroid(5);

Android 是我们用来表示JS这是android方面的功能的标识符。

因此,为了具有类似的其他功能,请将其添加到WebAppInterface类中,然后可以像这样在JS端访问该功能

Android.yourFunction();