Professional Documents
Culture Documents
Dica
Use o sumrio do arquivo PDF para navegar
entre os tpicos desta obra
Prefcio
O Desenvolvimento Mobile ganha novos adeptos a cada dia, e com o surgimento de
dezenas de dispositivos mveis no mercado, caracterizados principalmente pelos tablets e
celulares, o mobile ganha fora como uma tima rea para investimento. A Adobe, ciente
deste crescimento, vem atravs dos ltimos trs anos formando a base para o que
podemos chamar de desenvolvimento mobile atravs do uso do Flex, e de sua IDE Flash
Builder.
Nesta primeira parte da obra, mostramos o bsico do Adobe Flash Builder 4.5, exibindo
todos os conceitos necessrios para criar uma aplicao simples para o seu disposi vo
mobile. Na segunda parte da obra, que ainda ser lanada, iremos discutir todos os
conceitos avanados incluindo suporte aos dispositivos Android e iOs, alm de criar uma
aplicao completa para restaurantes. Aguardem!
Suporte
Acesse www.danielschmitz.com.br para conferir as ltimas novidades do livro, captulos
extra, cdigo fonte, etc. Voc tambm pode enviar um email para o autor, caso tenha
dvidas sobre esta obra.
Autor:
Site:
Email para suporte:
Twi er:
SUMRIO
1
Introduo ....................................................................................................................... 1
1.1
1.2
1.3
1.4
1.5
1.6
Perspec ve......................................................................................................... 7
2.1.2
Workspace ......................................................................................................... 7
2.1.3
Editor.................................................................................................................. 7
2.1.4
Project ................................................................................................................ 8
2.2
2.3
2.4
2.5
2.6
2.7
Views .................................................................................................................... 17
2.8
2.9
3.2
3.3
3.4
3.5
Ac on Bar ............................................................................................................. 29
3.6
Escondendo a Ac on Bar...................................................................................... 31
3.7
3.8
3.9
3.10
3.11
Ac onBar .............................................................................................................. 41
4.2
BusyIndicator........................................................................................................ 41
4.3
TabbedViewNavigatorApplica on........................................................................ 42
4.4
ViewNavigatorApplica on .................................................................................... 44
4.5
View ...................................................................................................................... 44
4.6
ViewMenu ............................................................................................................ 45
4.7
Bu on................................................................................................................... 45
4.8
CheckBox .............................................................................................................. 46
4.9
Group.................................................................................................................... 47
4.10
Image .................................................................................................................... 47
4.11
Label ..................................................................................................................... 49
4.12
List ........................................................................................................................ 49
4.13
RadioBu on ......................................................................................................... 49
4.14
4.15
TextInput .............................................................................................................. 50
5.2
5.3
6.2
Incluindo cones.................................................................................................... 62
6.3
Introduo
Em 2011 o framework Adobe Flex 4.5 trouxe para o desenvolvimento RIA a possibilidade de
criar
Mobile
os
celulares e tablets.
Ao mesmo tempo, vimos uma bruta ascenso de tais dispositivos, cada vez mais baratos e
populares. Mesmo que aqui no Brasil o processo de popularizao dos disposi vos mobile
seja mais lento e caro, chegar um momento em que a venda destes produtos ir superar a
venda dos NetBooks, gerando assim uma demanda muito grande de so ware para esta
arquitetura.
Falando em arquitetura, os dispositivos mobile so mais fracos em processamento e
memria, e por isso necessitam de um tratamento diferenciado em relao s aplicaes
desktop. Ou seja, temos que criar aplicaes mobile com o pensamento na performance, e
no podemos criar uma aplicao que seja usada tanto no desktop quanto no mobile.
Felizmente o framework Flex mobile trouxe um bom conjunto de idias e componentes que
exploram a necessidade de obter a melhor performance possvel, na qual veremos ao longo
desta obra.
ar aplicaes,
que envolvem menus, formulrios, datagrids etc, que manipulam dados e exibem
informaes para o usurio.
Com novas verses do framework, lanadas ao longo dos anos, chegamos na atual verso
em maio de 2011 (Flex 4.5), e possivelmente em junho/julho de 2011 teremos a verso
4.5.1. Nestas atuais verses, o framework Flex usado para criar aplicaes para a web,
para o desktop e para o mobile. Nosso foco nesta obra a criao de sistemas para o
mobile.
Neste exemplo, criamos um Label que possui coordenadas x e y dentro de uma aplicao,
uma largura (width
Assim como no HTML, podem-se
adicionar componentes dentro de componentes e assim criar uma estrutura mais
complexa, por exemplo:
<s:Group x="12" y="11" width="207" height="201">
<s:TextInput x="9" y="11" width="186" id="Operador1"/>
<s:ComboBox x="9" y="39" openOnInput="true" width="186"/>
<s:TextInput x="9" y="70" width="186" id="Operador2"/>
<s:TextInput x="9" y="167" width="186" id="Resultado"/>
<s:Label x="9" y="140" text="Resultado:" width="186"/>
<s:Button x="9" y="97" label="Executar" width="186" />
</s:Group>
O MXML existe porque muito mais fcil criar uma interface em uma linguagem declarativa
(como o XML) do que impera va (como o Ac on Script). Isso quer dizer que tudo que
fazemos em MXML (ou quase tudo) pode ser feito com Ac on Script, mas desenhar
interfaces algo extremamente frustrante. Para termos uma idia, o cdigo anterior de 8
linha vai para no mnimo 100 linhas em Action Script. Ok, estamos falando muito de Ac on
Script, ele merece um novo tpico.
Isso significa que voc dever criar aplicaes para serem executadas no AIR e no mais no
navegador Web ou nativamente no sistema operacional. Ou seja, quando voc programa
para Adobe Air, voc no se preocupa a sua aplicao vai funcionar para Windows, Mac ou
Linux.
Este conceito idntico ao desenvolvimento mobile. Voc ir criar o seu programa para
que possa funcionar em uma mquina virtual (AIR) que estar instalada no celular ou tablet
do cliente. Desta forma, voc no necessita saber qual o tipo ou a verso do celular na qual
est criando o sistema. Basta apenas saber se o disposi vo possui o Adobe Air instalado.
Ou seja, j podemos perceber que uma aplicao mobile na verdade uma aplicao Adobe
Air, s que com alguns detalhes a mais, no qual veremos ao longo desta obra. Para certificar
que o seu disposi vo mobile est compatvel com o Adobe Air e com o Flex Mobile, acesse
este endereo1.
h p://www.adobe.com/products/ ash-builder.html
ed_devices/
produtos que sero instalados, bem como o local. Voc pode deixar tudo como padro e
instalados, feche todos os navegadores web abertos. Aguarde a concluso da instalao.
O Flash Builder 4.5 no gratuito, ele pago, mas existem verses de avaliao por 60 dias,
e verses para estudantes e desempregados3. Voc pode usar o Flash Builder 4.5 para
aprender Flex, e decidir pela compra da IDE somente quando estiver confortvel quanto ao
seu uso. O framework Flex SDK 4.5 open source, isto , pode-se compilar uma aplicao
inteira em Flex, somente usando a linha de comando do Windows (an go DOS) ou o
console do Mac/Linux, escrevendo o cdigo diretamente em um editor de textos comum.
Mas este no o foco desta obra, iremos usar constantemente o Flash Builder 4.5 para
apresentar os benefcios do Framework Flex juntamente com a sua IDE.
h ps://freeriatools.adobe.com/
Aps a instalao do Flash Builder 4.5, execute-o, e aps o seu carregamento, voc ver
uma tela conforme a Figura 2.1
para o aprendizado Flex, em ingls.
O termo workbench usado para ilustrar todos os recursos de visualizao do Flash Builder
4.5 relativos a suas configuraes e janelas. Como o Flash Builder 4.5 foi construdo
u lizando a plataforma Eclipse, existem muitos conceitos que devem ser entendidos para
que possamos extrair o mximo de produtividade da ferramenta.
2.1.1
Perspective
Todas as janelas internas do Flash Builder 4.5 podem ser alteradas de tamanho, bem como
alteradas de posio. Podem estar ocultas ou no. Como existem muitas janelas,
normalmente organizadas em abas, o Eclipse criou um conceito chamado Perspec ve, que
a perspectiva das janelas de acordo com o contexto da aplicao.
A perspectiva exibida no canto superior direito da aplicao, a inicialmente vem com o
alterar a perspec va
Open Perspec ve > Fl
das janelas muda completamente, incluindo novas abas e sumindo com outras. Para voltar
usar os botes no canto superior direito do Flash Builder 4.5.
Voc pode criar novas perspectivas e alter-las facilmente na barra de ferramentas de
perspec vas.
Voc pode clicar com o boto direito do mouse na barra de perspectiva e retirar o item
do somente o cone para ilustrar as perspectivas recentemente abertas.
2.1.2
Workspace
2.1.3
Editor
Um editor responsvel em editar arquivos do seu projeto, mas com a par cularidade de
possuir recursos extras para cada po de arquivo. Por exemplo, o editor de arquivos MXML
possui o modo Source e o modo Design. J o editor de arquivos CSS apresenta outras
par cularidades dis ntas. O mesmo vale para arquivos PHP, Java, Ac on Script.
2.1.4
Project
Aps escolher a plataforma Google Android, existem trs abas para a configurao do
projeto mobile para a plataforma. A primeira aba, chamada de Application Type,
define como a aplicao ser desenhada inicialmente. Existem trs formas distintas, que
veremos com mais detalhes no decorrer da obra. Por enquanto, vamos deixar o item
View-Based Application selecionado. No campo Initial view Title, vamos
deixar o padro, HomeView.
A segunda aba configura as permisses que a aplicao ter com o dispositivo mobile. No
caso do Google Android, existem algumas permisses que podem ser selecionadas,
tais como READ_PHONE_STATE, CAMERA, RECORD_AUDIO. Estas configuraes
sero abordadas com mais detalhes na segunda parte desta obra. A terceira aba, chamada
de Plataform Settings, realiza algumas configuraes extras, mas isso depende de
cada disposi vo. No Google Android, no h mais nada para ser configurado.
Aps estas trs abas, existem mais algumas configuraes na caixa Application
Settings. Dentre elas temos:
mobile gire.
Full Screen: Determina se a aplicao ser executada no modo Full Screen tela
cheia, onde a barra de status e de navegao no sero exibidas.
Automatically scale ..... : Determina se a aplicao ter um tratamento especial
para a diferena entre os diversos tamanhos de dispositivo mobile, possibilitando
assim que seja criado componentes com diferentes resolues para cada tipo de
disposi vo.
Destas trs opes, deixe somente a primeira marcada, relacionada a reorientao
automtica. No preciso seguir para os prximos passos do assistente. Clique no boto
Finish para que possamos ver a criao da aplicao no Package Explorer.
Com o projeto criado, podemos ver no Package Explorer os arquivos iniciais da aplicao,
conforme a Figura 2.5.
Figura 2.8 - Adicionando uma nova configurao para executar o projeto mobile
Aps adicionar estas duas configuraes de execuo, voc pode execut-las conforme o
menu Run, exibido na Figura 2.9.
2.7 Views
Se voc reparar na Figura 2.5, ver no projeto um package com o nome views, alm de
um arquivo MXML com o nome HelloWorldHomeView.mxml. Na arquitetura Flex
Mobile, a Adobe introduziu o conceito de Views, que pode ser considerada como uma tela
que representa algum tipo de informao no dispositivo mobile.
viso , no faz sentido...
Cada view deve representar somente um tipo de informao, e uma aplicao mobile
formada por diversas views. Na Figura 2.10 temos o exemplo de duas views diferentes. A
primeira delas exibe uma lista de pessoas, e a segunda exibida quando escolhemos o item
Lauren.
Resumindo, para criar uma aplicao mobile utilizando o framework Flex, voc precisa criar
views e prover a comunicao entre elas. Este conceito um pouco diferente do
as telas do sistema.
Spark Group
Spark HGroup / VGroup
Spark TileGroup
Spark Image / BitmapImage
Spark Label
Spark List
Spark RadioBu on
Spark RadioBu onGroup
Spark SkinnableContainer
Spark Scroller
Spark TextArea
Spark TextInput
Para todos os outros componentes, o seu uso problemtico. Para grficos MX, o seu uso
pode gerar problemas de performance, o que pode ser resolvido em verses futuras.
performance. Voc ver mais sobre item renderers no Captulo 5.2. Alm disso, existem
dois item renderers que so otimizados para o mobile. So eles:
LabelItemRenderer
IconItemRenderer
Sempre que possvel, use estes item renderers.
Skins
O conceito de Skin, vindo do Flex 4, tambm est presente no Flex Mobile. Por exemplo, o
Spark Button no framework Mobile o mesmo Spark Button do desktop (funcionalidades),
mas a sua Skin diferente porque quando criamos um projeto Mobile, estamos aplicando o
Se voc for criar um novo tema com novos Skins, a
recomendao da Adobe criar a Skin nativamente com Action Script, e usar somente
grficos FXG (vetorial), ao invs de bitmap.
Uso do TLF
O TLF Text Layout Framework - uma renderizao especial para o texto, possibilitando
suporte a idiomas (chins, por exemplo), textos na ver cal, entre outros. A Adobe
recomenda que u lize os componentes Spark Label, Spark TextInput e Spark TextArea para
evitar o uso do TLF e conseqentemente ter problemas de performance.
Neste captulo veremos como criar uma aplicao mobile usando o conceito aprendido no
captulo 2.7, que a View. Uma view um componente do framework Flex, assim como um
Panel ou um TitleWindow, e representa a tela do disposi vo mobile, composta basicamente
de uma rea destinada ao cabealho da aplicao, uma rea destinada ao contedo e outra
destinada ao rodap.
As reas: cabealho, contedo e rodap possuem seus respectivos nomes em ingls, e no
traduziremos estes nomes para no dificultar o aprendizado. Basicamente, uma view tem
uma ActionBar (Cabealho), um Content Area (Contedo) e um TabBar (Rodap).
Na Figura 3.1, temos um exemplo de view com as trs reas distintas. Para que possamos
entender melhor o conceito de view, vamos retornar ao projeto HelloWorld e abrir os
dois
arquivos
MXML
que
HelloWorldHomeView.mxml.
foram
criados:
HelloWorld.mxml
/HelloWorld/src/HelloWorld.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
firstView="views.HelloWorldHomeView">
</s:ViewNavigatorApplication>
/HelloWorld/src/views/HelloWorldHomeView.mxml
<?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="HomeView">
</s:View>
Apesar dos dois arquivos mxml no conterem nenhum contedo, j podemos observar
algumas particularidades na estrutura da aplicao. A primeira delas que o arquivo
principal
do
projeto,
o
HelloWorld.mxml,
possui
o
componente
ViewNavigatorApplication. Ou seja, ele no um Spark Application (Web)
ou um WindowedApplication (Air - Desktop).
Alm disso, o ViewNavigatorApplication possui a propriedade firstView, que
indica a primeira view a ser carregada. A primeira view, que o arquivo
HelloWorldHomeView.mxml, tambm no contm muita informao, apenas a
propriedade title que determina o ttulo da ActionBar (Cabealho) daquela view.
Aps criar a nova View, voc ter dois arquivos MXML no package views. Vamos aproveitar
a Figura 2.1.
paddingLeft="10"
paddingRight="10"/>
</s:layout>
<s:Button label="Ir para outra view"
width="100%">
<s:click>
<![CDATA[
this.navigator.pushView(views.HelloWorldAgain);
]]>
</s:click>
</s:Button>
</s:View>
Quando o usurio clica no boto Ir para outra view, feita uma transio da view
arual para a view HelloWorldAgain. O efeito de transio e a troca de contedo feita
automa camente pelo framework.
O que temos agora na aplicao que a view HelloWorldAgain
view HelloWorldHomeView, veja:
HelloWorld.mxml
HelloWorldAgain.mxml
pushView()
HelloWorldHomeView.mxml
Vamos novamente usar o pushView para adicionar mais uma view, s que agora na view
HelloWorldAgain, veja:
/HelloWorld/src/views/HelloWorldAgain.mxml
<?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="HelloWorldAgain">
<s:layout>
<s:VerticalLayout
paddingTop="10" paddingLeft="10"
paddingRight="10"/>
</s:layout>
<fx:Script>
<![CDATA[
protected function
OnbtnClick(event:MouseEvent):void
{
this.navigator.pushView(views.HelloWorldDolly);
}
]]>
</fx:Script>
<s:Button label="Hello Dolly !!" width="100%" height="200"
click="OnbtnClick(event)"
>
</s:Button>
</s:View>
HelloWorld.mxml
HelloWorldDolly.mxml
pushView()
HelloWorldAgain.mxml
HelloWorldHomeView.mxml
Temos trs views, uma sobre a outra, sendo que a view que est sendo exibida para o
usurio a HelloWorldDolly
voltar para a view anterior, e no carregar uma nova view. Ou seja, iremos retirar a view
que est sendo visualizada para recarregar a view anterior. Para isso, usamos o mtodo
popView(), veja:
/HelloWorld/src/views/HelloWorldDolly.mxml
<?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="HelloWorldDolly">
<s:layout>
<s:VerticalLayout
paddingTop="10"
paddingLeft="10"
paddingRight="10"/>
</s:layout>
<s:Label text="Hello Dolly!!"/>
<s:Button label="Voltar">
<s:click>
<![CDATA[
this.navigator.popView();
]]>
</s:click>
</s:Button>
</s:View>
A adobe recomenda que voc utilize botes na navigation area e action area e
use a propriedade title para configurar o ttulo da title area, mas isso no signi ca
que voc possa atribuir outros controles a estas reas.
Por exemplo, voc pode usar a propriedade tleContent para determinar o contedo da
rea onde o ttulo ficava, podendo, por exemplo, realizar a seguinte configurao:
<?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="Details">
<s:actionContent>
<s:Button label="Search">
<s:click>
<![CDATA[
navigator.pushView(views.HelloWorldAgain);
]]>
</s:click>
</s:Button>
</s:actionContent>
<s:titleContent>
<s:TextInput width="100%" prompt="Busca"/>
</s:titleContent>
</s:View>
Caso haja a necessidade de definir uma rea padro para todas as views, podemos realizar
a mesma configurao, s que no mxml principal da aplicao, onde encontramos o
componente ViewNavigatorApplication, veja:
/HelloWorld/src/HelloWorld.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
firstView="views.ViewWithActionBar">
<s:navigationContent>
<s:Button id="btnBack" label="Back">
<s:click>
<![CDATA[
this.navigator.popView();
]]>
</s:click>
</s:Button>
</s:navigationContent>
</s:ViewNavigatorApplication>
Neste exemplo, criamos o boto Back para executar a ao de popView. Este boto est
de nido no navigation content, e estar presente em todas as views da aplicao
que no definirem um navigation content. Ou seja, o boto somente aparecer nas
views que no implementarem a sua navigation area.
Cuidado para no confundir <s:NavigatorContent> com <s:navigationContent>
No somente o navigation content
content e o action content tambm.
title
</s:View>
<s:ViewMenuItem label="Novo"/>
<s:ViewMenuItem label="Copiar"/>
<s:ViewMenuItem label="Colar"/>
</s:viewMenuItems>
</s:View>
Para testar o menu, execute a aplicao e, como estamos simulando o dispositivo, acesse o
Figura 3.4.
<s:actionContent>
<s:Button label="Search">
<s:click>
<![CDATA[
navigator.pushView(views.HelloWorldAgain);
]]>
</s:click>
</s:Button>
</s:actionContent>
<s:titleContent>
<s:TextInput id="txtBusca" width="100%" prompt="Busca"/>
</s:titleContent>
<s:navigationContent>
</s:navigationContent>
<s:viewMenuItems>
<s:ViewMenuItem label="Realizar Busca"
icon="@Embed('assets/icons/ic_menu_search.png')">
<s:click>
<![CDATA[
navigator.pushView(views.HelloWorldAgain);
]]>
</s:click>
</s:ViewMenuItem>
<s:ViewMenuItem label="Limpar tudo"
icon="@Embed('assets/icons/ic_menu_delete.png')">
<s:click>
<![CDATA[
this.txtBusca.text = "";
]]>
</s:click>
</s:ViewMenuItem>
<s:ViewMenuItem label="Novo"/>
<s:ViewMenuItem label="Copiar"/>
<s:ViewMenuItem label="Colar"/>
</s:viewMenuItems>
</s:View>
Caso seja necessrio abrir o menu sem usar o boto menu nativo do dispositivo mobile,
voc pode usar o seguinte comando:
mx.core.FlexGlobals.topLevelApplication.viewMenuOpen=true
Clique no boto Finish e poderemos perceber uma estrutura diferente do nosso primeiro
projeto, o HelloWorld. No arquivo HelloWorld2.mxml, temos agora a utilizao do
componente TabbedViewNavigatorApplication, e temos tambm a criao de
trs ViewNavigators dis ntos, representando as abas (tabs) que criamos no assistente.
Para cada aba, temos uma view diferente, na qual poderemos adicionar mais views.
Atravs das tabs, temos a seguinte situao:
HelloWorld2.mxml
View 1.1
View 3.2
View 1.1
View 3.1
View 1
View 2
View 3
Tab1
Home
Tab2
Con g
Tab3
Favorites
Quando alteramos entre as sees (tabs), o framework Flex preserva o estado na seo
anterior e carrega a view que da aba selecionada. Ou seja, a alterao entre uma aba e
outra ocorre de forma independente.
Qualquer view pode ser adicionada a qualquer seo, sem restries. E claro, em tempo de
execuo, somente uma view de carregada por vez.
O framework Flex possui duas formas de persistncia de dados. A primeira delas chamada
-se a guardar a propriedade data de uma view enquanto a
aplicao estiver funcionando, e o usurio estiver navegando entre views.
e des na-se a armazenar
diversos estados da aplicao, como, por exemplo, a view aberta, juntamente com a
propriedade data, alm da aba carregada em uma aplicao Tabbed. Para habilitar este
recurso, deve-se habilitar a propriedade persistNavigatorState de uma
TabbedViewNavigatorApplication e/ou ViewNavigatorApplication.
Se a propriedade persistNavigatorState es ver false,nenhuma persistncia ser
realizada, e voc poder utilizar o meio tradicional para isso, que utilizando a classe
PersistenceManager.
No captulo 3.3, vemos que um dos parmetros do mtodo pushView justamente o
data, que ser inserido na propriedade data da prxima view a ser carregada. Esta a
melhor forma de se repassar um objeto para outra view, e ser amplamente utilizada em
nossos exemplos.
A seguir veremos uma lista de todos os componentes que podem ser u lizados no
desenvolvimento Mobile. Veja que todos os componentes MX no so recomendados para
o uso em dispositivos mobile, com exceo dos charts (grficos).
Dica: Nos componentes a seguir, mostramos no lado direito, logo abaixo do ttulo, o
caminho completo de cada componente. Se voc quer saber mais sobre o componente em
questo, experimente copiar/colar este caminho no Google.
4.1 ActionBar
spark.components.ActionBar
4.2 BusyIndicator
spark.components.BusyIndicator
Este componente usado para indicar alguma operao mais demorada no dispositivo
mobile. Ele subs tui
onteiro do mouse para as aplicaes web/desktop,
e para exibiseguir. Pode-se tambm utilizar a propriedade symbolColor para alterar a cor do
indicador e a propriedade rotationalInterval para alterar a velocidade do indicador.
<?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="HelloWorldBusyIndicator">
<s:layout>
<s:VerticalLayout
gap="10"
paddingLeft="10" paddingTop="10"
paddingRight="10" paddingBottom="10"
/>
</s:layout>
<s:actionContent>
<s:BusyIndicator id="bi" visible="false"
symbolColor="yellow"/>
</s:actionContent>
<s:Button label="Show Busy Indicator" width="100%">
<s:click>
<![CDATA[
this.bi.visible = true;
]]>
</s:click>
</s:Button>
<s:Button label="Hide Busy Indicator" width="100%">
<s:click>
<![CDATA[
this.bi.visible = false;
]]>
</s:click>
</s:Button>
</s:View>
4.3 TabbedViewNavigatorApplication
spark.components.TabbedViewNavigatorApplica on
4.5, a aplicao principal criada justamente este componente. Um TabbedView cria uma
aplicao mobile dividida em sees, ou abas, que ficam localizadas na parte inferior do
disposi vo, conforme o exemplo a seguir:
<?xml version="1.0" encoding="utf-8"?>
<s:TabbedViewNavigatorApplication
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
>
<s:ViewNavigator label="Home" width="100%" height="100%"
firstView="views.HomeView"
icon="@Embed('icons/ic_menu_phone.png')"/>
<s:ViewNavigator label="Config" width="100%" height="100%"
firstView="views.ConfigView"
icon="@Embed('icons/ic_menu_wizard.png')"/>
<s:ViewNavigator label="Favorites" width="100%" height="100%"
firstView="views.FavoritesView"
icon="@Embed('icons/ic_menu_flash.png')"/>
</s:TabbedViewNavigatorApplication>
4.4 ViewNavigatorApplication
spark.components.ViewNavigatorApplica on
O ViewNavigatorApplication tambm usado para criar uma aplicao mobile, mas sem
sees (abas). Somente uma seo criada, na qual podem ser adicionadas diversas views.
4.5 View
spark.components.view
4.6 ViewMenu
spark.components.ViewMenu
criar um menu na
aplicao, que chamado atravs do boto menu do dispositivo mobile. Mais informaes
no captulo 3.8.
4.7 Button
spark.components.Bu on
Representa um boto que pode ser clicado. Veja que tanto na web/desktop como no
mobile, o componente o mesmo, mas a sua renderizao diferente. Graas ao conceito
de Skins, implementado a par r do Flex 4, o desenho do boto no Mobile diferente do
web/desktop, devido ao tema mobile.swc.
Como propriedades principais, citamos o label, que determina o texto que aparecer no
componente e tambm o evento click, disparado quando o usurio clica no boto.
Existem algumas formas de relacionar uma ao ao evento click, veja:
<s:Button id="btn1" label="Button"
click="{mx.controls.Alert.show('Hello Wolrd')}"/>
OU
<fx:Script>
<![CDATA[
import mx.controls.Alert;
protected function OnButtonClick (event:MouseEvent):void
{
}
]]>
</fx:Script>
<s:Button id="btn2" label="Button" click="OnButtonClick (event)"/>
Ou
<s:Button id="btn3" label="Button">
<s:click>
<![CDATA[
mx.controls.Alert.show('Hello World');
]]>
</s:click>
</s:Button>
Em , temos a forma mais simples e usada para pequenas operaes, como chamar um
outro mtodo ou ento exibir uma mensagem de alerta. Veja que usamos a propriedade
que quisermos chamar algum cdigo, executar algo ou referenciar alguma varivel dentro
de uma propriedade, devemos usar as chaves para delimitar o cdigo MXML do cdigo
Ac onScript.
A segunda forma ( ) referencia diretamente o evento click a um mtodo, nesta caso
chamado de OnBu onClick. O mtodo ( ) deve ser de nido entre a tag fx:Script, e
geralmente possui parmetros relacionados ao evento. Esta segunda forma muito
empregada quando estamos trabalhando em um projeto maior, no qual separamos
totalmente o cdigo ActionScript do cdigo mxml.
Em
temos outra forma de executar cdigo ActionScript, mas este cdigo definido no
interior da tag s:Bu on. Desta forma, podemos escrever vrias linhas de cdigo (o que
impossvel em ) sem ter que criar um mtodo separado como foi feito em .
Uma novidade na verso 4.5 a adio da propriedade icon, que adiciona um cone ao
boto, conforme o exemplo a seguir:
<s:Button id="button" label="myButton" icon="@Embed('about.png')"/>
4.8 CheckBox
spark.components.checkBox
O Checkbox um componente usado para definir algum valor lgico, verdadeiro ou falso.
Consiste de uma caixa seguida de um Label que pode estar marcada ou no. A sua
propriedade principal selected, estando true se es ver marcada ou false se no
es ver marcada.
4.9 Group
spark.components.group
O Group um componente usado para agrupar componentes visuais. O Group pode ser
configurado para organizar os seus componentes em quatro disposies: vertical,
horizontal, livre ou lado a lado. Esta configurao realizada atravs do parmetro s:layout,
onde podemos fornecer os seguintes valores:
BasicLayout: Semelhante ao Canvas no Flex 3
HorizontalLayout: Semelhante ao HBox no Flex 3
Ver calLayout: Semelhante ao VBox no Flex 3
TileLayout: Semelhante ao Tile no Flex 3
Alm do Group, temos tambm o HGroup e o VGroup. A diferena entre eles que se
usarmos o Group, pode-se alterar a disposio (de vertical para horizontal, por exemplo)
em tempo de execuo, enquanto que se usarmos o componente HGroup no poderemos
fazer isso. Isso no significa que um melhor que o outro, apenas que podem ser usados
normalmente dependo da sua necessidade.
O componente Group foi criado para subs tuir os componentes VBox, HBox, Canvas e Tile
do Flex 3. Ele possui mais performance e obedece s regras dos componentes Spark, como
por exemplo a separao entre lgica e layout. Relembrando, mesmo o componente Group
sendo Spark, pode-se adicionar componente mx nele. Vamos a um simples exemplo:
<s:Group>
<s:layout>
<s:VerticalLayout paddingTop="10"/>
</s:layout>
<s:Button label="Hello"/>
<s:Button label="World"/>
<mx:ProgressBar/>
</s:Group>
4.10 Image
Usado para carregar imagens na sua aplicao, que podem ser JPEG, PNG, GIF e at SWF. A
principal propriedade deste componente source, que indica o caminho completo da
imagem a ser carregada. As imagens podem ser carregadas de duas formas dis ntas:
4.11 Label
spark.components.label
O label o componente usado para exibir texto na tela. A propriedade text usada para
definir qual texto ser exibido. O texto no pode conter caracteres HTML, e para que possa
ser formatado voc pode usar propriedades como fontFamily e fontSize, entre outros.
O componente Label spark usa FTE
Flash Text Engine, o que no acontecia no
componente Label do Flex 3 (mx), que usava a classe TextField. Isso garante um melhor
suporte a idiomas, alm de possibilitar que o label possa ter mltiplas linhas. O Label spark
no pode ser selecionado e no possui formatao (como o uso de <b> para negrito, por
exemplo).
Exemplo:
4.12 List
spark.components.list
O componente List exibe uma lista de itens, que podem ser selecionados. semelhante ao
controle Select do HTML. Dentre suas principais propriedades, temos o dataProvider,
labelField, allowMul pleSelec on que permite que mais de um item seja selecionado e
selectedItens que retorna um vetor de objetos selecionados.
O list um componente importante no mobile, sendo utilizado em quase todas as views
para exibir informaes.
4.13 RadioButton
spark.components.RadioBu on
O componente RadioBu on usado para que possamos escolher uma opo entre vrias.
o mesmo comportamento do controle Radio do HTML. As duas principais propriedades
deste componente so label, que exibe o texto do RadioBu on, e groupName, que
iden ca o grupo onde o RadioBu on est inserido. Esta propriedade importante porque
somente uma opo entre os RadioBu ons deve ser escolhida.
Outras propriedades do RadioBu on so: selected, que indica se o Radio est selecionado e
value, que indica um valor que ser exibido atravs do componente RadioBu onGroup,
visto na prxima seo.
4.14 RadioButtonGroup
spark.components.RadioBu onGroup
4.15 TextInput
spark.components.TextInput
O componente TextInput um dos mais usados para entrada de dados. Ele representa uma
caixa onde o usurio pode inserir texto. A propriedade mais importante dele o text, que
representa o texto que est escrito na caixa de texto. Outras propriedades importantes so
maxChars, que indica a quantidade mxima de caracteres, displayAsPassword, que indica
se a caixa de texto deve omitir o que est sendo digitado e prompt, que exibe uma
mensagem dentro da caixa de texto at que o usurio selecione o componente.
Exibir listas no framework mobile ser uma das tarefas mais rotineiras do seu
desenvolvimento. importante comentar novamente que voc no deve usar o
componente DataGrid para exibir dados na tela, mas sim o componente List.
A forma mais simples de exibir uma lista de itens no framework mobile atravs do
exemplo a seguir:
<s:List id="list" width="100%" labelField="firstName">
<s:dataProvider>
<s:ArrayList>
<fx:Object firstName="Daniel"
/>
<fx:Object firstName="Fulano"
/>
<fx:Object firstName="Beltrano" />
</s:ArrayList>
</s:dataProvider>
</s:List>
Por mais simples que este exemplo possa parecer, ele explica duas propriedades
importantes do List. A primeira delas a propriedade dataProvider, que indica a fonte
de dados da lista. Geralmente esta fonte um ArrayList de objetos. Outra propriedade
importante labelField, que indica qual propriedade do objeto que ser exibido na
lista.
labelField="firstName">
firstName="Daniel"
/>
firstName="Fulano"
/>
firstName="Beltrano" />
<s:change>
<![CDATA[
this.title = list.selectedItem.firstName;
]]>
</s:change>
</s:List>
Neste exemplo, usamos o evento change para capturar o momento em que o usurio
selecionou um item da lista. Quando isso acontece, instantaneamente a propriedade
selectedItem preenchida com o objeto que foi selecionado, e podemos us-lo para
realizar algum tipo de processamento. Neste caso, apenas mudamos o ttulo da view.
Caso a propriedade allowMultipleSelection esteja com o valor true (o padro
false), voc deve usar a propriedade selectedItems, que uma lista dos objetos
selecionados. O exemplo a seguir ilustra esta caracterstica:
<s:List id="list" width="100%" labelField="firstName"
allowMultipleSelection="true"
>
<s:dataProvider>
<s:ArrayList>
<fx:Object firstName="Daniel"
/>
<fx:Object firstName="Fulano"
/>
<fx:Object firstName="Beltrano" />
</s:ArrayList>
</s:dataProvider>
<s:change>
<![CDATA[
var names:String = "";
var poeVirgula:Boolean = false;
for each (var item:Object in list.selectedItems)
{
if (poeVirgula) { names += ", " }
names += item.firstName;
poeVirgula = true;
}
this.title = names;
]]>
</s:change>
</s:List>
Neste exemplo criamos um lao para exibir a lista de nomes selecionados, atravs da
propriedade selectedItems.
Figura 5.1 - Componente List com renderizao padro, via componente Label
Se os cones estiverem no lugar certo, o resultado deste cdigo visto na Figura 5.3.
<fx:Style>
.messageStyle {
fontSize: 15;
color: #aaaa00;
}
</fx:Style>
<s:List width="100%" height="100%">
<s:dataProvider>
<s:ArrayList>
<fx:Object name="Acer Liquid"
image="device/acer_liquid.png" info="Include with Android 2.2 update"
/>
<fx:Object name="Acer Liquid Ferrari"
image="device/acer_ferrari.png" info="Include with Android 2.2
update" />
<fx:Object name="Acer Stream"
image="device/acer_android.png" info="Include with Android 2.2
update"/>
</s:ArrayList>
</s:dataProvider>
<s:itemRenderer>
<fx:Component>
<s:IconItemRenderer
iconField="image"
iconWidth="160"
iconHeight="114"
labelField="name"
messageField="info"
messageStyleName="messageStyle"
fontStyle="italic"
>
</s:IconItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:List>
</s:View>
Somente com o contedo aprendido at agora j possvel criar aplicaes simples, que
exigem pouco processamento e memria do dispositivo. A idia inicial desta aplicao
criar um gerenciador de tarefas, capaz de controlas nossas pequenas tarefas do dia a dia.
Esta aplicao possui o cdigo fonte para download. No cdigo fonte, eu comentei cada
mtodo e cada funcionalidade para facilitar o entendimento. Estes comentrios no so
exibidos nos cdigos a seguir para que no poluam o cdigo da obra, que deve ser o mais
enxuto possvel.
importante lembrar que ainda no estamos preparados para o desenvolvimento mobile,
pois o mesmo exige conhecimento especfico do disposi vo e de toda a sua API (acessar
dados do telefone, GPS, acelermetro, etc), mas isso ser visto nos prximos captulos, na
segunda parte desta obra.
Uma aplicao para gerenciar tarefas formada pelas tarefas que ainda no foram
concludas, e pelas tarefas j concludas. Com isso podemos criar duas listas, de forma a
carregar inicialmente somente a lista de tarefas no concludas. Veja que estamos, a todo
momento, pensando em performance, e precisamos focar o desenvolvimento da aplicao
neste quesito. de imaginar que o usurio no deseja ver, inicialmente, a lista de tarefas
concludas, ento no h motivos para carreg-la na memria do celular, ainda mais que,
com o passar do tempo, esta lista tende a crescer muito.
Isto signi ca que a lista de tarefas concludas no ser vista na tela inicial da aplicao,
mas estar carregada em uma varivel na memria. Este conceito pode ser melhorado caso
voc deseje otimizar ainda mais a performance do dispositivo.
Alm destas duas listas, tambm temos a tela de criao/edio de tarefas, com os
seguintes campos:
Nome da tarefa
Descrio da tarefa
Prioridade (0,1,2)
Concluda (Sim, No)
Cmo o Flash Builder 4.5 aberto, acione o menu File > New > Flex Mobile Project. Em
Project Name, coloq
Target plataforms,
escolha a verso que ser compilada o projeto. Neste caso, Google Android.
me a Figura 6.1. Clique em Finish.
Aps criar a aplicao, execute-a clicando no boto Run. Surge a tela para con gurarmos o
dispositivo padro, que neste caso ser um Google Nexus One. Selecione-o, clique em
Apply e depois em Run. Voc ver a aplicao de acordo com a Figura 6.2.
iada:
ConcluidasView.mxml, OpcoesView.mxml e TarefasView.mxml.
No assistente de criao do projeto, caso tenha usado acentuao no nome das abas, o
nome dos arquivos ser comprometido. Por exemplo, Opes ser OpesView.mxml. Neste
caso, faa o rename do arquivo (Selecione o arquivo e aperte F2).
Sinceramente eu no gosto da palavra View no nome do Arquivo, porque todas so
views, no existe distino. Ento iremos renomeFlex, no faa o rename no sistema
de arquivos, pois o Flex precisa atualizar as referncias em toda a aplicao.
h p://www.androidicons.com/freebies.php
height="100%"
firstView="views.TarefasView"
icon="@Embed(source='assets/icons/ic_menu_database.png')"
/>
<s:ViewNavigator label="Concludas"
width="100%"
height="100%"
firstView="views.Concluidas"
icon="@Embed(source='assets/icons/ic_menu_tick.png')"
/>
<s:ViewNavigator label="Opes"
width="100%"
height="100%"
firstView="views.Opcoes"
icon="@Embed(source='assets/icons/ic_menu_equalizer.png')"
/>
// ...
name:String;
description:String;
priority:uint=1;
complete:Boolean;
}
case 3:
{
return "assets/icons/baixa.png";
break;
}
}
return "assets/icons/normal.png";
}
}
}
A classe Task.as representa uma tarefa nica. Ela [Bindable] porque iremos editar as
propriedades da tarefa em formulrios, fazendo o link dos dados do formulrio ao objeto
diretamente. A propriedade icon uma forma de retornar o cone da tarefa, de acordo
com algumas propriedades. Por exemplo, se a tarefa estiver concluda, retornaremos o
Agora que criamos a classe vo que representa as tarefas, vamos criar a classe que gerencia
as tarefas. Veja que ainda no estamos nos preocupando com as telas em si, somente com
a implementao. Fazemos isso para separar cada parte da aplicao em uma camada.
Vamos criar a classe TaskController no package classes, com o seguinte cdigo:
/src/classes/TaskController.as
package classes
{
import flash.events.Event;
import flash.utils.flash_proxy;
import mx.collections.ArrayList;
import spark.managers.PersistenceManager;
import vos.Task;
public class TaskController
{
private const TASKS_COMPLETAS:String =
"TASKS_COMPLETAS";
private const TASKS_INCOMPLETAS:String =
"INTASKS_COMPLETAS";
//Armazena as tarefas que esto completas
{
this.incompletas.removeItem(task);
this.save();
}
public function removeCompleta(task:Task):void
{
this.completas.removeItem(task);
this.save();
}
public function get incompletas():ArrayList
{
return _incompletas;
}
public function set incompletas(value:ArrayList):void
{
_incompletas = value;
}
public function get completas():ArrayList
{
return _completas;
}
public function set completas(value:ArrayList):void
{
_completas = value;
}
}
}
Como a classe TaskController responsvel em gerenciar os dados das tarefas, tudo relativo
a este gerenciamento est nela. Veja que criamos inicialmente dois arrays, que vo
representar as tarefas incompletas e as tarefas completas.
Pessoal, me perdoem por misturar palavras em ingls/portugus no mesmo
sistema. O correto seria utilizar tudo em ingls...
Tambm criamos a varivel pM, que presenta a classe PersistenceManager e prov a
persistncia de dados da aplicao. No mtodo construtor, instanciamos o pM e chamamos
o mtodo initTasks, que ir iniciar os arrays das tarefas.
No mtodo initTasks, instanciamos os arrays de tarefas utilizando o mtodo
getProperty do PersistenceManager. Depois temos o mtodo Save, que usa o mtodo
icon="@Embed(source='assets/icons/ic_menu_database.png')"
/>
<s:ViewNavigator label="Concludas"
width="100%"
height="100%"
firstView="views.Concluidas"
icon="@Embed(source='assets/icons/ic_menu_tick.png')"
/>
<s:ViewNavigator label="Opes"
width="100%"
height="100%"
firstView="views.Opcoes"
icon="@Embed(source='assets/icons/ic_menu_equalizer.png')"
/>
</s:TabbedViewNavigatorApplication>
/src/views/Tarefas.mxml
<?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="Tarefas">
<fx:Script>
<![CDATA[
import mx.core.FlexGlobals;
import vos.Task;
]]>
</fx:Script>
<s:actionContent>
<s:Button icon="@Embed('assets/icons/plus.png')">
<s:click>
<![CDATA[
this.navigator.pushView(InserirTarefa,new
Task());
]]>
</s:click>
</s:Button>
</s:actionContent>
<s:List id="listConcluidas"
width="100%" height="100%"
itemRenderer="itemRenderers.CompletasItemRenderer"
>
<s:creationComplete>
<![CDATA[
listConcluidas.dataProvider =
FlexGlobals.topLevelApplication.taskController.incompletas;
]]>
</s:creationComplete>
<s:change>
<![CDATA[
if (listConcluidas.selectedItem!=null)
navigator.pushView(views.VerTarefa,listConcluidas.selectedItem
);
]]>
</s:change>
</s:List>
</s:View>
iconWidth="32"
iconHeight="32"
iconField="icon"
messageStyleName="messageStyle"
decorator="assets/icons/play.png"
>
</s:IconItemRenderer>
O item renderer usa as propriedades do IconItemRenderer para con gurar uma lista de
itens como o ttulo, descrio e cone.
Quando o usurio seleciona o boto adicionar, abrimos a view InserirTarefa.mxml, veja:
src/views/InserirTarefa.mxml
<?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="Nova Tarefa">
<s:layout>
<s:FormLayout paddingBottom="10" paddingLeft="10"
paddingRight="10" paddingTop="10"
gap="30"
/>
</s:layout>
<fx:Declarations>
<s:RadioButtonGroup id="prioridade"
selectedValue="@{data.priority}"/>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.core.FlexGlobals;
import spark.transitions.FlipViewTransition;
import vos.Task;
]]>
</fx:Script>
<s:navigationContent>
<s:Button icon="@Embed('assets/icons/arrowleft.png')">
<s:click>
<![CDATA[
navigator.popView();
]]>
</s:click>
</s:Button>
</s:navigationContent>
<s:actionContent>
<s:Button icon="@Embed('assets/icons/plus.png')">
<s:click>
<![CDATA[
FlexGlobals.topLevelApplication.taskController.incompletas.add
Item(data);
FlexGlobals.topLevelApplication.taskController.save();
navigator.popView();
]]>
</s:click>
</s:Button>
</s:actionContent>
<s:Spacer height="30"/>
<s:HGroup width="100%">
</s:HGroup>
</s:View>
Veja que para inserir uma tarefa, usamos o arroba (@) para ligar cada valor de um campo a
propriedade da varivel data. Quando o usurio confirma os dados, clicando no boto
<s:navigationContent>
<s:Button icon="@Embed('assets/icons/arrowleft.png')">
<s:click>
<![CDATA[
navigator.popView();
]]>
</s:click>
</s:Button>
</s:navigationContent>
<s:actionContent>
<s:Image source="{data.icon}" width="32" height="32"/>
<s:Spacer width="10"/>
</s:actionContent>
<s:layout>
<s:VerticalLayout
paddingBottom="10"
paddingLeft="10"
paddingRight="10"
paddingTop="10"
/>
</s:layout>
<s:Label text="{data.name}" styleName="nomeTarefaLabel"/>
<s:TextArea text="{data.description}"
styleName="descricaoTarefaLabel" height="200"
editable="false"
/>
<s:Spacer height="50"/>
<s:VGroup width="100%"
horizontalAlign="center">
<s:Button label="Completar"
visible="{!data.complete}"
height="{!data.complete?100:0}" width="100%">
<s:click>
<![CDATA[
vgroupCompletar.visible = true;
vgroupCompletar.height=100;
]]>
</s:click>
</s:Button>
<s:HGroup id="vgroupCompletar" width="100%"
visible="false"
horizontalAlign="center" height="0">
<s:Button label="Sim" width="100">
<s:click>
<![CDATA[
(data as Task).complete = true;
(FlexGlobals.topLevelApplication.taskController as
TaskController).removeIncompleta(data as Task);
(FlexGlobals.topLevelApplication.taskController as
TaskController).completas.addItem(data);
(FlexGlobals.topLevelApplication.taskController as
TaskController).save();
vgroupCompletar.visible = false;
vgroupCompletar.height=0;
]]>
</s:click>
</s:Button>
<s:Button label="No" width="100">
<s:click>
<![CDATA[
vgroupCompletar.visible=false;
vgroupCompletar.height=0;
]]>
</s:click>
</s:Button>
</s:HGroup>
</s:Button>
</s:HGroup>
</s:VGroup>
</s:View>
Quando visualizamos uma tarefa, podemos realizar algumas aes com ela. A primeira
delas concluir uma tarefa, que ir retirar a tarefa do array de incompletas e adicionar no
array de completas. Depois temos a ao de editar a tarefa, que ir chamar uma nova View
e a ao de apagar a tarefa. A view editar exibida logo a seguir:
src/views/EditarTarefa.mxml
<?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="Nova Tarefa">
<s:layout>
<s:FormLayout paddingBottom="10" paddingLeft="10"
paddingRight="10" paddingTop="10"
gap="30"
/>
</s:layout>
<fx:Declarations>
<s:RadioButtonGroup id="prioridade"
selectedValue="@{data.priority}"/>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.core.FlexGlobals;
import spark.transitions.FlipViewTransition;
import vos.Task;
]]>
</fx:Script>
<s:navigationContent>
<s:Button icon="@Embed('assets/icons/arrowleft.png')">
<s:click>
<![CDATA[
navigator.popView();
]]>
</s:click>
</s:Button>
</s:navigationContent>
<s:Spacer height="30"/>
<s:HGroup width="100%">
</s:HGroup>
</s:View>
Uma par cularidade na View para editar tarefas que ela no possui um boto para salvar
o registro. Neste caso, estamos alterando diretamente o objeto, atravs do recurso two
way databind.
Para concluir, temos a View com as opes da aplicao, veja:
src/views/Opcoes.mxml
<?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="Opes">
<fx:Script>
<![CDATA[
import mx.core.FlexGlobals;
import mx.effects.Parallel;
import spark.components.ViewNavigator;
import spark.effects.Fade;
import spark.effects.Resize;
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value
objects) here -->
</fx:Declarations>
<s:layout>
<s:VerticalLayout paddingBottom="10" paddingLeft="10"
paddingRight="10" paddingTop="10"
/>
</s:layout>
<s:VGroup horizontalAlign="center" width="100%">
<s:Button id="btnApagar" width="100%" label="Apagar
todas as tarefas">
<s:click>
<![CDATA[
hgrpApagarTudo.height = 100;
hgrpApagarTudo.visible = true;
btnApagarTarefasConcluidas.enabled = false;
]]>
</s:click>
</s:Button>
<s:HGroup id="hgrpApagarTudo" width="50%" height="0">
<s:Button id="btnApagarSim" width="100%"
label="Sim">
<s:click>
<![CDATA[
FlexGlobals.topLevelApplication.taskController.deleteAll();
FlexGlobals.topLevelApplication.tabbedNavigator.selectedIndex
= 0;
]]>
</s:click>
</s:Button>
<s:Button id="btnApagarNao" width="100%"
label="No">
<s:click>
<![CDATA[
hgrpApagarTudo.height = 0;
hgrpApagarTudo.visible = false;
btnApagarTarefasConcluidas.enabled =
true;
]]>
</s:click>
</s:Button>
</s:HGroup>
</s:VGroup>
</s:View>
Nas opes inclumos um boto que ir apagar todas as tarefas. Veja que esse boto abre
confirmar a operao.
Como podemos ver, mesmo em uma aplicao pequena, criamos uma estrutura em
camadas para a manipulao de dados. claro que podemos melhorar ainda mais esta
estrutura, restringindo o uso do FlexGlobals ou ento o acesso direto s propriedades do
TaskController.
Com a aplicao de tarefas funcionando, chegamos ao final da primeira parte desta obra,
onde aprendemos o bsico de uma aplicao Flex Mobile.
Aguardem pela segunda parte da obra, que dever ocorrer daqui h alguns meses.