Codename One - BrowserComponent:使用后退按钮返回历史记录

时间:2017-08-21 11:27:06

标签: codenameone

更新

我尝试在Android设备上使用BrowserComponent:如果我触摸设备的后退按钮,应用程序什么都不做(使用以下代码)。

在这个问题中,我复制了相关的代码部分。

我的问题是,如果有人能够提供一个工作代码的示例,当按下后退按钮时执行在页面中声明的javascript函数(特别是,转到上一页的函数)。请注意我需要setBrowserNavigationCallback(如下面的代码所示)。

我也很感激有人可以更正代码以正确使用setURLHierarchy,因为它会使模拟器崩溃并且不会在真实设备上加载“/community.html”。

非常感谢您的帮助。

更新:这是我的代码的最后一个版本

public void start() {
    if (current != null) {
        current.show();
        return;
    }
    Form hi = new Form("Community", new BorderLayout());

    // Suppress Android native indicator
    Display.getInstance().setProperty("WebLoadingHidden", "true");

    // Create the BrowserComponent
    browser = new BrowserComponent();

    // Set user-agent
    browser.setProperty("useragent", appAgent);

    // Set the start page - TO CORRECT, it's messy
    if (Display.getInstance().isSimulator()) {
        // I added this condition because opening a local html page
        // causes that the Simulator crashes
        browser.setURL(startPage_development);
        Log.p("BrowserComponet setUrl: " + startPage_development);
    } else {

        try {
            if (!Display.getInstance().isSimulator()) {
                browser.setURLHierarchy("/community.html");
            } else {
                browser.setURLHierarchy("/testing.html");
            }
            Log.p("BrowserComponet setURLHierarchy successfully");
        } catch (Exception err) {
            Log.e(err);
            browser.setURL(startPage);
            Log.p("BrowserComponet setUrl: " + startPage);
        }
    }

    // Javascript Bridge for back command
    JavascriptContext context = new JavascriptContext(browser);
    // JSObject document = (JSObject) context.get("document");
    JSObject window = context.getWindow();
    hi.setBackCommand(new Command("Back") {
        @Override
        public void actionPerformed(ActionEvent evt) {
            //window.call("goBackButton()");
            window.call("eval", new Object[]{"history.go(-1);"});
        }
    });

    // Allow browsing only inside my domains
    browser.setBrowserNavigationCallback((url) -> {
        if (url.startsWith("javascript")
                || url.startsWith(url_Root_development)
                || url.startsWith(url_Root_production)
                || url.startsWith(loginRoot)) {
            return true; // the BrowserComponent should navigate
        } else {
            Display.getInstance().callSerially(() -> {
                // it opens the url with the native platform
                Boolean can = Display.getInstance().canExecute(url);
                if (can != null && can) {
                    Display.getInstance().execute(url);
                }
            });
            return false; // the BrowserComponent shouldn't navigate
        }
    });

    hi.add(BorderLayout.CENTER, browser);
    hi.show();
}

1 个答案:

答案 0 :(得分:1)

使用setBackCommand覆盖后退按钮的行为,并设置您可能拥有的任何业务逻辑,包括调用JavaScript代码。