CN1 - Dialog.dispose()导致父表单返回"返回"

时间:2017-02-27 14:53:37

标签: codenameone

我需要一些帮助来理解Dialog.dispose()的一些奇怪行为。我正在尝试创建一个" loading"在允许用户查看内容之前,将在下载内容时使用的对话框。在这种情况下,它是一个声音文件。

我遇到的问题是当我dispose()" loading"对话框,当前表单收到"返回"在模拟器上命令并转换到导航堆栈上的上一个表单。

我在程序开始initVars预先创建对话框,其中包含以下内容:

Dialog updatingDialog = new Dialog(updatingMessage);
updatingDialog.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
updatingDialog.add(progressContainer);
updatingDialog.setDialogUIID("UpdateProgressDialog");

我使用以下方法导航到(GUI Builder)表格,其中包含有问题的对话框:

showForm(formName, null)

在该表单中,当用户单击某个按钮时,我会显示该对话框,调用downloadUrlToStorage(如果该文件尚未缓存在存储中),然后调用dialog.dispose()。这些是使用传递到另一个类中的方法的Runnables来完成的,以便在不同情况下可重用:

showLoading.run();
Display.getInstance().invokeAndBlock(()->{
    Util.downloadUrlToStorage(this.url, getStoredName(), false);
});
hideLoading.run();

showLoadinghideLoadingRunnables从调用方法传入方法的。以下是它们的设置方式(load是加载对话框):

showLoading = new Runnable() {
    @Override
    public void run(){
    if (!load.isVisible()){
            load.showModeless();
        }
    }
};

hideLoading = new Runnable() {
    @Override
    public void run(){
        if (load.isVisible()){
            load.dispose();
        }
    }
};

因此,Dialog.dispose()可能导致显示对话框转换回来的形式有明显的原因,我该怎样才能阻止它?

1 个答案:

答案 0 :(得分:2)

好的,我相信我通过一些试验和错误解决了我的问题,但我想分享我如何解决它,以防其他人发现类似的东西绊倒它们。

我意识到一遍又一遍地使用相同的对话可能会使事情变得复杂,所以我开始为每个加载消息创建一个新的对话框,而我似乎已经纠正了这种行为(是的,我拼写了加拿大的方式!;-D) 。

这使我得出结论,Dialog被绑定到一个表单,然后当它再次操作时,它可以影响原始表单。它导航的形式"返回"处理我的问题与对话框首次显示的形式相同,导致我认为这是原因。

来自CodenameOne的任何人都可以在此确认我的诊断,在不同形式上重复使用对话可能会产生意想不到的导航后果并且是避免的最佳做法吗?