问题描述
我的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的任何地方,其他在代码段中显示的地方。
(该应用程序正在模拟器中运行)
出什么问题了?
解决方法
查看此内容以了解发生了什么: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));
}