Jawnnypoo / PhysicsLayout

Android layout that simulates physics using JBox2D
Apache License 2.0
772 stars 102 forks source link

I can't dynamically add a child layout via addView, it crashes! #37

Closed kongzue closed 7 months ago

kongzue commented 7 months ago

It crashes when I dynamically add a child layout via the addview method. Here is the code to add the section:

for (int i = 0; i < dataList.size(); i++) {
    JsonMap item = dataList.getJsonMap(i);
    ImageView imageView = new ImageView(this);
    Glide.with(me)
            .load(item.getString("image_url"))
            .into(imageView);
    physicsLayout.addView(imageView);
}

Here is the crash message:

java.lang.AssertionError
    at org.jbox2d.collision.shapes.PolygonShape.computeMass(PolygonShape.java:545)
    at org.jbox2d.dynamics.Fixture.getMassData(Fixture.java:253)
    at org.jbox2d.dynamics.Body.resetMassData(Body.java:687)
    at org.jbox2d.dynamics.Body.createFixture(Body.java:203)
    at com.jawnnypoo.physicslayout.Physics.createBody(Physics.kt:470)
    at com.jawnnypoo.physicslayout.Physics.createWorld(Physics.kt:347)
    at com.jawnnypoo.physicslayout.Physics.onLayout(Physics.kt:240)
    at com.jawnnypoo.physicslayout.PhysicsLinearLayout.onLayout(PhysicsLinearLayout.kt:58)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1103)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:789)
    at android.view.View.layout(View.java:24421)
    at android.view.ViewGroup.layout(ViewGroup.java:6440)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4258)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3583)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2465)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9305)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1339)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1348)
    at android.view.Choreographer.doCallbacks(Choreographer.java:952)
    at android.view.Choreographer.doFrame(Choreographer.java:882)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1322)
    at android.os.Handler.handleCallback(Handler.java:958)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:205)
    at android.os.Looper.loop(Looper.java:294)

But when I preset the sub-layout in the layout xml file there is no problem, I would like to get help with that!

Jawnnypoo commented 7 months ago

Try giving your ImageView a set width and height and see if that fixes it.

kongzue commented 7 months ago

Thanks. It worked. Modified code:

for (int i = 0; i < dataList.size(); i++) {
    JsonMap item = dataList.getJsonMap(i);
    ImageView imageView = new ImageView(this);
    imageView.setLayoutParams(new LinearLayout.LayoutParams(dip2px(65),dip2px(65)));
    Glide.with(me)
            .load(item.getString("image_url"))
            .into(imageView);
    physicsLayout.addView(imageView);
}