Javascript回调函数传递给Android [英] Javascript Callback function pass to Android

查看:26
本文介绍了Javascript回调函数传递给Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用 Java 实现的 javascript 接口,由我在 webview 中加载的 javascript 代码调用.

JS 内部网页视图:

Android.myFunction(function(data){控制台日志(数据);});

Java:

公共类 JavaScriptInterface {上下文上下文;WebView webView;JavaScriptInterface(Context c, WebView w) {上下文 = c;网络视图 = w;}公共无效我的功能(字符串回调){//当我记录回调时,它是未定义的"String someData = "Yay for data";字符串 js ="javascript:(function() { "+ "var 回调 = " + 回调 + ";"+ "回调('" + someData + "');"+ "})()";webView.loadUrl(js);}}

webview 加载的字符串最终是:

javascript:(function() {var callback = undefined; undefined();})()

我有几个想法:

一个.在 JS 中将回调构建为字符串.

B.在将其传递给 Android.myFunction() 之前调用回调的 toString();

我的问题是,这样做的最佳方法是什么?我希望能够将对象传递给 Android 并且它神奇地起作用.显然,情况并非如此.;) 下一个最好的方法是什么?

解决方案

您将无法按照指定的方式传递函数.您将一个函数传递给 Android.myData,但 Android.myData 需要一个字符串.相反,你可能想要

var myCallback = console.log;Android.myFunction("myCallback");

您仍然有问题,因为您没有将任何数据传递给回调.虽然这与您的问题没有直接关系,但它会成为一个问题,因为您将遇到相同的字符串转换问题(可通过 JSON 解决...但如果 Android 为您处理那部分会很好).

最后,您可以将 javascript: 字符串缩短为

String js = "javascript:" + callback + "();";

但是,当然,先测试;)

I have a javascript interface implemented in Java that is called by my javascript code that is loaded in the webview.

JS Inside webview:

Android.myFunction(function(data){
    console.log(data);
});

Java:

public class JavaScriptInterface {

    Context context;
    WebView webView;

    JavaScriptInterface(Context c, WebView w) {
        context = c;
        webView = w;
    }

    public void myFunction(String callback) {
        //when I log callback, it is "undefined"
         String someData = "Yay for data";
         String js =
             "javascript:(function() { "
                 + "var callback = " + callback + ";"
                 + "callback('" + someData + "');"
             + "})()";
        webView.loadUrl(js);
    }
}

The string that gets loaded by webview ends up being:

javascript:(function() {var callback = undefined; undefined();})()

I have a few ideas:

a. Build the callback in JS as a string.

b. Call the callback's toString() before passing it to Android.myFunction();

My question is, what is the best way to do this? I would love to be able to just pass objects over to Android and it magically works out. Obviously, this isn't the case. ;) What is the next best way to do it?

解决方案

You won't be able to pass the function in how you have it specified. You pass a function to Android.myData, but Android.myData takes a string. Instead, you probably want

var myCallback = console.log;
Android.myFunction("myCallback");

You still have a problem in that you aren't passing any data to the callback. While that's not directly related to your question, it will become an issue since you'll have the same cast to/from string issue (solvable via JSON... but it would be nice if Android handled that part for you).

Finally, you can probably shorten the javascript: string to

String js = "javascript:" + callback + "();";

But, of course, test first ;)

这篇关于Javascript回调函数传递给Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆