Codename One 仅在我点击屏幕时关闭弹出对话框

Codename One close PopUp dialog only when I tap the screen

我有一个 Android 带有许多解释性弹出对话框。

我只想在按下对话框内的关闭按钮时关闭那些,而不是在点击对话框外的屏幕时关闭。

我正在使用 setDisposeWhenPointerOutOfBounds 设置为 false,但这似乎只适用于不是弹出式样式的对话框。

有没有办法实现弹出对话框的这种行为?

非常感谢。

这是我的代码:

public void dialogTest () {
    
    Dialog dialog = new Dialog("Test");
    dialog.add(new Button ("Test")).add(new Button("TestTwo"));
    dialog.setDisposeWhenPointerOutOfBounds(false);  // flag is set to false, but dialog closes anyway when I tap on the screen
    dialog.showPopupDialog(buttonTest);
    
}

当您显示 Dialog(弹出窗口或其他方式)时,其背后的表单不是“真实的”。由于 Dialog IS A Form 它总是占据整个屏幕。您在后台看到的是之前Form.

的截图

您感兴趣的是 InteractionDialog,它也有一个弹出选项。它以不同的方式工作,并允许您与其下方的 Form 进行交互。参见 https://www.codenameone.com/blog/picking-dialog-type.html

@rainer 是的,这是可能的。然而,首先,一个简短的解释。由于我不知道的原因,在第 1176 行的 Dialog.java 文件中,强加了 disposeWhenPointerOutOfBounds = true;。大家可以自行查看:https://github.com/codenameone/CodenameOne/blob/1ad583bae9e05954c6bff852649d3b6d8264414b/CodenameOne/src/com/codename1/ui/Dialog.java#L1176

这就是 dialog.setDisposeWhenPointerOutOfBounds(false); 对您不起作用的原因,因为它被设计为仅适用于普通对话框,而不适用于对话框弹出窗口。

Javadoc 中也指定了此行为,所以这似乎是一个有意的选择,虽然我不知道为什么,特别是,我不知道 Android 和 [= 之间是否存在差异25=] 在这一点上,因为他们有不同的默认方式来创建弹出对话框(也许问题就在这里)。

说了这么多,解决方法很简单:在模拟器上能用,真机上能不能用我就让你试试。只需以这种方式覆盖 onShow 方法:

Dialog d = new Dialog(new BorderLayout()){
    @Override
    protected void onShow() {
         this.setDisposeWhenPointerOutOfBounds(false);
    }
};
[...]
d.showPopupDialog(buttonTest);