Codenameone 如何创建一个带有选择器的弹出窗口,其中选择器立即处于活动状态,并且带有';跳过';选项
在我的UI中有几个地方,用户单击一个操作,然后我想显示一个弹出窗口(类似于)一个Codenameone 如何创建一个带有选择器的弹出窗口,其中选择器立即处于活动状态,并且带有';跳过';选项,codenameone,Codenameone,在我的UI中有几个地方,用户单击一个操作,然后我想显示一个弹出窗口(类似于)一个对话框,邀请他/她添加可选信息,例如使用选择器输入日期 我们的想法是,这个弹出窗口应该尽可能少的干扰,并且需要尽可能少的点击,所以我想像是一个对话框,其中有一个解释文本和一个选择器已经激活,这样用户就可以直接滑动到正确的日期并推送完成,还有一个[跳过]按钮直接关闭对话框而不输入任何内容 但是,我尝试了许多不同的解决方案,选择器(即使在灯光模式下)出现在对话框外部,在选择器中单击“完成”时,我无法关闭对话框 有人对如何
对话框
,邀请他/她添加可选信息,例如使用选择器
输入日期
我们的想法是,这个弹出窗口应该尽可能少的干扰,并且需要尽可能少的点击,所以我想像是一个对话框
,其中有一个解释文本和一个选择器
已经激活,这样用户就可以直接滑动到正确的日期并推送完成,还有一个[跳过]按钮直接关闭对话框而不输入任何内容
但是,我尝试了许多不同的解决方案,选择器(即使在灯光模式下)出现在对话框外部,在选择器中单击“完成”时,我无法关闭对话框
有人对如何实现这一点有什么建议吗?下面是我最终如何实现它的,使用微调器使用的非公共组件(因此该类必须放在com.codename1.ui.spinner中)。我还注意到DateSpinner3D中的一个问题,它随机设置了一天中的时间(激活时间),这意味着它可能会更改一个日期,即使不进行编辑,但我会为此做一个PR 我只实现了对当前使用的选择器元素的支持 因此,这不是一个完全可重用/通用的解决方案,但希望它能帮助展示如果有人遇到同样的需求,该如何实现 我添加了一个屏幕截图(仅测试颜色):[![在此处输入图像描述][1]][1]
package com.codename1.ui.spinner;
import com.codename1.components.SpanLabel;
import com.codename1.components.Switch;
import com.codename1.io.Log;
import com.codename1.ui.Button;
import com.codename1.ui.Command;
import com.codename1.ui.Container;
import com.codename1.ui.Dialog;
import com.codename1.ui.Display;
import com.codename1.ui.layouts.BorderLayout;
import com.codename1.ui.layouts.BoxLayout;
import com.parse4cn1.operation.SetFieldOperation;
import java.util.Date;
public class PickerDialog {
Dialog dlg;
Command doneCmd;
int type;
DateTimeSpinner3D dateTimeSpinner;
DateSpinner3D dateSpinner;
DurationSpinner3D durationSpinner3D;
public static String DONE_BUTTON_TEXT = "Done";
public static String CANCEL_BUTTON_TEXT = "Cancel";
public PickerDialog(String title, String text, Object value, String cancelText, String doneText, int type) {
this.type = type;
dlg = new Dialog();
dlg.setDialogUIID("PickerDialog");
dlg.setTitle(title);
dlg.setLayout(BorderLayout.center());
Container cont = new Container(BoxLayout.y());
SpanLabel textSpanLabel = new SpanLabel(text);
textSpanLabel.setTextUIID("PickerDialogText");
cont.add(textSpanLabel);
switch (this.type) {
case Display.PICKER_TYPE_DATE_AND_TIME:
dateTimeSpinner = new DateTimeSpinner3D();
dateTimeSpinner.setValue(value);
cont.add(dateTimeSpinner);
break;
case Display.PICKER_TYPE_DATE:
dateSpinner = new DateSpinner3D();
dateSpinner.setValue(value);
cont.add(dateSpinner);
break;
case Display.PICKER_TYPE_DURATION:
durationSpinner3D = new DurationSpinner3D(DurationSpinner3D.FIELD_HOUR | DurationSpinner3D.FIELD_HOUR);
durationSpinner3D.setValue(value);
cont.add(durationSpinner3D);
break;
}
doneCmd = Command.create(doneText, null, (e) -> {
dlg.dispose();
});
Button doneButton = new Button(doneCmd);
Container buttonBar;
if (cancelText != null && !cancelText.isEmpty()) {
Button cancelButton = new Button(Command.create(cancelText, null, (e) -> {
dlg.dispose();
}));
buttonBar = BorderLayout.centerEastWest(null, doneButton, cancelButton);
} else {
buttonBar = BorderLayout.centerEastWest(doneButton, null, null);
}
dlg.getContentPane().add(BorderLayout.SOUTH, buttonBar);
dlg.getContentPane().add(BorderLayout.CENTER, cont);
}
/**
* return the value of the picker of the defined type (Date or
*
* @return
*/
public Object show() {
Command cmd = dlg.showDialog();
if (cmd == doneCmd) {
switch (type) {
case Display.PICKER_TYPE_DATE_AND_TIME:
return dateTimeSpinner.getValue();
case Display.PICKER_TYPE_DATE:
return dateSpinner.getValue();
case Display.PICKER_TYPE_DURATION:
return durationSpinner3D.getValue();
}
}
return null;
}
}
[1]: https://i.stack.imgur.com/ByvFK.png
你能提供一个截图吗?如果我理解正确,您在对话框中放置了一个选择器。那不行。选取器是对话框,从对话框触发对话框会导致问题……是的,我已经猜到将选取器放置在对话框中可能不可行,因此我对任何有助于实现我所追求的目标的应用程序方法感兴趣。基本上,我想要一个对话框,顶部有一个标题,然后是一些解释性文本,然后是一个已经“打开”的选择器,直接选择一个日期,然后按OK(想想看,在选择器上按Cancel可能会取代跳过按钮的需要)。无论如何,任何其他可以显示在当前屏幕顶部的UI元素也可以,它不必是Dialog。也许
InteractionDialog
会更好地满足您的需要,尽管我不确定,因为我不完全理解您要实现的目标。一般来说,代码名对话框应该相对简单。看到这个:谢了,但是我的意思非常清楚:-)我想要一个模态对话。我终于找到了实现它的方法,在我的回答中,这个答案依赖于内部非公共API。不能保证它们会在未来的更新中出现,它们会在一夜之间消失而不发出警告。是的,我认为这可能是一个风险。但希望它至少能说明我在追求什么。你认为有更好的方法来实现它吗?希望你能看到截图,似乎只是在我答案的底部插入了一个链接。截图没有,但我明白你想要什么。您不希望选取器按钮,而是希望微调器零件嵌入到自定义对话框中。这是有问题的原因是现在组件有点简单化。在Android上,它的行为应该完全不同,因此我们需要更多的代码来了解如何做到这一切,这可能需要一个主要的抽象/重构来无缝切换这些UI元素。不幸的是,目前没有更好的解决方案。感谢您的澄清。我想我现在可以继续嵌入spinner部分(希望如果您更改它,它将在编译级别中断,这样我就不需要在每个构建中测试它:-)。如果您更改/删除它,我想我可以转而使用表单来显示本机微调器。对话框的好处尤其是它感觉不那么烦人,你可以看到下面的表单,因此它提醒你上下文。