我想将“this”参数从javascript传递到android中的本机层。
function abc() {
function callf() {
// 'this' should refer to the instance of the
// abc object
Native.call(this);
}
}
这是为了能够从本机层调用'abc'实例上的函数。
当我传递一个对象时,无论是使用'this'还是直接使用一个对象,都会给出'null'。
有谁知道如何解决这个问题?
谢谢,
Rajath
答案 0 :(得分:2)
当我需要做这样的事情时,我使用这样的基质层:
<强>的javascript 强>
(function() {
var callbacks = {};
function getNewId() {
return Math.round(Math.random() * 999999999);
}
window.__withCallback = function(func, context, callback, params) {
var cbId = getNewId(),
args = Array.prototype.slice.call(arguments, 2);
while (cbId in callbacks) {
cbId = getNewId();
}
args.unshift(cbId);
callbacks[cbId] = { context: context, callback: callback };
func.apply(Native, args);
};
window.__callbackFromNative = function(id, params) {
var args,
cbItem = callbacks[id];
if (cbItem && typeof(cbItem.callback) === 'function') {
args = Array.prototype.slice.call(arguments, 1);
cbItem.callback.apply(cbItem.context, args);
}
delete callbacks[id];
};
}());
所以现在当你有Java代码时(假设你公开了与“Native”相同的对象):
<强>的java 强>
class Native {
public void test (long callbackId, String param1, String param2) {
// do java stuff in here
// webView is your webView
webView.loadUrl("javascript:__callbackFromNative(" + callbackId + ", 'yay', 69)");
}
}
并像这样使用它:
<强>的javascript 强>
var awesome = {
test2: function(arg1, arg2) {
// callback
},
startTest: function() {
// here's the way you pass "this" to "Native.test",
// this.test2 is the function you want to "callback" to
// the rest are all params
__withCallback(Native.test, this, this.test2, "xxx", 'yay');
}
};
awesome.startTest();
基板层现在可以重复使用并且是标准的,因此您不必担心设置全局变量或任何类似的疯狂事件,而且它可以在本机层内外使用任意数量的参数...
希望这有助于确认
答案 1 :(得分:1)
假设Native被映射为命名的java对象,其方法为“call”,您使用addJavascriptInterface()绑定到Web视图(请参阅相关的https://stackoverflow.com/a/12832132/1367983),我认为您应该跳过尝试调用任何操作在webview之外的javascript绑定对象,只需使用动态生成的javascript url生成你想要在其上运行的逻辑,然后可以使用webview的loadUrl()方法执行。
in js of html content rendered by webview:
var myVar;
...
myVar = this;
Native.call('myVar');
...
in javascript interface class Native's implementation of call()
webView.loadUrl("javascript:myVar.doSomething('" + stringFromApp1 + "', " + numberFromApp1 + ");");
答案 2 :(得分:1)
请注意,您的示例正在传递this
的{{1}}。您必须将callf
的{{1}}传递给abc
:
this
或使用closure:
callf
编辑:
您仍然可以使用哪种值传递给Java,请参阅this question。
答案 3 :(得分:0)
这是一个很长的镜头,但您可以将“this”对象字符串化并将其用作Java中的JSON对象
JavaScript中的
function abc() {
function callf() {
// 'this' should refer to the instance of the
// abc object
Native.call(JSON.stringify(this));
}
}
Java中的
class Native {
public void call (String object)
{
try {
JSONObject thisObject = new JSONObject(object);
// do whatever you want to the thisObject
} catch (JSONException e) {
e.printStackTrace();
}
}
}
我不记得在收到对象时是否会对其进行编码。如果是,您可以使用:
URLDecoder.decode(object, "UTF-8")