Fab is a bit problematic in that sense. You don't add it to a container.
You bind it.
It also acts differently depending on your target container, see this
recent discussion:
https://stackoverflow.com/questions/63845751/codenameone-floating-action-button-binding-error/63856717
On Wednesday, September 23, 2020 at 10:44:04 AM UTC+3 P5music wrote:
> I just can use this workaround, because otherwise it does not work. So I
> have to call revalidate() in two differents steps.
> Said that, now the problem is the floating action button. As in the second
> example there is an error issued.
> What's wrong?
> Regards
>
> Il giorno mercoledì 23 settembre 2020 alle 04:17:41 UTC+2 Shai Almog ha
> scritto:
>
>> A single revalidate on the main form should work fine. Doing additional
>> revalidates might cause them to disrupt one another.
>> Notice that you might want to use the version of revalidate that plays
>> nicely with animations.
>>
>> On Monday, September 21, 2020 at 11:51:20 AM UTC+3 P5music wrote:
>>
>>> It's very strange. I had to add a revalidate() also after removing the
>>> containers.
>>> I do not know if it is intended behaviour but this code works (see also
>>> below this code, there is the second part of this message about fab
>>> breaking it):
>>>
>>> private void setContainers()
>>> {
>>>
>>> mainEditingContainer.remove();
>>> itemListContainer.remove();
>>> //fab.remove();
>>>
>>>
>>> mainEditingContainer.revalidate();
>>> itemListContainer.revalidate();
>>> mainForm.revalidate();
>>>
>>> if (isPortrait() && (other conditions*)*)
>>> {
>>> new EditingForm(appData,myData,mainForm,editingContainer,other
>>> Parameters).show();
>>>
>>> }
>>>
>>> if (isPortrait() && !(*other conditions*))
>>> {
>>>
>>> //mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(itemListContainer));
>>>
>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),
>>> itemListContainer);
>>> }
>>>
>>> if(isTablet() && !isPortrait() ) {
>>>
>>> /*mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)
>>>
>>> (leftContainerRatio * 100)), fab.bindFabToContainer(itemListContainer))
>>> .add(mainEditingContainer);*/
>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)
>>>
>>> (leftContainerRatio * 100)), itemListContainer)
>>> .add(mainEditingContainer);
>>>
>>> }
>>>
>>> }
>>>
>>> mainEditingContainer.revalidate();
>>> itemListContainer.revalidate();
>>> mainForm.revalidate();
>>> }
>>> ------
>>>
>>> But now the fab problem is back. Indeed if I use this code
>>>
>>>
>>> private void setContainers()
>>> {
>>>
>>> mainEditingContainer.remove();
>>> itemListContainer.remove();
>>>
>>> if (!fabFirstTime) fab.remove();
>>>
>>>
>>> mainEditingContainer.revalidate();
>>> itemListContainer.revalidate();
>>> mainForm.revalidate();
>>>
>>> if (isPortrait() && (*conditions*)
>>> {
>>> new EditingForm(appData,myData,mainForm,editingContainer,other
>>> parameters).show();
>>>
>>> }
>>>
>>> if (isPortrait() && !(*conditions*)
>>> {
>>>
>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(
>>> itemListContainer));
>>> }
>>>
>>> if(isTablet() && !isPortrait() ) {
>>>
>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)
>>>
>>> (leftContainerRatio * 100)), fab.bindFabToContainer(itemListContainer
>>> )).add(mainEditingContainer);
>>>
>>> }
>>>
>>> mainEditingContainer.revalidate();
>>> itemListContainer.revalidate();
>>> mainForm.revalidate();
>>>
>>> if (fabFirstTime) fabFirstTime=false;
>>>
>>> }
>>>
>>> the user interface is not reconstructed again and no button is visible.
>>> If I do not remove the fab I get the error
>>> Component is already contained in Container: Container[x=0 y=0
>>> width=1136 height=1920 name=null, layout = FlowLayout, scrollableX = false,
>>> scrollableY = false, components = [FloatingActionButton]]
>>> but I can see the button (in an wrong position because it is the old x
>>> position I think, indeed orientation change has occurred).
>>> Thanks in advance
>>>
>>> Il giorno lunedì 21 settembre 2020 alle 04:35:07 UTC+2 Shai Almog ha
>>> scritto:
>>>
>>>> I assumed incorrectly that you're adding a component that's already
>>>> added. I think what's happening is that you removed the components before
>>>> the re-layout then added them after. You would need to do either an
>>>> animateLayout() or a revalidate() in this case.
>>>>
>>>> On Sunday, September 20, 2020 at 3:16:12 PM UTC+3 P5music wrote:
>>>>
>>>>> Yeah, I just provided the error because you asked about, I just would
>>>>> like to know why the user interface is not reconstructed after
>>>>> orientation
>>>>> change. The provided mehod above is called both at startup and when an
>>>>> orientation change occurs, but in the latter case it fails in recreating
>>>>> the user interface.
>>>>> Regards
>>>>>
>>>>> Il giorno domenica 20 settembre 2020 alle 07:18:05 UTC+2 Shai Almog ha
>>>>> scritto:
>>>>>
>>>>>> OK I see this printout. Do you have CEF enabled?
>>>>>> Is there a browser component somewhere?
>>>>>> This error should be meaningless and shouldn't impact the behavior of
>>>>>> the app, it's related to the simulator.
>>>>>>
>>>>>> On Saturday, September 19, 2020 at 12:30:49 PM UTC+3 P5music wrote:
>>>>>>
>>>>>>> No back trace is available, just the text you have read in the
>>>>>>> previous post.
>>>>>>> The fab is only added to mainForm and bound to masterContainer (you
>>>>>>> can see in the code snippet above) but
>>>>>>> even if I do not have the fab at all in the application the error is
>>>>>>> issued:
>>>>>>> Exception in thread "AWT-EventQueue-0" Exception in thread
>>>>>>> "AWT-EventQueue-0" Exception in thread "AWT-EventQueue-0" Exception in
>>>>>>> thread "AWT-EventQueue-0" Failed to get location on screen:component
>>>>>>> must
>>>>>>> be showing on the screen to determine its location
>>>>>>>
>>>>>>> No line is highlighted in the source code because no Java exception
>>>>>>> is issued.
>>>>>>>
>>>>>>> Il giorno sabato 19 settembre 2020 alle 07:41:29 UTC+2 Shai Almog ha
>>>>>>> scritto:
>>>>>>>
>>>>>>>> Do you see the full stack trace?
>>>>>>>> It should point at a specific line. What's added at that line?
>>>>>>>> That component should be removed.
>>>>>>>>
>>>>>>>> The FAB could be problematic since FAB is added in a unique way. Is
>>>>>>>> it added to the form or an arbitrary container?
>>>>>>>>
>>>>>>>> On Friday, September 18, 2020 at 10:43:10 AM UTC+3 P5music wrote:
>>>>>>>>
>>>>>>>>> I only get
>>>>>>>>> Exception in thread "AWT-EventQueue-0" Failed to get location on
>>>>>>>>> screen:component must be showing on the screen to determine its
>>>>>>>>> location
>>>>>>>>> Failed to get location on screen:component must be showing on the
>>>>>>>>> screen to determine its location
>>>>>>>>> Indeed in my code the removal is performed:
>>>>>>>>> editingContainer.remove();
>>>>>>>>> itemListContainer.remove();
>>>>>>>>> fab.remove();
>>>>>>>>>
>>>>>>>>> So what could be the reason?
>>>>>>>>>
>>>>>>>>> Il giorno venerdì 18 settembre 2020 alle 06:15:30 UTC+2 Shai Almog
>>>>>>>>> ha scritto:
>>>>>>>>>
>>>>>>>>>> Look at the console when debugging this in the simulator. You
>>>>>>>>>> would probably see exceptions indicating you can't add a component
>>>>>>>>>> to a
>>>>>>>>>> Container if it's already added to some container (even if it's the
>>>>>>>>>> same
>>>>>>>>>> container). Yes, you need to adapt the code to handle that logic.
>>>>>>>>>> Orientation change re-layout needs to be slightly different from
>>>>>>>>>> first
>>>>>>>>>> showing of the UI. I'd also recommend an animation on orientation
>>>>>>>>>> change
>>>>>>>>>> which is something we don't need/want for the first showing of the
>>>>>>>>>> form.
>>>>>>>>>>
>>>>>>>>>> On Thursday, September 17, 2020 at 12:07:41 PM UTC+3 P5music
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> I created a method like the one you can see below. It is called
>>>>>>>>>>> at startup and it works. It is also called in the orientation
>>>>>>>>>>> change
>>>>>>>>>>> listener.
>>>>>>>>>>>
>>>>>>>>>>> But when the orientation changes I see that the user interface
>>>>>>>>>>> is cleaned up and no containers appear, that is, the new rotated
>>>>>>>>>>> interface
>>>>>>>>>>> does not appear, does not form, it is blank.
>>>>>>>>>>> If there is no call to the remove() methods I get errors like
>>>>>>>>>>> "already added", and it is reasonable because the containers don't
>>>>>>>>>>> get
>>>>>>>>>>> removed.
>>>>>>>>>>> So the right version has to include the remove() calls.
>>>>>>>>>>>
>>>>>>>>>>> Hence, I think the code is adding the right containers as it
>>>>>>>>>>> happens at startup but the user interface is not shown. Why?
>>>>>>>>>>>
>>>>>>>>>>> private void setContainersAndForm()
>>>>>>>>>>> {
>>>>>>>>>>> editingContainer.remove();
>>>>>>>>>>> itemListContainer.remove();
>>>>>>>>>>> fab.remove();
>>>>>>>>>>>
>>>>>>>>>>> if (isPortrait() && (editingConditions))
>>>>>>>>>>> {
>>>>>>>>>>> new
>>>>>>>>>>> EditingForm(appData,myData,mainForm,editingContainer,otherParameters).show();
>>>>>>>>>>> setEditor();
>>>>>>>>>>>
>>>>>>>>>>> if (isPortrait() && !(editingConditions)
>>>>>>>>>>> {
>>>>>>>>>>> removeContainers();
>>>>>>>>>>>
>>>>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(masterContainer));
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> if(isTablet() && !isPortrait() )
>>>>>>>>>>> {
>>>>>>>>>>>
>>>>>>>>>>> removeContainers();
>>>>>>>>>>>
>>>>>>>>>>> ((EditingContainer)editingContainer).setCallingForm(mainForm);
>>>>>>>>>>>
>>>>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(leftContainerRatio*100)),fab.bindFabToContainer(masterContainer))
>>>>>>>>>>> .add( editingContainer);
>>>>>>>>>>> if (editingConditions) setEditor();
>>>>>>>>>>>
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> // also with these two lines
>>>>>>>>>>> //mainEditingContainer.revalidate();
>>>>>>>>>>> //itemListContainer.revalidate();
>>>>>>>>>>>
>>>>>>>>>>> mainForm.revalidate();
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> Il giorno giovedì 17 settembre 2020 alle 06:15:49 UTC+2 Shai
>>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>>
>>>>>>>>>>>> Look sat the code for kitchen sink. Notice we encapsulate each
>>>>>>>>>>>> demo in a Demo class. Then in the main KitchenSink class we show
>>>>>>>>>>>> either a
>>>>>>>>>>>> Form or a Container based on the mode (tablet or phone). Yes it's
>>>>>>>>>>>> pretty
>>>>>>>>>>>> similar to this.
>>>>>>>>>>>>
>>>>>>>>>>>> On Wednesday, September 16, 2020 at 9:54:57 AM UTC+3 P5music
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> What you say seems to be merging the two things, like I am
>>>>>>>>>>>>> already doing? Indeed my app is for tablet and phone, so my
>>>>>>>>>>>>> question was
>>>>>>>>>>>>> just about the management of these two scenarios, and the
>>>>>>>>>>>>> orientation too.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Is this what you are advicing?
>>>>>>>>>>>>>
>>>>>>>>>>>>> if (isPortrait() && (editingConditions))
>>>>>>>>>>>>> {
>>>>>>>>>>>>> new
>>>>>>>>>>>>> EditingForm(appData,myData,mainForm,editingContainer,otherParameters).show();
>>>>>>>>>>>>> setEditor();
>>>>>>>>>>>>>
>>>>>>>>>>>>> if (isPortrait() && !(editingConditions)
>>>>>>>>>>>>> {
>>>>>>>>>>>>> removeContainers();
>>>>>>>>>>>>>
>>>>>>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(masterContainer));
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> if(isTablet() && !isPortrait() )
>>>>>>>>>>>>> {
>>>>>>>>>>>>>
>>>>>>>>>>>>> removeContainers();
>>>>>>>>>>>>>
>>>>>>>>>>>>> ((EditingContainer)editingContainer).setCallingForm(mainForm);
>>>>>>>>>>>>>
>>>>>>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(leftContainerRatio*100)),fab.bindFabToContainer(masterContainer))
>>>>>>>>>>>>> .add( editingContainer);
>>>>>>>>>>>>> if (editingConditions) setEditor();
>>>>>>>>>>>>>
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks in advance
>>>>>>>>>>>>> Il giorno mercoledì 16 settembre 2020 alle 04:40:29 UTC+2 Shai
>>>>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> My advice is to use Containers for everything but have global
>>>>>>>>>>>>>> navigation logic. So when you need to show a UI element you can
>>>>>>>>>>>>>> invoke that
>>>>>>>>>>>>>> single place that decides.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> If this is on a phone you would create a Form add the
>>>>>>>>>>>>>> container to it and set its title etc. then show.
>>>>>>>>>>>>>> If this is a tablet you would replace the last container.and
>>>>>>>>>>>>>> update the subtitle in the UI
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Tuesday, September 15, 2020 at 10:39:40 AM UTC+3 P5music
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> So your advice is to use one form for the master/detai in
>>>>>>>>>>>>>>> every configuration, just managing the container, with the
>>>>>>>>>>>>>>> override of the
>>>>>>>>>>>>>>> back button and using the back command to manage the container
>>>>>>>>>>>>>>> inside the
>>>>>>>>>>>>>>> form.
>>>>>>>>>>>>>>> So I have not to do this:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> if (isPortrait() && (*conditionsAreTrue*))
>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>> new EditingForm(appData,myData,mainForm,editingContainer,other
>>>>>>>>>>>>>>> parameters).show();
>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>> (this is what I am trying to do now)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> the form will be just used when a new screen has to be
>>>>>>>>>>>>>>> presented, like the help form.
>>>>>>>>>>>>>>> Is it right?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Il giorno martedì 15 settembre 2020 alle 03:50:41 UTC+2 Shai
>>>>>>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> You can use setBackCommand and override the hardware back
>>>>>>>>>>>>>>>> command to have any functionality you want. It can just
>>>>>>>>>>>>>>>> replace containers
>>>>>>>>>>>>>>>> and then eventually move a form. You obviously need to keep
>>>>>>>>>>>>>>>> track of
>>>>>>>>>>>>>>>> everything which isn't simple.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Tuesday, September 15, 2020 at 12:48:15 AM UTC+3 P5music
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> My app needs to manage cases where a back navigation
>>>>>>>>>>>>>>>>> occurs but not toward the original master/detail form, indeed
>>>>>>>>>>>>>>>>> to a
>>>>>>>>>>>>>>>>> different orientation of the editing view itself.
>>>>>>>>>>>>>>>>> For example the editing view in portrait mode is
>>>>>>>>>>>>>>>>> fullscreen and can undergo a device rotation: in that case
>>>>>>>>>>>>>>>>> the landscape
>>>>>>>>>>>>>>>>> mode is the new full screen mode for the editing view, while
>>>>>>>>>>>>>>>>> master/detail
>>>>>>>>>>>>>>>>> is reached back only when further back navigation occurs when
>>>>>>>>>>>>>>>>> the user tap
>>>>>>>>>>>>>>>>> the back button.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> So I thought this has to be accompished with a new form:
>>>>>>>>>>>>>>>>> the editing form, to which the editing container is added,
>>>>>>>>>>>>>>>>> because I think
>>>>>>>>>>>>>>>>> it is the right way to manage back navigation, that is.
>>>>>>>>>>>>>>>>> navigation is
>>>>>>>>>>>>>>>>> between forms, back and forth.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I ask whether the editing container has to be recreated,
>>>>>>>>>>>>>>>>> or it can removed from the master/detail form and then added
>>>>>>>>>>>>>>>>> to the editing
>>>>>>>>>>>>>>>>> form.
>>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Il giorno domenica 13 settembre 2020 alle 03:43:59 UTC+2
>>>>>>>>>>>>>>>>> Shai Almog ha scritto:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I mean having containers side by side in one form (see
>>>>>>>>>>>>>>>>>> the kitchen sink where we do just that).
>>>>>>>>>>>>>>>>>> I don''t recommend having a form embedded in a form.
>>>>>>>>>>>>>>>>>> Forms are very "heavy" and things sometimes fail when you
>>>>>>>>>>>>>>>>>> add a form inside
>>>>>>>>>>>>>>>>>> another form. Historically this was prohibited (we'd throw
>>>>>>>>>>>>>>>>>> an exception in
>>>>>>>>>>>>>>>>>> that case) but some use cases for embedding a form do exist.
>>>>>>>>>>>>>>>>>> I'd still
>>>>>>>>>>>>>>>>>> avoid it when possible.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Saturday, September 12, 2020 at 12:31:31 PM UTC+3
>>>>>>>>>>>>>>>>>> P5music wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Thanks, do you mean having two forms side by side, that
>>>>>>>>>>>>>>>>>>> expands when in portrait mode going full screen singularly,
>>>>>>>>>>>>>>>>>>> or you mean
>>>>>>>>>>>>>>>>>>> that I open another form on top of the main form?
>>>>>>>>>>>>>>>>>>> I started creating an editing container that can be
>>>>>>>>>>>>>>>>>>> added to the main form or to the editing form, so I remove
>>>>>>>>>>>>>>>>>>> all and then add
>>>>>>>>>>>>>>>>>>> again. Is this the right way to do that?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Il giorno sabato 12 settembre 2020 alle 07:04:13 UTC+2
>>>>>>>>>>>>>>>>>>> Shai Almog ha scritto:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> In some cases you need two forms and in some cases two
>>>>>>>>>>>>>>>>>>>> containers.
>>>>>>>>>>>>>>>>>>>> The trick for doing this is to work with two containers
>>>>>>>>>>>>>>>>>>>> and when necessary wrap them in a Form to enable the two
>>>>>>>>>>>>>>>>>>>> page master detail.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On Friday, September 11, 2020 at 3:41:56 PM UTC+3
>>>>>>>>>>>>>>>>>>>> P5music wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> My Codename app has master/detail layout.
>>>>>>>>>>>>>>>>>>>>> According to orientation the detail (editing) or the
>>>>>>>>>>>>>>>>>>>>> master can stay full screen.
>>>>>>>>>>>>>>>>>>>>> I have to handle many orientation and editing status
>>>>>>>>>>>>>>>>>>>>> configurations, so sometimes the editing screen will be
>>>>>>>>>>>>>>>>>>>>> displayed out of
>>>>>>>>>>>>>>>>>>>>> the master screen in portrait orientation.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> The back navigation (button and other gestures) has to
>>>>>>>>>>>>>>>>>>>>> be managed in both cases.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> I am not sure if I have to use a main form and two
>>>>>>>>>>>>>>>>>>>>> containers, or instead two forms, that is, also an
>>>>>>>>>>>>>>>>>>>>> EditingForm with the
>>>>>>>>>>>>>>>>>>>>> EditingContainer inside.
>>>>>>>>>>>>>>>>>>>>> Thanks in advance
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
--
You received this message because you are subscribed to the Google Groups
"CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/codenameone-discussions/02f81c5b-2c3d-4f66-8459-eb87aea643cen%40googlegroups.com.