IllegalArgumentException при использовании собственного компонента Android в LWUIT - PullRequest
0 голосов
/ 02 февраля 2012

Я пытаюсь использовать нативные компоненты в приложении LWUIT на платформе Android.

private Component createNativeTextEdit() {
    final Object[] result = new Object[1];

    AndroidImplementation.runOnAndroidUIThreadAndWait(LWUITActivity.currentActivity, new Runnable() {
        @Override
        public void run() {
            EditText nativeView = new EditText(LWUITActivity.currentActivity);
            nativeView.setText("Type here..");

            result[0] = PeerComponent.create(nativeView);
        }
    });

    return (Component)result[0];   
}

Затем я помещаю компонент внутри формы:

mMainForm = new Form();
mMainForm.setLayout(new BoxLayout(BoxLayout.Y_AXIS));

mMainForm.addComponent(createNativeTextEdit());

mMainForm.show();

Затем я получаю «IllegalArgumentException: ширина и высота должны быть> 0», когда система пытается нарисовать новую форму.

Я проследил проблему до вызова AndroidImplementation.PeerWrapper.getBuffer (), а значения, возвращаемые getWidth () и getHeight (): width = 474 и height = 0.

Как должна быть установлена ​​высота? Чего мне не хватает?

Знаете ли вы о рабочем примере программы, которая использует PeerComponent на Android? Я искал в Интернете, но смог найти только некоторые фрагменты, в которых неясно, откуда вызывается код, в каком потоке он выполняется и т. Д.

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Я выяснил проблему.

Я использую порт LWUIT 1.5 thorsten_s для Android.

Проблема в том, что LWUIT вычисляет предпочтительный размер компонентов перед добавлением собственного представления, так что и ширина, ивысота установлена ​​в 0.

Способ исправить это - вызвать View.measure () в PeerWrapper во время создания, чтобы инициализировать его в предпочтительный размер.

Внутри AndroidImplementation.java вв конец конструктора для класса PeerWrapper добавьте строку:

measure (MeasureSpec.makeMeasureSpec (0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec (0, MeasureSpec.UNSPECIFIED));

Это полностью решает проблему.Теперь я могу использовать такие компоненты, как AnalogClock, DatePicker и собственный EditText в формах LWUIT.

0 голосов
/ 02 февраля 2012

Подобные вещи работают для нас в реализации Codename One . Я не совсем уверен, что происходит в порту Торстена, так как мы уже довольно сильно раздвоены. Мы намерены выпустить Codename One с демонстрационной версией собственного доступа, которая продемонстрирует доступ к собственным виджетам.

...