如何使用WebView.addJavascriptInterface将javascript函数格式的java类绑定为“A.B.func()”

时间:2011-06-30 01:18:56

标签: android webview

我想在我的应用程序的WebView活动上支持一些格式为“A.B.func()”的自定义JavaScript接口。

这是一个示例

网页的html& js代码如下:

<html>
    <body>
        <script type="text/javascript">
            document.write("B.func1() return " + A.B.func());
        </script>
    </body>
</html>

我的java代码如下:

public class MyDemo extends Activity {
    private WebView mWebView;

    public void onCreate(Bundle savedInstanceState) {
        ...
        mWebView = (WebView)findViewById(R.id.webView1);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new AClass(), "A");
        mWebView.loadUrl("file:///android_asset/mydemo.html");
    }

    final class AClass {
        final class BClass {
            BClass() {}
            int func() { return 1; }
        }

        public BClass B = new BClass();

        AClass() {}
    }
}

但是当我在模拟器上运行我的应用程序时,它无法以正确的方式运行。并且LogCat向我发送警告,例如:   TypeError : Result of expression 'A.B' [undefined] is not an object. at file:///android_asset/mydemo.html

所以我的问题是:
1.如果我想将javascript接口格式作为“A.B.func()”绑定到我的java类,我该怎么办呢?
2.如果我想直接获取javascript类的属性,而不是通过函数调用,我该怎么办?      一个javascript示例来显示Q2      使用“var prop = A.property”      不要使用“var prop = A.getProperty()”

期待你的帮助!谢谢!

2 个答案:

答案 0 :(得分:3)

我认为你不能。您可以在A中添加方法,例如b_doSomething(){B.doSomething()}来“转发”您的调用,并从javascript中调用这些方法。

至于访问属性,我不确定是否可能,Javascript接口是为调用方法而设计的(我猜是非常像普通的Java接口)。

答案 1 :(得分:3)

Eclipse在LogCat中显示消息“Uncaught TypeError:Object [object Object]没有方法'toast'”。但在手机中它成功运作......

<script>
    function doHemant() {
       jse.doThis();
    }
</script>

<input type="button" value="Toast" onClick="doHemant();" /> <br />

wv.addJavascriptInterface(new JavaScriptExtensions(), "jse");

class JavaScriptExtensions 
{ 
    public void doThis() 
    {
       Toast.makeText(MainActivity.this, "Wata Toast...", TOAST_LONG).show();
    }
}