从Android Activity中调用JavaScript函数

4
我在主活动中使用以下代码,它提示函数 display() 未定义。
public class cordovaExample extends DroidGap {
    Context mcontext;
    private novel n;
    private Server s;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new Thread(new Server(this)).start();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) { }
        new Thread(new Client()).start();

        super.init();

        n = new novel(this, appView); 
        s = new Server(this,appView);

        appView.getSettings().setJavaScriptEnabled(true);
        appView.addJavascriptInterface(n, "novel");
        appView.addJavascriptInterface(s, "Server");

        super.loadUrl("file:///android_asset/www/index.html");
        super.loadUrl("javascript:display()");
    }
}

在最后一行出现了错误,显示"display()"未定义。
function display() {
    alert("abc");
}

上述代码展示了我在HTML文件中使用的display函数。
欢迎任何形式的帮助。
2个回答

6

让Cordova在页面加载时加载JavaScript是一个不好的主意。这应该由本地JavaScript处理。尝试在HTML页面中像这样调用display()函数:

<script>
    function display()
    {


        alert("abc");


    }

    window.onload = function() {
        display();
    }
</script>

如果您需要在稍后的任何时候从Cordova中调用JavaScript,可以通过以下方式实现:

sendJavascript("display();");

要从其他类中访问此方法,您需要访问主活动。简单但可能不安全的方法是在主Activity中创建一个静态变量来保存活动本身。示例:

public class MyActivity extends DroidGap {
    public static MyActivity activity;

    public void onCreate(Bundle savedInstanceState) {
        activity = this;
    }
}

然后,在你的课程中的任何位置,执行以下操作:
MyActivity.activity.sendJavascript('display();');

谢谢您的回答,如果我想从不是活动的其他方法调用JavaScript方法,那么怎么办? - akshay1728
顺便说一下,插件始终可以访问 sendJavascript() 函数。 - Zathrus Writer
@ZathrusWriter 你好,我正在重写CordovaWebViewClient类的shouldOverrideUrlLoading方法。从那里调用sendJavascript("alert('1234');");似乎不起作用。有什么想法吗?问题已发布在这里 - arod
@arod 抱歉,我已经半年没有使用 PhoneGap 了,所以无法回答你的问题。但还是祝你好运! - Zathrus Writer

1
从Cordova 2.6开始,您可以在CordovaActivity(DroidGap)中覆盖onMessage函数,您需要捕获消息“onPageFinished”,然后可以调用文档中声明的任何函数。请注意保留HTML标签。
@Override
public Object onMessage(String id, Object data) {
    if("onPageFinished".equals(id)) {
        sendJavascript("display('abc');");
    }
    return super.onMessage(id, data);
}

在HTML中:


<script>
    function display(arg) {
        alert(arg);
    }
</script>

另一个选项是在CordovaActivity的onResume()函数中调用它:
@Override
public void onResume() {
    super.onResume();
    sendJavascript("display('abc');");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接