Android Native Component Exception
Hello,
I am running into a problem trying to use native control in an Android application.
I developed a very simple test class that wraps a native TextView
<div>public class PtNumericField extends Container {</div><div> </div><div> private TextView mNativeView;</div><div> </div><div> /**</div><div> * </div><div> */</div><div> public PtNumericField() {</div><div> setLayout(new BorderLayout());</div><div> </div><div> AndroidImplementation.runOnAndroidUIThreadAndWait(LWUITActivity.currentActivity, new Runnable() {</div><div> public void run()</div><div> {</div><div> init();</div><div> }</div><div> });</div><div> </div><div> PeerComponent p = PeerComponent.create(mNativeView);</div><div> </div><div> this.addComponent(BorderLayout.CENTER, p);</div><div> }</div><div> </div><div> private void init() {</div><div> Activity activity = LWUITActivity.currentActivity;</div><div> mNativeView = new TextView(activity);</div><div> </div><div> mNativeView.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);</div><div> mNativeView.setMinimumHeight(10);</div><div> mNativeView.setMinimumWidth(20);</div><div> }</div><div>}</div>
However, when I try to use an instance of PtNumericField inside a Form I get the following exception
<div>01-31 00:07:26.704: E/AndroidRuntime(11778): java.lang.IllegalArgumentException: width and height must be > 0</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.graphics.Bitmap.nativeCreate(Native Method)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.graphics.Bitmap.createBitmap(Bitmap.java:695)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at com.sun.lwuit.impl.android.AndroidImplementation$PeerWrapper.getBuffer(AndroidImplementation.java:1767)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at com.sun.lwuit.impl.android.AndroidImplementation$PeerWrapper.drawChild(AndroidImplementation.java:1742)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.drawChild(ViewGroup.java:1730)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.drawChild(ViewGroup.java:1730)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.View.draw(View.java:6988)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.widget.FrameLayout.draw(FrameLayout.java:357)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.drawChild(ViewGroup.java:1732)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.View.draw(View.java:6988)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.widget.FrameLayout.draw(FrameLayout.java:357)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewRoot.draw(ViewRoot.java:1632)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewRoot.performTraversals(ViewRoot.java:1335)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.os.Handler.dispatchMessage(Handler.java:99)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.os.Looper.loop(Looper.java:150)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at android.app.ActivityThread.main(ActivityThread.java:4379)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at java.lang.reflect.Method.invokeNative(Native Method)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at java.lang.reflect.Method.invoke(Method.java:507)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:846)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)</div><div>01-31 00:07:26.704: E/AndroidRuntime(11778): <span class="Apple-tab-span"> </span>at dalvik.system.NativeStart.main(Native Method)</div>
What am I doing wrong? This error happens even when I include setMinimumHeight and setMinimumWidth calls.
Do you know of a code sample 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.
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:





I created a simpler example that still does not work.
Then I add the peer component to a Form
I've added a Log.d() call inside AndroidImplementation.PeerWrapper.getBuffer() call to print the values returned by getWidth() and getHeight() and it returns width=474 and height=0
How is height supposed to be set? What am I missing?
Thanks