Adobe
Products
Acrobat
Creative Cloud
Creative Suite
Digital Marketing Suite
Digital Publishing Suite
Elements
Photoshop
Touch Apps
Student and Teacher Editions
More products
Solutions
Creative tools for business
Digital marketing
Digital media
Education
Financial services
Government
Web Experience Management
More solutions
Learning Help Downloads Company
Buy
Home use for personal and home office
Education for students, educators, and staff
Business for small and medium businesses
Licensing programs for businesses, schools, and government
Special offers
Search
 
Info Sign in
Welcome,
My cart
My orders My Adobe
My Adobe
My orders
My information
My preferences
My products and services
Sign out
Why sign in? Sign in to manage your account and access trial downloads, product extensions, community areas, and more.
Adobe
Products Sections Buy   Search  
Solutions Company
Help Learning
Sign in Sign out My orders My Adobe
Preorder Estimated Availability Date. Your credit card will not be charged until the product is shipped. Estimated availability date is subject to change. Preorder Estimated Availability Date. Your credit card will not be charged until the product is ready to download. Estimated availability date is subject to change.
Qty:
Purchase requires verification of academic eligibility
Subtotal
Review and Checkout
Adobe Developer Connection / Flex Developer Center /

Building a mobile employee directory sample with Flex and Flash Builder

by Christophe Coenraets

Christophe Coenraets
  • http://coenraets.org/blog/

Content

  • Part 1: Creating a basic mobile application
  • Part 2: Using a Mobile Item Renderer
  • Part 3: Navigating Between Views
  • Part 4: Creating an Action Bar
  • Part 5: Integrating with the Device Capabilities
  • Part 6: Using the Local SQLite Database
  • Part 7: Navigating the Org Chart

Modified

20 June 2011

Page tools

Share on Facebook
Share on Twitter
Share on LinkedIn
Bookmark
Print
Flash Builder Flex mobile

Requirements

Prerequisite knowledge

Basic experience with Flex and Flash Builder

 

Additional requirements

  • Flex 4.5.1 SDK

User level

Beginning

Required products

  • Flash Builder (Download trial)

Sample files

  • Flex-mobile-workshop.zip

Overview

In this tutorial, you use the Flash Builder 4.5.1 and Flex 4.5.1 updates to build a simple, yet fully functional employee directory application for Android devices.

You don’t need a mobile device to complete this tutorial: you can use the simple emulator available in the Flash Builder 4.5.1 update to run and debug the application.

The Employee Directory application allows you to:

  • Search for employees
  • View employee details
  • Navigate up and down the org chart
  • Call, text, and email employees

Part 1: Creating a basic mobile application

In this section, you build a simple mobile application that shows a list of employees.

Step 1: Create the Flex Mobile Project

  1. Select File>New>Flex Mobile Project in the Flash Builder menu.
  2. On the Project Location tab, specify EmployeeDirectory as the project name and click Next (see Figure 1).
Figure 1. Specify EmployeeDirectory as the project name.
Figure 1. Specify EmployeeDirectory as the project name.
  1. On the Mobile Settings tab, keep the default values and click Finish (see Figure 2).
Figure 2. Mobile Settings tab
Figure 2. Mobile Settings tab
  1. Copy the assets directory from the FlexMobile60Minutes folder you just unzipped and paste it under the src directory of the EmployeeDirectory project.

Step 2: Code the application

  1. Open EmployeeDirectory.mxml:
    • Notice the root node: ViewNavigatorApplication
    • Notice the firstView attribute of VieNavigatorApplication referencing EmployeeDirectoryHomeView
  2. Open EmployeeDirectoryHomeView.mxml and implement the View as follows:
<?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="Home" creationComplete="srv.send()"> <fx:Declarations> <s:HTTPService id="srv" url="assets/employees.xml"/> </fx:Declarations> <s:List id="list" top="0" bottom="0" left="0" right="0" dataProvider="{srv.lastResult.list.employee}" labelField="lastName"/> </s:View>

Notes:

  • Make sure you implement this code in EmployeeDirectoryHomeView.mxml, not EmployeeDirectory.mxml.
  • Don’t forget to add the creationComplete event to the view.

Step 3: Run the application

  1. Right-click anywhere in EmployeeDirectory.mxml and select Run AS>Mobile Application
  2. Select On desktop and choose a device to simulate. For example, Apple iPhone 4 (see Figure 3).
Figure 3. Choose a device to simulate.
Figure 3. Choose a device to simulate.
  1. Click Run and test the application. The application should look like this (see Figure 4):
Figure 4. The application should look like this.
Figure 4. The application should look like this.

Part 2: Using a Mobile Item Renderer

In this section, you define a mobile item renderer for the list of employees.

Steps

  1. Open EmployeeDirectoryHomeView.mxml and define an inline itemRenderer for the List. The item renderer displays the first name and the last name of the employee on the first line and the tile of the employee on the second line.
<s:List id="list" top="0" bottom="0" left="0" right="0" dataProvider="{srv.lastResult.list.employee}"> <s:itemRenderer> <fx:Component> <s:IconItemRenderer label="{data.firstName} {data.lastName}" messageField="title"/> </fx:Component> </s:itemRenderer> </s:List>
  1. Run and test the application. The application should look like this (see Figure 5):
Figure 5. The application should look like this.
Figure 5. The application should look like this.

Part 3: Navigating Between Views

In this section, you create an EmployeeDetails view that shows the details of the employee selected in the list. You learn how to navigate and pass information between views.

Step 1: Creating the EmployeeDetails View

  1. Right-click the views folder in the EmployeeDirectory project and select New>MXML Component. Specify EmployeeDetails as the component name and click Finish (see Figure 6).
Figure 6. Specify EmployeeDetails as the component name.
Figure 6. Specify EmployeeDetails as the component name.
  1. Implement EmployeeDetails as follows:
<?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="Employee Details"> <s:HGroup verticalAlign="middle" gap="12"> <s:Image source="assets/pics/{data.picture}"/> <s:VGroup> <s:Label text="{data.firstName} {data.lastName}"/> <s:Label text="{data.title}"/> <s:Label text="{data.department}"/> <s:Label text="{data.city}"/> </s:VGroup> </s:HGroup> </s:View>

Step 2: Opening the Details View

  1. Open EmployeeDirectoryHomeView.mxml and provide the List with a change handler used to open the details view for the selected employee:
<s:List id="list" top="0" bottom="0" left="0" right="0" dataProvider="{srv.lastResult.list.employee}" change="navigator.pushView(EmployeeDetails, list.selectedItem)"> <s:itemRenderer> <fx:Component> <s:IconItemRenderer label="{data.firstName} {data.lastName}" messageField="title"/> </fx:Component> </s:itemRenderer> </s:List>

Step 3: Run the Application

  1. Select an employee in the list: an employee details view should appear for the selected employee (see Figure 7).
Figure 7. An employee details view appears for the selected employee.
Figure 7. An employee details view appears for the selected employee.

Part 4: Creating an Action Bar

In this section, you provide the Employee Directory with an Action Bar:

  • You provide all the views of the application with a Home button that the user can click to go back to the first view of the application.
  • You provide the EmployeeDirectoryHomeView’s Action Bar with search controls to search for employees.

Step 1: Creating a Home Button

  1. Open EmployeeDirectory.mxml and define the following navigation bar content (just before the closing </s:ViewNavigatorApplication> tag):
<s:navigationContent> <s:Button icon="@Embed('assets/home.png')" click="navigator.popToFirstView()"/> </s:navigationContent>
  1. Run and test the application. Notice that because the navigation control is defined at the application level, it is shared by all the views of the application (see Figure 8).
Figure 8. The navigation control is shared by all the views of the application.
Figure 8. The navigation control is shared by all the views of the application.

Step 2: Creating a Search Bar

  1. Open EmployeeDirectoryHomeView.mxml
  2. Add the following titleContent and actionContent (just after the closing </fx:Declarations> tag) to create a search bar:
<s:titleContent> <s:TextInput id="key" width="100%"/> </s:titleContent> <s:actionContent> <s:Button icon="@Embed('assets/search.png')" click="srv.send()"/> </s:actionContent>

With this initial implementation, clicking the search button returns all the employees no matter what you type in the search field. You implement a working search capability in Part 6.

  1. Since we now send the request for data when the user clicks the Search button, remove the creationComplete handler defined on the View.
  2. Run and test the application.

    Note that both the EmployeeDetails and the EmployeeDirectoryHome views inherit the Home button defined in EmployeeDirectory.mxml. Although it is generally a good idea for all the views of the application to have a Home button, it is superfluous (and potentially confusing) for the Home view of the application to have a Home button (see Figure 9).

Figure 9. Both the EmployeeDetails and the EmployeeDirectoryHome views inherit the Home button defined in EmployeeDirectory.mxml.
Figure 9. Both the EmployeeDetails and the EmployeeDirectoryHome views inherit the Home button defined in EmployeeDirectory.mxml.

Step 3: Removing the Home Button in EmployeeDirectoryHome

  1. Open EmployeeDirectoryHomeView.mxml and add an empty navigatonContent tag just before the <s:titleContent> tag:
<s:navigationContent/>
  1. Run and test the application (see Figure 10).
Figure 10. Removing the Home button
Figure 10. Removing the Home button

Note that when you open the details view for an employee, and then go back to the list using the back button of your device (or the home button of the application), the list is empty. This is because the previously active view is automatically destroyed when another view becomes active. When you click the back button, the previous view is actually re-instantiated.

Step 4: Persisting the Search Results

Although a view is destroyed when it becomes inactive, its “data” attribute is persisted and re-assigned when the view is re-instantiated.

To persist the search results leveraging the data attribute:

  1. Add a result event handler to the HTTPService in which you assign the lastResult of the HTTP service invocation to the data attribute of the view.
<s:HTTPService id="srv" url="assets/employees.xml" result="data=srv.lastResult.list.employee"/>
  1. Bind the List to data attribute of the view.
<s:List id="list" top="0" bottom="0" left="0" right="0" dataProvider="{data}" change="navigator.pushView(EmployeeDetails, list.selectedItem)"> <s:itemRenderer> <fx:Component> <s:IconItemRenderer label="{data.firstName} {data.lastName}" messageField="title"/> </fx:Component> </s:itemRenderer> </s:List>
  1. Run and test the application.

Part 5: Integrating with the Device Capabilities

In this section, you allow the user to call, text, or email an employee from within the application.

Step 1: Display a List of Actions

  1. In EmployeeDetails.mxml, add a <fx:Script> block just before the <s:HGoup> opening tag.
<fx:Script> <![CDATA[ ]]> </fx:Script>
  1. Inside the new <fx:Script> block, define a bindable ArrayCollection to hold the list of actions available for the selected employee:
[Bindable] protected var actions:ArrayCollection;

Note: Make sure you import the ArrayCollection class for this code to compile:

import mx.collections.ArrayCollection;
  1. Define the following embedded icons. You’ll use them in the action list itemRenderer.
[Embed("assets/sms.png")] private var smsIcon:Class; [Embed("assets/phone.png")] private var phoneIcon:Class; [Embed("assets/mail.png")] private var mailIcon:Class;
  1. Override the setter for the “data” attribute of the view to populate the action list with the actions available for the employee based on the available data. For example, an “SMS” action should only be presented to the user if the mobile phone number is available.
override public function set data(value:Object):void { super.data = value; actions = new ArrayCollection(); if (data.officePhone) { actions.addItem({type: "tel", name: "Call office", details: data.officePhone, icon:phoneIcon}); } if (data.cellPhone) { actions.addItem({type: "tel", name: "Call mobile", details: data.cellPhone, icon:phoneIcon}); actions.addItem({type: "sms", name: "SMS", details: data.cellPhone, icon:smsIcon}); } if (data.email) { actions.addItem({type: "mailto", name: "Email", details: data.email, icon:mailIcon}); } }
  1. Display the list of actions: Below the closing </s:HGroup> tag, add a List component bound to the actions list.
<s:List id="list" dataProvider="{actions}" top="160" left="0" right="0" bottom="0"> <s:itemRenderer> <fx:Component> <s:IconItemRenderer paddingTop="8" paddingBottom="8" verticalGap="6" labelField="name" messageField="details" decorator="{data.icon}"/> </fx:Component> </s:itemRenderer> </s:List>
  1. Run and test the application.

    When you select an employee in the list, you should see the list of available actions for that employee (see Figure 11). The actions don’t work yet. You make them work in the next step.

Figure 11. The list of available actions for that employee.
Figure 11. The list of available actions for that employee.

Step 2: Triggering the Actions

  1. Add a change handler to the List:
<s:List id="list" dataProvider="{actions}" top="160" left="0" right="0" bottom="0" change="list_changeHandler(event)"> <s:itemRenderer> <fx:Component> <s:IconItemRenderer paddingTop="8" paddingBottom="8" verticalGap="6" labelField="name" messageField="details" decorator="{data.icon}"/> </fx:Component> </s:itemRenderer> </s:List>
  1. Implement list_changeHandler as follows:
protected function list_changeHandler(event:IndexChangeEvent):void { var action:Object = list.selectedItem; switch (action.type) { case "tel": navigateToURL(new URLRequest("tel:"+action.details)); break; case "sms": navigateToURL(new URLRequest("sms:"+action.details)); break; case "mailto": navigateToURL(new URLRequest("mailto:"+action.details)); break; } }

Note: Make sure you import spark.events.IndexChangeEvent (and not mx.events.IndexChangedEvent) for this code to compile:

import spark.events.IndexChangeEvent;
  1. Run and test the application.

Part 6: Using the Local SQLite Database

In this section, you change the data access logic of the application: instead of using an HTTPService, you use the SQLite database available on your device to access the data.

Steps

  1. Copy the dao directory from the FlexMobile60Minutes folder and paste it under the src directory of the EmployeeDirectory project.
  2. Explore the source code of the EmployeeDAO and Employee classes:
    • The EmployeeDAO class provides a basic implementation of the Data Access Object (DAO) pattern: it encapsulates the data access logic to create, update and delete employees. If the employee table doesn’t exist in the database, EmployeeDAO also includes some logic to create it and populate it with sample data.
    • Employee is a basic value object that also provides some lazy loading logic to load the employee’s manager and direct reports as needed.
  3. In EmployeeDirectoryHomeView.mxml, replace the HTTPService with an instance of EmployeeDAO
<dao:EmployeeDAO id="srv"/>

Note: Make sure the model namespace is bound in the View definition at the top of the mxml document:

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="Home" xmlns:dao="dao.*">
  1. Modify the search button click event handler accordingly. 
<s:Button icon="@Embed('assets/search.png')" click="data=srv.findByName(key.text)"/>

Note that in this case, we can directly assign the return value of the findByName function to data because EmployeeDAO uses the synchronous version of the database access API.

  1. Open EmployeeDirectory-app.xml, and scroll down to the end of the document. In the <android><manifestAdditions> section, uncomment the following permission:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  1. Run and test the application

Part 7: Navigating the Org Chart

In this section, you add the “View manager” and “View direct reports” actions to the Employee Details view to allow the user to navigate up and down the org chart.

Step 1: Create the DirectReports View

  1. Right-click the views folder in the EmployeeDirectory project and select New>MXML Component. Specify DirectReports as the component name and click Finish (see Figure 12).
Figure 12. Specify DirectReports as the component name and click Finish.
Figure 12. Specify DirectReports as the component name and click Finish.
  1. Implement DirectReports.mxml as follows:
<?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="Direct Reports"> <s:List id="list" top="0" bottom="0" left="0" right="0" dataProvider="{data.directReports}" change="navigator.pushView(EmployeeDetails, list.selectedItem)"> <s:itemRenderer> <fx:Component> <s:IconItemRenderer label="{data.firstName} {data.lastName}" messageField="title"/> </fx:Component> </s:itemRenderer> </s:List> </s:View>

Step 2: Add the Actions to Navigate the Org Chart

  1. In EmployeeDetails.mxml, add two possible actions to the set data function:
if (data.manager) { actions.addItem({type: "employee", name: "View manager", details: data.manager.firstName + " " + data.manager.lastName, employee: data.manager}); } if (data.directReports && data.directReports.length > 0) { actions.addItem({type: "reports", name: "View direct reports", details: "(" + data.directReports.length + ")", employee: data}); }
  1. In the List change handler, add two case statements to trigger the corresponding actions:
case "employee": navigator.pushView(EmployeeDetails, action.employee); break; case "reports": navigator.pushView(DirectReports, action.employee); break;

Step 3: Run the application.

  1. Select an employee who has a manager (see Figure 13) and click the “View manager” action (see Figure 14).
Figure 13. Select an employee who has a manager.
Figure 13. Select an employee who has a manager.
Figure 14. Click the “View manager” action.
Figure 14. Click the “View manager” action.
  1. Select an employee who has a direct reports (see Figure 14) and click the “View direct reports” action (see Figure 15).
Figure 15. Direct Reports.
Figure 15. Direct Reports.

Where to go from here

Here are some of the resources you’ll find useful during your development of applications for Android:

  • Introducing Adobe Flex 4.5 SDK
  • What's new in Flash Builder 4.5
  • Flex Test Drive for Mobile
  • Mobile development using Adobe Flex 4.5 SDK and Flash Builder 4.5
  • Flex 4.5 SDK sample applications
  • Flex Developer Center
  • Mobile and Devices Developer Center

For more information on packaging an application for final deployment for each platform, see:

  • Using Flash Builder 4.5 to package applications for Google Android devices
  • Using Flash Builder 4.5 to package applications for Apple iOS
  • Using Flash Builder 4.5 to package applications for BlackBerry Tablet OS devices

Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License+Adobe Commercial Rights

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. Permissions beyond the scope of this license, pertaining to the examples of code included within this work are available at Adobe.

More Like This

  • Flex mobile development tips and tricks – Part 1: Data handling
  • Finicky: A custom-skinned mobile Flex application
  • Flex mobile development tips and tricks—Part 4: Creating an alert popup and other skinnable popups
  • Flex mobile performance checklist
  • Introducing Adobe Flex 4.6 SDK
  • Flex mobile development tips and tricks – Part 5: Using mobile view and tab transitions
  • Flex mobile development tips and tricks – Part 2: Styling your application's tabs and ActionBar
  • Caltrain Times from design to release: A story of mobile application development
  • What's new in Flex 4.6 SDK and Flash Builder 4.6
  • Flex mobile development tips and tricks – Part 3: Hiding and positioning your app’s tabs and hiding the ActionBar

Tutorials & Samples

Tutorials

  • Flex mobile performance checklist
  • Flex and Maven with Flexmojos – Part 3: Journeyman
  • Migrating Flex 3 applications to Flex 4.5 – Part 4

Samples

  • Twitter Trends
  • Flex 4.5 reference applications
  • Mobile Trader Flex app on Android Market

Flex User Forum

More
07/25/2011 Flash Player Debug Issues - Safari 5.1 & Chrome 13
04/22/2012 Loader png - wrong color values in BitmapData
04/22/2012 HTTPService and crossdomain.xml doesn't work as expected
04/23/2012 Memory related crashes in Flex application

Flex Cookbook

More
04/06/2012 How to detect screen resize with a SkinnableComponent
02/29/2012 Embed Stage3D content inside Flex application components
02/15/2012 Custom WorkFlow Component
02/09/2012 Using Camera with a MediaContainer instead of VideoDisplay

Products

  • Acrobat
  • Creative Cloud
  • Creative Suite
  • Digital Marketing Suite
  • Digital Publishing Suite
  • Elements
  • Mobile Apps
  • Photoshop
  • Touch Apps
  • Student and Teacher Editions

Solutions

  • Digital marketing
  • Digital media
  • Web Experience Management

Industries

  • Education
  • Financial services
  • Government

Help

  • Product help centers
  • Orders and returns
  • Downloading and installing
  • My Adobe

Learning

  • Adobe Developer Connection
  • Adobe TV
  • Training and certification
  • Forums
  • Design Center

Ways to buy

  • For personal and home office
  • For students, educators, and staff
  • For small and medium businesses
  • For businesses, schools, and government
  • Special offers

Downloads

  • Adobe Reader
  • Adobe Flash Player
  • Adobe AIR
  • Adobe Shockwave Player

Company

  • News room
  • Partner programs
  • Corporate social responsibility
  • Career opportunities
  • Investor Relations
  • Events
  • Legal
  • Security
  • Contact Adobe
Choose your region United States (Change)
Choose your region Close

North America

Europe, Middle East and Africa

Asia Pacific

  • Canada - English
  • Canada - Français
  • Latinoamérica
  • México
  • United States

South America

  • Brasil
  • Africa - English
  • Österreich - Deutsch
  • Belgium - English
  • Belgique - Français
  • België - Nederlands
  • България
  • Hrvatska
  • Česká republika
  • Danmark
  • Eastern Europe - English
  • Eesti
  • Suomi
  • France
  • Deutschland
  • Magyarország
  • Ireland
  • Israel - English
  • ישראל - עברית
  • Italia
  • Latvija
  • Lietuva
  • Luxembourg - Deutsch
  • Luxembourg - English
  • Luxembourg - Français
  • الشرق الأوسط وشمال أفريقيا - اللغة العربية
  • Middle East and North Africa - English
  • Moyen-Orient et Afrique du Nord - Français
  • Nederland
  • Norge
  • Polska
  • Portugal
  • România
  • Россия
  • Srbija
  • Slovensko
  • Slovenija
  • España
  • Sverige
  • Schweiz - Deutsch
  • Suisse - Français
  • Svizzera - Italiano
  • Türkiye
  • Україна
  • United Kingdom
  • Australia
  • 中国
  • 中國香港特別行政區
  • Hong Kong S.A.R. of China
  • India - English
  • 日本
  • 한국
  • New Zealand
  • 台灣

Southeast Asia

  • Includes Indonesia, Malaysia, Philippines, Singapore, Thailand, and Vietnam - English

Copyright © 2012 Adobe Systems Incorporated. All rights reserved.

Terms of Use | Privacy Policy and Cookies (Updated)

Ad Choices

Reviewed by TRUSTe: site privacy statement