Как правильно использовать Picker и BrowserComponent в одной форме? - PullRequest
0 голосов
/ 20 декабря 2018

Мне нужно использовать и Picker и BrowserComponent в одной форме.

Picker позволит пользователю выбиратьзначение, используемое для создания HTML-кода, который будет отображаться BrowserComponent .

Следующий код хорошо работает в Android.

В iOS после использования средства выборачтобы выбрать значение, все запутается: средство выбора остается нарисованным на экране, BrowserComponent пуст и приложение зависает!?

Ошибка в Codename One?

Проблема воспроизводима на iOS 10, 10.3.3 и 12.1

package edu.ch.emf.praesto;

import static com.codename1.ui.CN.*;
import com.codename1.ui.Display;
import com.codename1.ui.Form;
import com.codename1.ui.Dialog;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
import com.codename1.ui.BrowserComponent;
import com.codename1.ui.CN1Constants;
import com.codename1.ui.layouts.BorderLayout;
import com.codename1.ui.spinner.Picker;

public class App {

    private Form currentForm;
    private Resources theme;

    public void init(Object context) {
        // Loading the theme
        this.theme = UIManager.initFirstTheme("/theme");
    }

    public void start() {

        // Load last shown form on reopening
        if (this.currentForm != null) {
            this.currentForm.show();
            return;
        }

        // Force orientation locking if the plattform supports it
        if (Display.getInstance().canForceOrientation()) {
            Display.getInstance().lockOrientation(true);
        }

        Form form = new Form(new BorderLayout());

        String[] strs = new String[]{"Option 1", "Option 2", "Option 3"};

        Picker picker = new Picker();
        picker.setType(CN1Constants.PICKER_TYPE_STRINGS);
        picker.setStrings(strs);
        form.add(BorderLayout.NORTH, picker);

        BrowserComponent htmlViewer = new BrowserComponent();
        htmlViewer.setPage("<html><head></head><body><h1>Test</h1></body></html>", null);
        form.add(BorderLayout.CENTER, htmlViewer);

        form.show();
    }

    public void stop() {
        this.currentForm = getCurrentForm();
        if (this.currentForm instanceof Dialog) {
            ((Dialog) this.currentForm).dispose();
            this.currentForm = getCurrentForm();
        }
    }

    public void destroy() {
    }
}

1 Ответ

0 голосов
/ 21 декабря 2018

Используйте Picker.setDefaultUseLightweightPopup(true), чтобы заставить средство выбора использовать реализацию, отображаемую на Java, вместо нестабильной реализации в iOS.

К сожалению, это может привести к тому, что средство выбора на Android будет вести себя как средство выбора iOS, которое не является оптимальнымдля всех случаев.Так что вы можете попробовать исключить Android из этой логики.

...