在 LWUIT 中使用 Android 原生组件时出现 IllegalArgumentException

发布于 2025-01-01 17:08:22 字数 1064 浏览 1 评论 0原文

我正在尝试在 Android 平台上的 LWUIT 应用程序中使用本机组件。

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。

高度应该如何设定?我缺少什么?

您知道在 Android 上使用 PeerComponent 的工作示例程序吗?我搜索了网络,但只能找到一些片段,其中不清楚代码是从哪里调用的,在哪个线程上执行的等等。

谢谢。

I am trying to use native components in a LWUIT app on Android platform.

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];   
}

I then place a component inside a form:

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

mMainForm.addComponent(createNativeTextEdit());

mMainForm.show();

Then I get an "IllegalArgumentException: width and height must be > 0" when the system tries to draw the new form.

I traced the problem down to the call to AndroidImplementation.PeerWrapper.getBuffer() and the values returned by getWidth() and getHeight() are width=474 and height=0.

How is height supposed to be set? What am I missing?

Do you know of a working sample program that uses PeerComponent on Android? I searched the web but could only find some snippets where it is not clear where the code is called from, which thread it is executed on etc.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

缪败 2025-01-08 17:08:22

我想通了这个问题。

我正在使用适用于 Android 的 LWUIT 1.5 thorsten_s 端口。

问题是 LWUIT 在添加本机视图之前计算组件的首选大小,因此宽度和高度都设置为 0。

解决该问题的方法是在创建时调用 PeerWrapper 上的 View.measure() 将其初始化为首选大小。

在 AndroidImplementation.java 内 PeerWrapper 类的构造函数末尾添加以下行:

测量(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

这完全解决了这个问题。我现在可以在 LWUIT 表单中使用 AnalogClock、DatePicker 和本机 EditText 等组件。

I figured out the issue.

I am using LWUIT 1.5 thorsten_s port for Android.

The issue is that LWUIT computes components preferred size before the native view is added so both width and height are set to 0.

The way to fix it is to call View.measure() on the PeerWrapper at creation time to initialize it to preferred size.

Inside AndroidImplementation.java at the end of the constructor for PeerWrapper class add the line:

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

This completely fixes the problem. I can now use components like AnalogClock, DatePicker, and native EditText in LWUIT forms.

蔚蓝源自深海 2025-01-08 17:08:22

这种事情在 Codename One 实现中对我们有用。我不太确定托尔斯滕的港口发生了什么,因为我们现在已经基本分叉了。我们打算发布带有本机访问演示的 Codename One,该演示将演示对本机小部件的访问。

This sort of thing works for us in the Codename One implementation. I'm not exactly sure what is happening in Thorsten's port since we are pretty much forked by now. We intend to release Codename One with a native access demo that will demonstrate access to native widgets.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文