Creating view states in a Flex application

by Peter deHaan on October 5, 2007

in AddChild, States

The following example shows how you can create different view states in a Flex application by using the <mx:states /> and <mx:State /> tags.

Full code after the jump.

View MXML

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2007/10/05/creating-view-states-in-a-flex-application/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white">

    <mx:states>
        <mx:State name="login">
            <mx:AddChild>
                <mx:Form id="loginForm">
                    <mx:FormHeading label="Login" />
                    <mx:FormItem label="Username:">
                        <mx:TextInput id="log_username" />
                    </mx:FormItem>
                    <mx:FormItem label="Password:">
                        <mx:TextInput id="log_password"
                                displayAsPassword="true" />
                    </mx:FormItem>
                    <mx:FormItem>
                        <mx:Button label="Login" />
                    </mx:FormItem>
                </mx:Form>
            </mx:AddChild>
        </mx:State>
        <mx:State name="register">
            <mx:AddChild>
                <mx:Form id="registerForm">
                    <mx:FormHeading label="Register" />
                    <mx:FormItem label="Username:">
                        <mx:TextInput id="reg_username" />
                    </mx:FormItem>
                    <mx:FormItem label="Password:">
                        <mx:TextInput id="reg_password1"
                                displayAsPassword="true" />
                    </mx:FormItem>
                    <mx:FormItem label="Confirm password:">
                        <mx:TextInput id="reg_password2"
                                displayAsPassword="true" />
                    </mx:FormItem>
                    <mx:FormItem>
                        <mx:Button label="Register" />
                    </mx:FormItem>
                </mx:Form>
            </mx:AddChild>
        </mx:State>
    </mx:states>

    <mx:transitions>
        <mx:Transition id="loginTransition"
                fromState="*"
                toState="login">
            <mx:WipeDown target="{loginForm}"/>
        </mx:Transition>
        <mx:Transition id="registerTransition"
                fromState="*"
                toState="register">
            <mx:WipeDown target="{registerForm}"/>
        </mx:Transition>
    </mx:transitions>

    <mx:Script>
        <![CDATA[
            import mx.events.ItemClickEvent;

            private function toggleButtonBar_itemClick(evt:ItemClickEvent):void {
                currentState = evt.item.data;
            }
        ]]>
    </mx:Script>

    <mx:Array id="dp">
        <mx:Object data="" label="Default state" />
        <mx:Object data="login" label="Login" />
        <mx:Object data="register" label="Register" />
    </mx:Array>

    <mx:ApplicationControlBar dock="true">
        <mx:ToggleButtonBar id="toggleButtonBar"
                dataProvider="{dp}"
                itemClick="toggleButtonBar_itemClick(event);" />
    </mx:ApplicationControlBar>

</mx:Application>

View source is enabled in the following example.

{ 15 comments… read them below or add one }

1 pierre October 6, 2007 at 12:44 am

Hello,

Your example with differents view states is interesting. Is it possible using this method to do something more difficult with tree states and resizing each other like this example :

http://weblogs.macromedia.com/khoyt/files/f1040.swf

Thanks

Reply

2 Anonymous June 4, 2008 at 6:11 am

Hello,

Is it possible to Change the states with the Combo Selection?

Thanks a lot
PSamanth

Reply

3 Prashanth Samanth June 4, 2008 at 11:07 pm

Is it possible to Change the states with the Combo Selection? so that I can show Different type of chart using same values

Reply

4 peterd June 5, 2008 at 8:14 am

Prashanth Samanth,

I don’t think I understand the question. Are you asking whether it is possible to use a ComboBox instead of a ToggleButtonBar in the previous example?
If so, yes.

Peter

Reply

5 De Angela Duff June 26, 2008 at 2:25 pm

I tried this out with Flex 3, and I am getting the following message:
Type was not found or was not a compile-time constant: states.[Generated code (use -keep to save): Path: states-generated.as, Line:654, Column: 14]

Any suggestions?

Reply

6 tyu July 28, 2008 at 5:42 pm

I have the same error in Flex3:
Type was not found or was not a compile-time constant: states… :(

Reply

7 peterd July 28, 2008 at 6:07 pm

De Angela Duff / tyu,

Which version of the Flex 3 SDK are you using? I tried in the SDK that shipped with Flex Builder 3 (3.0.0.477) and the code above worked.

Peter

Reply

8 Sine July 31, 2008 at 5:34 am

Hello – Is there any reason why the mx:script CDATA block is not at the top of the code? Does it matter – apart from making it easier to find?
P.s. The code runs fine for me in Flex Builder 3.

Reply

9 Sine July 31, 2008 at 5:59 am

Hello again,
I am trying to load a gallery component – with images driven by xml – into one of the states, but Flash Player does not like it… Is it wrong to load something so complex inside a state?

Reply

10 Help February 7, 2009 at 1:58 pm

I’m having the same problem using States with Flex 3

Error: Type was not found or was not a compile-time constant: states. [Generated code (use -keep to save): Path: states-generated.as, Line: 327, Column: 14]

Using Flex SDK 3.2

Reply

11 Max February 19, 2009 at 1:28 pm

I’d like to return to the question Prashanth Samanth had about having a ComboBox to change states within an application. (I didn’t see an entry on this with a search of your site.)

How would this be done? It doesn’t appear to be as easy as with a LinkButton. I’m shaky with eventListeners if they are needed!

Reply

12 Jean Adams February 22, 2009 at 3:29 pm

Hi, very interesting your example, and I like to ask’u if exists some example, about a complete applz? Well, I’m like to learn, how can develop a little application with flex.

Reply

13 Gabriele April 3, 2009 at 8:18 am

Hallo,

i use Flex Builder 3, i’ve problems at make a continuous state change, i’d like to have a state change without being dependent on event, like button click.

How can i make it?

Many Thanks.
Gabriele

Reply

14 memo June 2, 2009 at 9:19 am

hi,

i understand how states and transitions work, but I just cannot apply them to a whole component. it just does not work n the component, which is in a separate MXML file.

&ltmx:transitions&gt
&ltmx:Transition fromState=”*” toState=”*”&gt
&ltmx:Resize duration=”400″/&gt
&lt/mx:Transition&gt
&lt/mx:transitions&gt

&ltmx:states&gt
&ltmx:State name=”sInitial”&gt
&ltmx:RemoveChild target=”{project}”/&gt
&lt/mx:State&gt
&lt/mx:states&gt
&lt:states /&gt

&ltpf:Project id=”project” /&gt

Reply

15 Klaus August 29, 2009 at 6:22 am

Hi,

try to use states in a derivated application class. Flex shows the following error:
“Could not resolve to a component implementation.”

How I can use states in this case?

For your help in advance thanks!

Klaus

Reply

Leave a Comment

Sorry, this blog is terrible at eating HTML comments.
If you're pasting any HTML/XML/MXML code, you need to convert your < characters to &lt; and your > characters to &gt; .

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Anti-Spam Protection by WP-SpamFree

Previous post:

Next post: