CodenameOne浮动操作按钮绑定错误

问题描述

我的codenameone应用的主/详细布局具有特殊的大小限制。 还显示一个“加号”按钮,以允许创建新项目。

主要形式:

FloatingActionButton fab=FloatingActionButton.createFAB(Fontimage.MATERIAL_ADD);
...

if(isTablet() && !isPortrait())
    {
        mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(leftContainerRatio*100)),masterContainer)
                .add( mainEditingContainer);
        fab.bindFabToContainer(masterContainer); //error here
    } else {
        mainForm.add(masterContainer);
        fab.bindFabToContainer(masterContainer);
    }

运行它,我得到:

 java.lang.IllegalArgumentException: Component is already contained in Container: Container[x=0 y=20 width=2048 height=1514 name=null,layout = TableLayout,scrollableX = false,scrollableY = false,components = [masterContainer,Container]]
at com.codename1.ui.Container.insertComponentAtImpl(Container.java:927)
at com.codename1.ui.Container.insertComponentAt(Container.java:918)
at com.codename1.ui.Container.addComponent(Container.java:840)
at com.codename1.ui.Container.encloseIn(Container.java:250)
at com.codename1.ui.layouts.layeredLayout.encloseIn(layeredLayout.java:1099)
at com.codename1.components.FloatingActionButton.bindFabToContainer(FloatingActionButton.java:314)
at com.codename1.components.FloatingActionButton.bindFabToContainer(FloatingActionButton.java:286)
at com.myapp.app.MyApp.start(MyApp.java:186)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.codename1.impl.javase.Executor$3$1.run(Executor.java:258)
at com.codename1.ui.display.processSerialCalls(display.java:1331)
at com.codename1.ui.display.mainEDTLoop(display.java:1125)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.codenameoneThread.run(codenameoneThread.java:176)

但没有添加或绑定FAB的任何地方,其他在代码段中显示的地方。

如果删除了bind方法,则不会显示任何按钮。

(该应用程序正在模拟器中运行)

出什么问题了?

解决方法

查看此内容以了解发生了什么:How can I reposition the Floating Button in Codenameone?

要点是,当您在非格式容器上使用FloatingActionButton时,需要添加其结果。由于您给的容器已经包装好了。

因此您的代码应为:

if(isTablet() && !isPortrait()) {
   mainForm.add(tl.cc().hp(100).wp((int)(leftContainerRatio*100)),fab.bindFabToContainer(MasterContainer))
           .add( mainEditingContainer);
} else {
    mainForm.add(fab.bindFabToContainer(MasterContainer));
}