Android中类似BrowserComponent的Javascript接口

Android中类似BrowserComponent的Javascript接口,javascript,java,android,webview,codenameone,Javascript,Java,Android,Webview,Codenameone,我试图在代号为One的Java应用程序的Browser组件中实现一个简单的编辑功能 BrowserComponent editText=new BrowserComponent(); editText.addJSCallback( "call= function(result){callback.onSuccess(result);}", res -> { System.out.println(res); } ); edit

我试图在代号为One的Java应用程序的Browser组件中实现一个简单的编辑功能

BrowserComponent editText=new BrowserComponent();

editText.addJSCallback(
    "call= function(result){callback.onSuccess(result);}",
    res -> {
        System.out.println(res);

    }
);

editText.execute("body=document.body;body.innerHTML='<div id=\"editText\" style=\"font-size:40px;\";contenteditable=\"true\">This text can be edited by the user.</div>';");


    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            editText.execute("var position = window.getSelection().getRangeAt(0).startOffset;call(position);");
        }
    });
点击按钮后

在第二个版本中,根本不调用onload事件


怎么了?如何在Android中实现与Javascript界面相同的功能?

我不太使用互操作,但有几点很突出。首先,您需要使用onLoad回调来编写期望内容出现的代码。其次,你可以在空白页上执行的假设似乎是错误的。您需要加载一个页面。您可以使用
setPage()
提供硬编码的HTML/JavaScript,然后在onLoad之后进行处理,这似乎是您正在尝试的accomplish@ShaiAlmog注意到执行(“el=document.getElementById('editText');el.innerHTML='changed';”;(在listener中)工作正常,因此我不认为BrowserComponent中的页面格式不好。我不需要一次调用,每次单击都必须是支持Java代码中的某种“事件”,就像Android中一样。为什么回拨不起作用?如何在Android上拥有相同的功能?或者类似的解决方法?你可以像在Android中一样使用这些东西,你只需要在“onLoad”回调发生后开始绑定它们,以确保浏览器组件为你准备好。然后你可以在那一刻写你想要的任何东西。这样想吧,你的代码名是一个线程。当您新建
浏览器组件时,它不存在。它需要在操作系统本机线程中创建浏览器,甚至浏览器也有自己的线程需要初始化和加载。这可能会在很久以后发生。。。因此,当我们知道浏览器已经为您的代码做好准备时,第一次使用必须开始。@Shai Almog所以,我在onload回调中放了一些指令,但这里的主要事实是,回调似乎彼此独立,也就是说,如果我在一个回调中定义了一个函数,然后我想在另一个回调中调用它,我会得到运行时异常“找不到变量:call”。我需要一种方法从HTML页面中的JS脚本调用Java代码,就像在Android上一样。我不知道如何调用。@Shai Almog我调用addWebEventListener为“onload”事件设置回调,该事件在按钮事件内设置另一个回调,然后(在onload事件外)我调用setPage作为下一条指令,页面被加载,但事件从未被调用。
editText.addWebEventListener("onload",(e)->{
        System.out.println("onload");

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        editText.addJSCallback(
                "var position = window.getSelection().getRangeAt(0).startOffset;callback.onSuccess(position);",
                res -> {
                    System.out.println(res);

                }
        );
    }

});

            
        }
    );

    editText.setPage("<HTML><BODY><div id=\"editText\" style=\"font-size:40px;\" contenteditable=\"true\">This text can be edited by the user.</div></BODY></HTML>","");
    mainLayout.add(editText);
Exception in thread "JavaFX Application Thread" netscape.javascript.JSException: IndexSizeError: The index is not in the allowed range.