Codenameone 如何创建一个带有选择器的弹出窗口,其中选择器立即处于活动状态,并且带有';跳过';选项

Codenameone 如何创建一个带有选择器的弹出窗口,其中选择器立即处于活动状态,并且带有';跳过';选项,codenameone,Codenameone,在我的UI中有几个地方,用户单击一个操作,然后我想显示一个弹出窗口(类似于)一个对话框,邀请他/她添加可选信息,例如使用选择器输入日期 我们的想法是,这个弹出窗口应该尽可能少的干扰,并且需要尽可能少的点击,所以我想像是一个对话框,其中有一个解释文本和一个选择器已经激活,这样用户就可以直接滑动到正确的日期并推送完成,还有一个[跳过]按钮直接关闭对话框而不输入任何内容 但是,我尝试了许多不同的解决方案,选择器(即使在灯光模式下)出现在对话框外部,在选择器中单击“完成”时,我无法关闭对话框 有人对如何

在我的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部分(希望如果您更改它,它将在编译级别中断,这样我就不需要在每个构建中测试它:-)。如果您更改/删除它,我想我可以转而使用表单来显示本机微调器。对话框的好处尤其是它感觉不那么烦人,你可以看到下面的表单,因此它提醒你上下文。