【问题标题】:Are InputComponents and Dialogs incompatible?InputComponents 和 Dialogs 不兼容吗?
【发布时间】:2018-11-26 16:35:54
【问题描述】:

在下面的简单对话框中:

  // choice of layout has no impact:
  Container cont=new Container(new TextModeLayout(3, 1));
  //Container cont=new Container(new BoxLayout(BoxLayout.Y_AXIS));
  TextComponent firstName=new TextComponent().label("First Name").text(person.firstname);
  TextComponent lastName=new TextComponent().label("Last Name").text(person.lastname);
  TextComponent cost=new TextComponent().label("Cost per Session").text(person.getCostString());
  cost.getField().setConstraint(TextArea.DECIMAL);
  // NOTE HERE
  // doesn't work:       // works:
  cont.add(firstName);   // cont.add(firstName.getField());
  cont.add(lastName);    // cont.add(lastName.getField());
  cont.add(cost);        // cont.add(cost.getField());
  Dialog.show("Edit Client", cont, new Command(CANCEL), new Command(OK));

除非我在 NOTE HERE 注释中将 TextField 而不是 TextComponent 添加到我的容器中,否则对话框中不会出现任何内容。这意味着我失去了标记输入字段的漂亮外观(是的,我知道我可以自己标记它们,但它们在不同的设备上看起来不会那么好)。我在顶部选择的布局管理器不会影响这个问题(我已经尝试了几个)。我在网上找不到证据来断定这里存在不兼容,添加 TextComponents 和其他 InputComponents 在 Form 上可以正常工作,而不是在 Dialog 中。

我在另一个使用 PickerComponents 的对话框中遇到了同样的问题。除非我添加 Picker 本身,否则 PickerComponent 不会出现,然后从 Dialog 生成的 Picker 看起来都错了。我希望上面更简单的代码问题也能回答这个难题。

值得注意的是,我没有对主题进行任何更改,并且在 Android 和 Apple 皮肤以及实际的 Android 手机上都发现了这个问题。提前感谢您的帮助!

【问题讨论】:

    标签: dialog codenameone


    【解决方案1】:

    您不应该在Dialog 中进行输入,因为它会造成非常有问题的用户体验。如果您希望事物看起来像在对话框中,您可以使用样式和布局使Form 感觉像Dialog,但您不应该使用Dialog

    失败的原因有点复杂,但这里是使用对话框的高级问题:

    • 对话框不会隐式增长 - 这对于文本输入来说是一个大问题,因为组件需要空间来调整输入大小,对于需要移动内容的动画 TextComponent 来说更是如此。 Dialog 的大小是在显示时确定的,这是个大问题

    • 这在 Android 上成为一个更大的问题,在输入过程中屏幕会调整大小并完全扭曲对话框。这是您只能在设备上看到的内容之一,因为虚拟键盘真的很难模拟。

    • Dialog 中的可滚动性很难,文本组件需要一个可滚动的父组件,以便您可以在各种编辑组件之间滚动

    • Picker 组件使用Dialog 的形式来显示输入,这可能会与您的对话框发生冲突

    • 对于暂停/恢复行为,很难正确设置对话框。当应用程序最小化或发送到后台时会发生暂停/恢复。例如。假设您在对话框中输入时有来电。当您返回应用程序时,我们希望显示最后一个表单。如果我们显示对话框,它将阻塞,我们也不知道要显示哪个父窗体。因此,当应用程序暂停时,对话框只是放置在主类中生成的默认代码中。这更有意义。

    【讨论】:

    • 确认,问题很大。之前有没有介绍过如何使表单看起来像对话框的技巧和窍门?猜测它会涉及拍摄当前屏幕的快照,将其用作新表单的背景图像,然后在中心绘制人造 Dialog 9 块框并从那里继续?感谢您快速而彻底的解释,非常感谢!
    • 如果你想伪造整个行为,你最好使用InteractionDialog,只要确保它的内容窗格是可滚动的。或者,您可以使用 myContainer.setUIID("Dialog") 到达那里(还有 DialogTitle 等)。我想不出一个地方可以在我的脑海中演示这个。这确实值得一些文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多