2

「this」パラメータをjavascriptからAndroidのネイティブレイヤーに渡したいです。

function abc() {

    function callf() {
        // 'this' should refer to the instance of the 
        // abc object
        Native.call(this);
    }
 }

これは、ネイティブ層から「abc」インスタンスの関数を呼び出せるようにするためです。

「this」または単にオブジェクトを直接使用してオブジェクトを渡すと、「null」が返されます。

これを解決する方法を知っている人はいますか?

ありがとう、
ラジャス

4

4 に答える 4

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コードがある場合(「ネイティブ」と同じオブジェクトを公開したと仮定):

ジャワ

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();

基板レイヤーは再利用可能で標準になっているため、グローバル変数の設定やそのようなクレイジーなことを心配する必要はありません。さらに、ネイティブレイヤーの内外の任意の数の引数で機能します...

これが役立つことを願っています -ck

于 2012-10-18T22:04:03.723 に答える
1

あなたの例はのを渡していることに注意してthisくださいcallfabcに'sthisを渡す必要がありますcallf

function abc() {
    function callf() {
        Native.call(this);
    }
    // ...
    callf.call(this);
    // ...
}

またはクロージャー付き:

function abc() {
    var that = this;
    function callf() {
        Native.call(that);
    }
    // ...
    callf();
    // ...
}

編集:

Javaに渡すことができる値の種類にはまだ制限があります。この質問を参照してください。

于 2012-10-18T11:44:50.603 に答える
1

Nativeが、addJavascriptInterface()を使用してWebビューにバインドしたメソッド「call」を使用して名前付きJavaオブジェクトとしてマップされていると仮定すると(関連するhttps://stackoverflow.com/a/12832132/1367983を参照)、 Webビューの外部で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 + ");");
于 2012-10-12T06:41:08.733 に答える
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")
于 2012-10-18T14:23:53.773 に答える