I thought this was the default behaviour (all the Adobe docs seem to indicate that this is the case).
Say you have a form:
Name: [______]
Password: [________]
generally you want Name and Password to line up on their right-hand side (right justification). The length should be the length of the longest label.
When I add the following code to my MXML (authoring in Flex 4) it does not do that at all! But rather tjust crams everything left-justified, similar to the Name/Password example above.
What's the solution?
<s:Form id="directoryForm_A" width="100%">
<s:layout>
<s:VerticalLayout horizontalAlign="justify"/>
</s:layout>
<s:FormItem label="Click">
<s:Button label="Button"/>
</s:FormItem>
<s:FormItem label="Root Directory">
<s:TextInput x="0" width="100%" enter="handleUserSetRootDirectory(event)"/>
</s:FormItem>
</s:Form>
Which Adobe docs were you reading? You realize that the Spark Form are going to be very different than the Halo / MX Form. I would also suspect that the Spark form is not working yet.
Here are the docs on the Spark Form.
I think you'll benefit from reading the layout rules section of the FormItemLayout details. I cannot find the documentation that claims that all labels will be right aligned.
For anyone looking to a beta solution, Peter deHaan posts about this exact topic here: http://blog.flexexamples.com/2010/08/28/setting-the-text-alignment-on-a-spark-formitem-label-in-flex-hero/
Do note, since his example doesn't translate directly over to my issue:
adding to the for some reason disables the ability for the renderer to calculate the maxLabelWidth
Hope this helps others in the future.
Related
i'm doing the maintenance of a flex application and i have a form to create new items:
<mx:FormItem id="frmName"
width="100%"
label="{Translate.getInstance().translateWords.name}"
required.edit="true"
required.new="true"
required.view="false">
<s:Label id="name_l"
width="100%" height="23"
text="{ myProgramVO.program_name }"
maxDisplayedLines="0"
lineBreak="toFit"
includeIn="view"/>
<s:TextInput id="name_ti"
width="100%" height="23"
maxChars="100"
maxChars.edit="100"
maxChars.new="100"
text="{ myProgramVO.program_name }"
includeIn="edit,new"/>
</mx:FormItem>
I don't know why, but i cannot write characters with accents when i'm creating a new program, but i can when i'm editing a program. And does not seem an unicode problem because i can type ñ without any problem.
The mxml file has <?xml version="1.0" encoding="utf-8"?> and the file is the same for item edition.
Can somebody guide me in the right direction?
PS: If anybody needs more code just ask for it and i'll paste in pastebin or something
After some research, it seems that there's nothing wrong with my code, it seem a problem with focus when mix html and swf.
When i try to create a new program, i need to mix html and flex, but when i edit the program there's no html code, and works well.
I got the problem only in linux (flash version 11.2), in windows (version 11.8) works perfectly, so seems a problem has been fixed
Thanks anyway guys :)
Is there a group box in Flex?
Is there any other control with same property?
I tried this link, but it has no answers. Also google
did not help me in this case.
there is a spark form element which you can use directly and you can include headings there.
As copied from the source http://help.adobe.com/en_US/flex/using/WSc5cd04c102ae3e973827a8e912ac2b325a4-8000.html
<s:Form id="myForm" width="450" height="125">
<s:FormHeading label="Spark Form Heading" />
<s:FormItem label="Username:">
<s:TextInput id="username" />
<s:helpContent>
<s:Label text="Enter your LDAP username" />
</s:helpContent>
</s:FormItem>
</s:Form>
If you just want to group elements you need to look at custom components (if they provide a source you can just modify those) like
https://www.assembla.com/code/shinylib/subversion/nodes
http://jayachandrababu.blogspot.de/2010/01/groupbox-fieldset-legend-component.html
I hope that helps
Andreas
Skinning a panel may also help. You can use panel's title as header like #Jason Sturges' provided link. Customizing panel's layout will also provide you with the group box you wanted.
I'm facing an issue with the flex Application I'm currently working on.
When I open a pop-up using the 'createPopUp' method, I've got this index out of bounds error message :
RangeError: The supplied index is out of bounds. at
mx.core::FTETextField/getLineMetrics()[E:\dev\4.y\frameworks\projects\spark\src\mx\core\FTETextField.as:2169]
at mx.core::UIFTETextField/get
baselinePosition()[E:\dev\4.y\frameworks\projects\spark\src\mx\core\UIFTETextField.as:784]
at mx.controls::DateChooser/get
baselinePosition()[E:\dev\4.y\frameworks\projects\mx\src\mx\controls\DateChooser.as:994]
at spark.components::Group/get
baselinePosition()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\Group.as:282]
at
spark.layouts::ConstraintLayout/parseElementConstraints()[E:\dev\4.y\frameworks\projects\spark\src\spark\layouts\ConstraintLayout.as:1818]
at
spark.layouts::ConstraintLayout/parseConstraints()[E:\dev\4.y\frameworks\projects\spark\src\spark\layouts\ConstraintLayout.as:1632]
at
spark.layouts::ConstraintLayout/measure()[E:\dev\4.y\frameworks\projects\spark\src\spark\layouts\ConstraintLayout.as:414]
at
spark.components.supportClasses::GroupBase/measure()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\supportClasses\GroupBase.as:1148]
at
mx.core::UIComponent/http://www.adobe.com/2006/flex/mx/internal::measureSizes()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:8506]
at
mx.core::UIComponent/validateSize()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:8430]
at
spark.components::Group/validateSize()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\Group.as:1012]
at
mx.managers::LayoutManager/validateClient()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:987]
at
mx.managers::PopUpManagerImpl/addPopUp()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:382]
at
mx.managers::PopUpManagerImpl/createPopUp()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:232]
at
mx.managers::PopUpManager$/createPopUp()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\PopUpManager.as:139] at
views::AddProjects/loadAddProjectPopUp()[C:\Users\Laura\Web\spidermak\spidermak\src\views\AddProjects.mxml:184]
at
views::AddProjects/___AddProjects_Button1_click()[C:\Users\Laura\Web\spidermak\spidermak\src\views\AddProjects.mxml:838]
It seems that this error is caused by a "dateChooser" component in my popup :
<mx:DateChooser id="endDate"/>
When I comment this line, the error is no longer thrown and the popup loads correctly.
It's really weird because I didn't have this issue until this morning. All I did in the meantime was changing some layout-related stuff, but I don't see what is would have to do with this problem.
I don't get it...
Does anyone have a clue about how to fix this ? I need my DateChooser !
Thanks !
Laura
EDIT -
It seems that the problem is not caused by the DateChooser itself, but by the FormItem around it. Here's what my code looks like :
<Form width="100%">
[...]
<s:HGroup width="100%">
<s:FormItem label="Date de début">
<mx:DateChooser id="startDate"
firstDayOfWeek="1"/>
</s:FormItem>
<s:FormItem label="Date de fin">
<mx:DateChooser id="endDate"
firstDayOfWeek="1"/>
</s:FormItem>
</s:HGroup>
</Form>
If I remove the two FormItems, it works. Could anyone explain me why? Thanks !
Try wrapping the component in a <s:Group> element, i.e.
<s:FormItem label="Start date">
<s:Group>
<mx:DateChooser id="startDate"
firstDayOfWeek="1" />
</s:Group>
</s:FormItem>
Apparently, it's something to do with the composition of Spark components. lolFlex.
(I had exactly the same problem, and couldn't find any solution on the interwebs either!)
I think you should upgrade to the latest TLF. This reminds me of a bug in TLF 1.x. Try 2.x.
I'm writing an Adobe AIR application using a ViewStack for the different application states. Is there a way to make sure that each view component is created/destroyed each time it is shown/hidden?
For instance, if I have a TextInput in a view, I want it to reset to its initial state each time I change to that view, rather than having previously entered text. Or, if I have a Timer, I want it to be destroyed when I leave the view so that it doesn't keep running when I'm in an unrelated part of the application. I know that I can manually initialize/destroy everything on the show() and hide() events, but is there an easier way?
AFAIK there is no built-in way to do this, so you'll have to do it manually by handling the show and hide events as you mention.
ViewStack does however have two methods "saveState" and "loadState" which could perhaps help you out with this. The history manager uses these methods to enable back/forward navigation. The docs don't seem to have any examples though.
ViewStacks can be the work of the devil when it comes to creation/deletion policies and managing state. We had all sorts of problems when we developed fiat ecoDrive and by about 3/4 of the way though we we're all very anti ViewStacks for the management of view state within our application.
However... a good bet would be to first set the creationPolicy to ContainerCreationPolicy.NONE. That way it's in your control as to when to create any of the panels in your ViewStack. Then i would think you would need to have some sort of logic so that as the ViewStack changes a panel it deletes or resets the one you were on.
Another viable alternative would be to use view states instead. Have a base state which acts as the main container and then a simple state for each of your sections. That way when you switch to a new state, the old state gets removed in reverse order to the way it was created. You do have to be disciplined with states though as they can end up getting really complex and messy when they start becoming nested. If you keep it simple it may work as you require.
In MXML 2009, you can use itemDestructionPolicy="auto" to destroy a component after use it. If you use this property in the first view component with two states (init, logged), you can destroy and reinitialize all child view components. Example :
<s:states>
<s:State name="init" />
<s:State name="logged" />
</s:states>
<s:SkinnableContainer id="skincon" width="100%" height="100%" backgroundAlpha="0"
backgroundColor="#FFFFFF">
<s:VGroup id="MainContainer" width="100%" height="100%" paddingTop="0"
paddingLeft="20" paddingRight="20" gap="0">
<views:_HeaderView id="header" />
<mx:ViewStack id="viewStack" width="100%" height="100%">
<s:NavigatorContent includeIn="init" itemDestructionPolicy="auto">
<s:layout>
<s:VerticalLayout horizontalAlign="center" verticalAlign="middle" />
</s:layout>
<views:LoginView title="Login" id="loginView" />
</s:NavigatorContent>
<s:NavigatorContent includeIn="logged" itemDestructionPolicy="auto">
<s:layout>
<s:VerticalLayout horizontalAlign="center" verticalAlign="top" />
</s:layout>
<views:_CentralView id="userView" />
</s:NavigatorContent>
</mx:ViewStack>
<views:_FooterView id="footer" />
</s:VGroup>
</s:SkinnableContainer>
Both answers are correct -- there doesn't seem to be any built-in way to do it. I solved the problem by creating a "wrapper" component for my view component. It creates a new view component each time the view is shown. This isn't ideal, but fits my requirements nicely, and required few changes to my application structure.
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" show="init()" hide="cleanup()">
<mx:Script>
<![CDATA[
private var myComponent:MyComponent;
private function init():void
{
myComponent = new MyComponent();
componentContainer.addChild(myComponent);
}
private function cleanup():void
{
componentContainer.removeAllChildren();
}
]]>
</mx:Script>
<mx:Canvas width="100%" height="100%" id="componentContainer" />
</mx:Canvas>
Build your "views" as separate Modules, and then use the ViewStack to switch between them. You could then write a function to destroy the unused module(s) (check each module against the selectedChild property) when the ViewStack's "change" event is fired.
2¢
I am using different states for my different views. On each state change i add and remove components.
This causes the add and remove events of UIComponent fire which allows me to initialize and cleanup my components each time they are added.
This is the idea...
<mx:states>
<mx:State name="state1">
<mx:AddChild>
<mx:SomeUIComponent id="myComp" add="myComp.initialize()" remove="myComp.cleanup()"/>
</mx:AddChild>
</mx:State>
</mx:states>
Our resident Flex expert is out for the day and I thought this would be a good chance to test this site out. I have a dropdown with a dataProvider that is working fine:
<ep:ComboBox id="dead_reason" selectedValue="{_data.dead_reason}"
dataProvider="{_data.staticData.dead_reason}"
labelField="#label" width="300"/>
The ComboBox is custom but I'm not sure if that matters for the question. I need to change the combo box to radios (all in one group) but maintain the dynamic options. In other words, what is the best way to generate dynamic RadioButtons?
Try using an <mx:Repeater> Something like:
<mx:Repeater dataProvider="{_data.staticData.dead_reason}">
<mx:RadioButton groupName="reasons" ...>
</mx:Repeater>
<mx:RadioButtonGroup id="RDO_Group"/>
<mx:Repeater id="myRepeater" dataProvider="{_data.staticData.dead_reason}">
<mx:RadioButton id="rdo" label="{myRepeater.currentItem}" value="{myRepeater.currentItem}" groupName="RDO_Group"/>
</mx:Repeater>
is the best way.