Как создать всплывающее окно с помощью средства выбора, в котором средство выбора сразу становится активным и с опцией «Пропустить»? - PullRequest
1 голос
/ 17 июня 2020

У меня есть несколько мест в моем пользовательском интерфейсе, где пользователь щелкает действие, а затем я хотел бы показать всплывающее окно с (что-то вроде) Dialog, чтобы предложить ему добавить дополнительную информацию, например используйте Picker для ввода даты.

Идея состоит в том, что это всплывающее окно должно быть как можно меньше навязчивым и требовать как можно меньше щелчков мышью, поэтому я думал что-то вроде Dialog с текстом объяснения и Picker уже активированным, поэтому Пользователь может провести пальцем по экрану вправо и указать дату sh Готово, а также кнопку [Пропустить], чтобы закрыть диалоговое окно, ничего не вводя.

Однако я пробовал много разных решений, и средство выбора (даже в режиме Light) появляется за пределами диалогового окна, и я не могу закрыть диалоговое окно при нажатии кнопки «Готово» в средстве выбора.

Есть ли у кого-нибудь предложения, как этого можно достичь?

1 Ответ

1 голос
/ 21 июня 2020

Вот как я, наконец, реализовал это, используя не-publi c компоненты, используемые Spinners (поэтому класс нужно поместить в com.codename1.ui.spinner). Я также заметил проблему в DateSpinner3D, которая устанавливает время дня случайным образом (по времени активации), что означает, что он может изменить дату, даже если она не редактировалась, но я сделаю PR для этого.

Я реализовал только поддержку элементов Picker, которые я использую в настоящее время.

Я добавил скриншот (только тестовые цвета): [! [Введите здесь описание изображения] [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
...