更新
我尝试在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();
}
答案 0 :(得分:1)
使用setBackCommand
覆盖后退按钮的行为,并设置您可能拥有的任何业务逻辑,包括调用JavaScript代码。