Android Cookbook

  • Upload
    jormad

  • View
    249

  • Download
    0

Embed Size (px)

Citation preview

  • 8/10/2019 Android Cookbook

    1/63

    Ian F. Darwin

    Android Cookbook

    Novatec

  • 8/10/2019 Android Cookbook

    2/63

    Dados Internacionais de Catalogao na Publicao (CIP)(Cmara Brasileira do Livro, SP, Brasil)

    Darwin, Ian F. Android cookbook / Ian F. Darwin. -- So Paulo : Novatec Editora ; Sebastopol, CA : O`Reilly, 2012.

    ISBN 978-85-7522-323-9

    1. Android (Programa de computador)2. Aplicao de programa - Desenvolvimento3. Computao mvel 4. Google 5. Internet sem fio6. Telefones celulares I. Ttulo.

    12-11335 CDD-005.26

    ndices para catlogo sistemtico:

    1. Android : Plataforma de desenvolvimento para aplicativos mveis : Programa de computador 005.26

    OG20120918

    Authorized Portuguese translation of the English edition of titled Android Cookbook, First Edition ISBN9781449388416 2012 OReilly Media Inc. This translation is published and sold by permission of O'ReillyMedia, Inc., the owner of all rights to publish and sell the same.

    Traduo em portugus autorizada da edio em ingls da obra Android Cookbook, First Edition ISBN9781449388416 2012 OReilly Media Inc. Esta traduo publicada e vendida com a permisso da O'ReillyMedia, Inc., detentora de todos os direitos para publicao e venda desta obra.

    Novatec Editora Ltda. 2012.

    Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. proibida a reproduo desta obra, mesmo parcial, por qualquer processo, sem prvia autorizao, por escrito,do autor e da Editora.

    Editor: Rubens PratesTraduo: Rafael ZanolliReviso tcnica: Edgard DamianiReviso gramatical: Giacomo Leone NetoEditorao eletrnica: Carolina Kuwabata

    ISBN: 978-85-7522-323-9Histrico de impresses:

    Setembro/2012 Primeira edio

    Novatec Editora Ltda.Rua Lus Antnio dos Santos 11002460-000 So Paulo, SP BrasilTel.: +55 11 2959-6529Fax: +55 11 2950-8869Email: [email protected]: www.novatec.com.br

    Twitter: twitter.com/novateceditoraFacebook: facebook.com/novatecLinkedIn: linkedin.com/in/novatec

  • 8/10/2019 Android Cookbook

    3/63

    23

    CAPTULO 1

    Primeiros passos

    1.1 Introduo: primeiros passosIan Darwin

    DiscussoO famoso padro Ol, mundo (Hello, world ) surgiu quando Kernighan e Plaugherquiseram escrever uma receita sobre como comear a utilizar qualquer nova lin-guagem e ambiente de programao. Este captulo carinhosamente dedicado aesses nobres senhores, e a todos que j lutaram para dar seus primeiros passos emqualquer novo paradigma de programao.

    1.2 Aprendendo a linguagem JavaIan Darwin

    ProblemaAplicativos Android so escritos na linguagem de programao Java antes de seremconvertidos no formato de arquivo de classe prprio do Android, DEX. Se voc nosabe como programar em Java, vai ter diculdade em escrever aplicativos Android.

    SoluoMuitos recursos esto disponveis para aprender Java. A maioria deles ensinar o quevoc precisa, mas tambm mencionar algumas classes de API (Application Program-ming Interface) que no esto disponveis para o desenvolvimento Android.Evite quaisquer sees em qualquer recurso que fale sobre os tpicos listados na colunaesquerda da tabela 1.1.

    Tabela 1.1 Componentes da API Java a ignorar

    API Java Equivalente Android

    Swing, applets GUI do Android; veja o captulo 7

  • 8/10/2019 Android Cookbook

    4/63

    Android Cookbook24

    API Java Equivalente Android

    Ponto de entrada de aplicativomain() Veja a receita 1.6

    J2ME/Java ME A maior parte doandroid.* substitui a API Java ME

    Servlets/JSP, J2EE/Java EE Projetados para uso no lado do servidor

    DiscussoAqui esto livros e recursos sobre programao Java:

    Java in a Nutshell (lanado no Brasil pela editora Bookman, com o ttulo Java: o guia essencial) de David Flanagan (OReilly) uma boa introduo para progra-madores, especialmente queles que esto vindo de C/C++. Esse livro cresceumuito em tamanho para acompanhar o crescimento do Java SE ao longo deseu tempo de vida.

    Head First Java (lanado no Brasil pela editora Starlin Alta, com o ttuloUsea cabea! Java) de Kathy Sierra e Bert Bates (OReilly). Esse livro fornece umatima apresentao orientada ao aprendizado visual para essa linguagem.

    Thinking in Java (em uma traduo livre,Pensando em Java ) de Bruce Eckel(Prentice-Hall).

    Learning Java (lanado no Brasil pela editora Campus, com o ttulo Aprendendo

    Java) de Patrick Niemeyer e Jonathan Knudsen (OReilly). Great Java: Level 1 (em uma traduo livre, Java excelente: nvel 1), um vdeo

    feito por Brett McLaughlin (OReilly). Esse vdeo fornece uma apresentaovisual para a linguagem.

    Java: The Good Parts (lanado no Brasil pela editora Campus, com o ttuloOmelhor do Java) de Jim Waldo (OReilly).

    Java Cookbook, o qual eu escrevi e a OReilly publicou. Esse livro tido comoum bom segundo livro para desenvolvedores Java. Ele tem captulos completossobre strings, expresses regulares, nmeros, data e hora, estruturas de dados,E/S e diretrios, internacionalizao, threads, e redes, todo temas que se aplicamao Android. Ele tambm tem vrios captulos especcos para Swing e algumastecnologias com base em EE.

    Entenda, por favor, que essa lista provavelmente nunca vai estar totalmente atuali-zada. Voc tambm deve consultar o Android Development Bibliography, da OReilly,disponvel gratuitamente para download (mediante registro), uma compilao detodos os livros de vrias editoras cujos livros esto no servio online Safari. Esse livro

    tambm distribudo sem custos em conferncias relevantes nas quais a OReillytem um estande.

  • 8/10/2019 Android Cookbook

    5/63

    25Captulo 1 Primeiros passos

    Veja tambmO autor principal deste livro mantm uma lista online de recursos Java emhttp:// www.darwinsys.com/java/ .

    A OReilly tem alguns dos melhores livros Java do mercado; veja uma lista completaem http://oreilly.com/pub/topic/java.

    1.3 Criao de um aplicativo Ol, mundo a partir da linha de comandoIan Darwin

    ProblemaVoc deseja criar um novo projeto Android sem utilizar o plugin ADT do Eclipse.

    SoluoUtilize a ferramentaandroid do kit de desenvolvimento do Android (Android Develo-pment Kit, ou ADK) com o argumentocreate project e alguns argumentos adicionaispara congurar seu projeto.

    Discusso

    Alm de ser o nome da plataforma,android

    tambm o nome de uma ferramenta delinha de comando para criao, atualizao e gerenciamento de projetos. Voc podenavegar at o diretrioandroid-sdk-xxx , ou denir sua varivelPATH para incluir seusubdiretriotools.

    Depois, para criar um novo projeto, utilize o comandoandroid create project com algunsargumentos. O exemplo 1.1 um exemplo executado em MS-DOS.

    Exemplo 1.1 Criao de um novo projeto

    C:> PATH=%PATH%;"C:\Documents and Settings\Ian\My Documents\android-sdk-windows\tools"; \ "C:\Documents and Settings\Ian\My Documents\android-sdk-windows\platform-tools"C:> android create project --target android-7 --package com.example.foo --name Foo --activity FooActivity --path .\MyAndroidCreated project directory: C:\Documents and Settings\Ian\My Documents\MyAndroidCreated directory C:\Documents and Settings\Ian\My Documents\MyAndroid\src\com\example\fooAdded le C:\Documents and Settings\Ian\My Documents\MyAndroid\src\com\example\foo\FooActivity.javaCreated directory C:\Documents and Settings\Ian\My Documents\MyAndroid\resCreated directory C:\Documents and Settings\Ian\My Documents\MyAndroid\bin

    Created directory C:\Documents and Settings\Ian\My Documents\MyAndroid\libsCreated directory C:\Documents and Settings\Ian\My Documents\MyAndroid\res\values

  • 8/10/2019 Android Cookbook

    6/63

    Android Cookbook26

    Added le C:\Documents and Settings\Ian\My Documents\MyAndroid\res\values\strings.xmlCreated directory C:\Documents and Settings\Ian\My Documents\MyAndroid\res\layoutAdded le C:\Documents and Settings\Ian\My Documents\MyAndroid\res\layout\main.xmlAdded le C:\Documents and Settings\Ian\My Documents\MyAndroid\AndroidManifest.xmlAdded le C:\Documents and Settings\Ian\My Documents\MyAndroid\build.xml

    C:>

    A tabela 1.2 lista os argumentos para o cdigocreate project .

    Tabela 1.2 Lista de argumentos de create project

    Nome Signicado Exemplo

    --activity Nome de sua classe principal e nome-padro para o arquivo.apk gerado --activity HelloActivity

    --name Nome do projeto e do arquivo.apk gerado --name MyProject

    --package Nome do pacote Java para suas classes --package com.example.hello

    --path

    Path (caminho) no qual o projeto ser criado (no cria umsubdiretrio dentro dele, por isso no utilize/home/you/workspace, mas, em vez disso,/home/you/workspace/NewProjectName)

    --path /home/ian/workspace/MyProject (veja o exemplo anterior para Windows)

    --target

    Nvel de API almejado da plataforma Android; utilizeandroid list targets para ver a lista de alvos. Umnmero um "ID", e no um nvel de API; para tanto, utilizeandroid- com o nvel de API que voc deseja

    --target android-10

    Se ele no puder completar a operao solicitada, o comandoandroid apresentar umaextensa mensagem de uso do comando, listando todas as operaes que ele poderealizar, e os argumentos para elas. Se tiver sucesso, o comandoandroid create project criar os arquivos e diretrios listados na tabela 1.3.

    Tabela 1.3 Artefatos criados por create project

    Nome Signicado

    AndroidManifest.xml Arquivo de congurao do projeto, com informaes essenciaissobre o projeto para o Android

    bin Binrios gerados (arquivos de classe compilados)build.properties Arquivo de propriedades editvel

    build.xml Arquivo de controle de compilao Ant padro

    default.properties ouproject.properties (dependendo da verso das ferramentas)

    Armazena a verso do SDK e as bibliotecas utilizadas; mantidopor plugin

    gen Elementos gerados

    libs Bibliotecas, claro

    res Arquivos de recursos importantes (strings.xml , layouts etc.)

    src Cdigo-fonte de seu aplicativo

  • 8/10/2019 Android Cookbook

    7/63

    27Captulo 1 Primeiros passos

    Nome Signicado

    src/packagename/ActivityName.java Fonte da atividade de incio equivalente a main

    test Cpias da maioria dos anteriores

    uma prtica normal e recomendada no Android criar sua interface de usurio em XML utilizando o arquivo de layout criado emres/layout, mas certamente possvelescrever todo o cdigo em Java. Para manter este exemplo autocontido, faremos do jeito errado por enquanto. Utilize seu editor de texto favorito para substituir ocontedo do arquivoHelloWorld.java com o contedo do exemplo 1.2.

    Exemplo 1.2 HelloWorld.javaimport android.app.Activity;

    import android.widget.*;public class Hello extends Activity { /** * Este mtodo invocado quando a atividade instanciada em resposta, * por exemplo, a um clique seu no cone do aplicativo na tela inicial */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Cria uma TextView para a atividade atual TextView view = new TextView(this); // Faz ele dizer algo view.setText("Hello World"); // Coloca essa viso recm-criada dentro da atividade, // mais ou menos como JFrame.getContentPane().add(view) setContentView(view); }}

    Supondo que voc tenha a ferramenta Ant Build Tool da Apache Software Foundationinstalada (e ela est includa em verses recentes do SDK do Android), voc pode(em uma janela de linha de comando) ir at o diretrio do projeto (...MyDocuments\ MyAndroid no exemplo 1.1) e utilizar o comando:

    ant debug

    Isso vai criar um arquivo chamado, por exemplo,MyAndroid.apk (com apk repre-sentando Android Package) no diretriobin.

    Se esta sua primeira vez aqui, voc pode ter de criar um dispositivo virtual Android

    (Android Virtual Device, ou AVD), que simplesmente uma congurao nomeada

  • 8/10/2019 Android Cookbook

    8/63

    Android Cookbook28

    para o emulador Android especicando a resoluo-alvo, o nvel de API e assim pordiante. Voc pode criar um emulador utilizando:

    android create avd -n my_droid -t 7

    Para mais detalhes sobre a criao de um AVD (veja a receita 3.3).

    Voc pode ento iniciar o servidor do ADB (Android Debug Bridge) e o emulador:adb start-serveremulator -avd my_droid -t 5

    Presumindo que agora voc tenha o emulador sendo executado ou seu dispositivoconectado e reconhecido via USB, voc pode fazer:

    adb -e install -r bin/MyAndroid.apk

    A ag-e para o emulador; utilize-d para um dispositivo real.

    Se voc tiver prtica com scripts shell ou arquivos em lote, poder criar um arquivochamado, digamos,download , para evitar ter de digitar a invocaoadb a cada ciclode compilao.

    Finalmente voc pode iniciar seu aplicativo! Voc pode utilizar a listaApplication: toqueno pequeno cone que se parece com uma linha 55 de pontos, encontre seu aplicativopelo nome e toque em seu cone.

    Voc provavelmente vai considerar conveniente criar um cone para seu aplicativo na

    tela inicial do dispositivo ou emulador; esse cone sobreviver a vrios ciclosinstall-r , portanto, essa a forma mais fcil de testar a execuo de seu aplicativo.

    Veja tambmReceita 1.4. O blog a little madness tem uma formulao mais detalhada. O siteocial de referncia do Android tem uma pgina sobre desenvolvimento sem Eclipse.

    1.4 Criao de um aplicativo Ol, mundo no EclipseIan Darwin

    ProblemaVoc quer utilizar o Eclipse para desenvolver seu aplicativo Android.

    SoluoInstale o Eclipse, o SDK (Software Development Kit) do Android e o plugin ADT

    (Android Development Tools). Crie seu projeto e comece a escrever seu aplicativo.Compile e teste esse aplicativo no emulador, dentro do Eclipse.

  • 8/10/2019 Android Cookbook

    9/63

    29Captulo 1 Primeiros passos

    DiscussoAssim que tiver estes itens instalados, voc estar pronto para iniciar:

    O IDE Eclipse

    O SDK do Android O plugin ADT

    Se voc quiser uma explicao mais detalhada da instalao desses trs itens, porfavor, consulte a receita 1.5.

    Para iniciar, crie um novo projeto a partir do menuFile -> New (veja a gura 1.1).

    Figura 1.1 Comeando a criar um projeto Eclipse.

    Clique emNext. D um nome ao seu novo projeto e clique emNext (veja a gura 1.2).

    Selecione uma verso de SDK como alvo. A verso 2.1 oferece para voc praticamentetodos os dispositivos atualmente em uso; as verses 3.x ou 4.x oferecem os ltimosrecursos (veja a gura 1.3). Voc decide.

    A gura 1.4 mostra a estrutura do projeto expandida no painelProject direita. Elatambm mostra a que ponto voc pode chegar na utilizao do recurso de preenchi-mento automtico do Eclipse dentro do Android eu inclu o atributogravity para ortulo, e o Eclipse est oferecendo uma lista completa de valores de atributos poss-veis. Eu escolhicenter-horizontal , por isso o rtulo dever estar centralizado quandocolocarmos o aplicativo para funcionar.

  • 8/10/2019 Android Cookbook

    10/63

    Android Cookbook30

    Figura 1.2 Congurao de parmetros para um novo projeto Eclipse.

    Figura 1.3 Denio do SDK alvo para um novo projeto Eclipse.

  • 8/10/2019 Android Cookbook

    11/63

    31Captulo 1 Primeiros passos

    Figura 1.4 Uso do editor do Eclipse para denir gravity em um TextView.

    Na realidade, se voc denirgravity como center_vertical no LinearLayout e deni-locomo center_horizontal na TextView, o texto estar centralizado tanto vertical quantohorizontalmente. O exemplo 1.3 o arquivo de layoutmain.xml (localizado emres/ layout) que realiza isso.

    Exemplo 1.3 Layout do XML

  • 8/10/2019 Android Cookbook

    12/63

    Android Cookbook32

    Como sempre, o Eclipse gera uma verso compilada sempre que voc salva um arqui-vo-fonte. Alm disso, em um projeto Android, ele tambm executa uma compilaoAnt para criar o APK compilado e empacotado que estar pronto para ser executado.Por isso voc precisa apenas execut-lo. Clique com o boto direito no projeto em si

    e selecioneRun As -> Android Project (veja a gura 1.5.).

    Figura 1.5 Executando um projeto Android Eclipse.

    Isso iniciar o emulador do Android se ele ainda no estiver sendo executado. Oemulador comear com a palavra Android em texto simples, depois trocar paraa fonte Android mais elaborada, com um detalhe em branco se movendo sobre asletras em azul lembra da inicializao do Microsoft Windows 95 (veja a gura 1.6).

    Depois de um pouco mais de tempo, seu aplicativo dever inicializar. A gura 1.7mostra apenas uma tela do aplicativo em si, j que o restante da viso do emulador redundante.

    Veja tambmReceita 1.3.

  • 8/10/2019 Android Cookbook

    13/63

    33Captulo 1 Primeiros passos

    Figura 1.6 O projeto Android sendo inicializado no emulador.

    Figura 1.7 Projeto Eclipse sendo executado no emulador.

    1.5 Congurando um IDE no Windows para desenvolvimento AndroidDaniel Fowler

    Problema

    Voc deseja desenvolver seus aplicativos Android utilizando um PC Windows, porisso um guia conciso da congurao de um IDE para essa plataforma seria til.

  • 8/10/2019 Android Cookbook

    14/63

    Android Cookbook34

    SoluoO uso do IDE Eclipse recomendado no desenvolvimento de aplicativos Android.Congurar o Eclipse no Windows no uma instalao com um nico passo; vriosestgios precisam ser completados. Esta receita fornece detalhes sobre esses estgios.

    DiscussoNo desenvolvimento de aplicativos para Android, o IDE (Integrated DevelopmentEnvironment) Eclipse para Java recomendado. O plugin ADT (Android DevelopmentTools) est disponvel para aprimorar o Eclipse, o qual utiliza o SDK do Android,fornecendo programas essenciais para desenvolvimento de software para o Android.Para congurar um ambiente de desenvolvimento, voc precisa efetuar o downloade a instalao destes componentes:

    Java Standard Edition Development Kit

    Eclipse para desenvolvimento Java

    SDK do Android

    plugin ADT (dentro do Eclipse)

    Nas subsees a seguir abordaremos esses estgios detalhadamente para um PCWindows (testado em XP, Vista e Windows 7).

    Instalao do JDK (Java Development Kit)V at a pgina de downloads do Java, emhttp://www.oracle.com/technetwork/java/ javase/downloads/index.html .

    Selecione o cone do Java para acessar os downloads do JDK:

    A lista de downloads do JDK ser mostrada. Clique no boto de opoAccept LicenseAgreement; do contrrio, voc no poder continuar. Faa o download e execute o JDKmais recente presente; quando da elaborao deste texto, eles eram o jdk-7u2-windows--i586.exe (ou o jdk-7u2-windows-x64.exe para o Windows 64 bits). Voc pode precisarselecionar a localizao do site de download. Aceite quaisquer avisos de seguranaque apaream, mas apenas se voc estiver efetuando o download na pgina ocialde downloads do Java.

  • 8/10/2019 Android Cookbook

    15/63

    35Captulo 1 Primeiros passos

    Quando o download tiver terminado e for executado, voc ter de percorrer as telasde instalao, clicandoNext at que o instalador do JDK tenha concludo. Voc nodeve ter de alterar nenhuma das opes apresentadas. Quando o instalador do JDKtiver concludo, clique no botoFinish. Pode ser que uma pgina de registro de produto

    seja carregada; voc pode fech-la ou escolher registrar sua instalao.Instalao do Eclipse para desenvolvimento Java

    A pgina de download do Eclipse est emhttp://www.eclipse.org/downloads/ .

    O Windows precisa ser selecionado na lista suspensaPackages; selecione o link relevantede download do IDE Eclipse para desenvolvedores Java (veja a gura 1.8).

    Figura 1.8 Escolha de um download do Eclipse.

    Faa o download e abra o arquivo ZIP. No arquivo haver um diretrioeclipse con-tendo vrios arquivos e subdiretrios. Copie o diretrioeclipse e todo o seu contedocomo fornecido (Figura 1.9). O local habitual para o qual copiar os arquivos na raizdo drive C ou dentro deC:\Arquivos de Programas. Voc pode ter de selecionarContinuar quando o Windows pedir permisso para a cpia.

    Crie um atalho de desktop paraeclipse.exe.

    Figura 1.9 Contedo da pasta do Eclipse.

  • 8/10/2019 Android Cookbook

    16/63

    Android Cookbook36

    Execute o Eclipse para que ele congure um workspace (espao de trabalho); fazerisso tambm vericar que tanto o Java quanto o Eclipse foram instalados correta-mente. Quando voc executar o Eclipse, pode ser que um aviso de segurana sejamostrado; selecioneRun para continuar. Aceite a localizao padro do workspace ouutilize um diretrio diferente.

    Instalao do SDK do Android

    V at a pgina de download do SDK do Android emhttp://developer.android.com/ sdk/index.html.

    Escolha o pacote EXE mais recente para Windows (no momento em que escrevoisso,installer_r16-windows.exe ) e selecioneRun. Aceite o aviso de segurana apenas sevoc estiver efetuando o download na pgina ocial do site do SDK do Android. Oinstalador Android SDK Tools mostrar algumas telas. Selecione o botoNext em cada

    uma delas; voc no deve ter de alterar nenhuma opo. Uma vez queC:\Arquivos deProgramas um diretrio protegido, voc pode ou obter permisso para instalar nele,ou, como fazem alguns desenvolvedores, instalar em sua pasta de usurio ou outrodiretrio por exemplo,C:\Android\android-sdk .

    Quando o botoInstall for clicado, uma tela de progresso aparecer brevemente en-quanto os arquivos do Android so copiados. Clique no ltimo botoNext e no botoFinish ao nal da instalao. Se voc deixou a caixaStart SDK Manager selecionada, o SDKManager ser executado. Do contrrio, selecione o SDK Manager a partir do grupode programas Android SDK Tools (Iniciar->Todos os Programas->Android SDK Tools->SDK Manager).Quando o SDK Manager iniciar, os pacotes Android disponveis para download serovericados. Ento, uma lista de pacotes disponveis ser mostrada com alguns delespr-selecionados para download. Uma coluna deStatus mostrar se um pacote estinstalado ou no. Na gura 1.10 voc pode ver que as Android SDK Tools acabaramde ser instaladas e isso est reetido na colunaStatus.

    Marque cada pacote que precisa ser instalado. Vrios pacotes esto disponveis. Estesincluem pacotes da plataforma SDK para cada nvel de API, exemplos de aplicativospara a maioria dos nveis de API, APIs do Google Maps, APIs de fabricantes especcos,documentao, cdigo-fonte e os pacotes extras a seguir para o Google:

  • 8/10/2019 Android Cookbook

    17/63

    37Captulo 1 Primeiros passos

    Android SupportUtilizado para oferecer suporte a APIs Android mais recentes em dispositivosmais antigos.

    AdMob Ads SDK Para incorporao de publicidade em aplicativos.

    Analytics SDK Para oferecer suporte anlise das compras de clientes.

    Market BillingAcrescenta suporte para compras dentro do aplicativo.

    Market LicensingAjuda a proteger aplicativos de serem ilegalmente copiados.

    USB Driver Para depurao em dispositivos fsicos (ou utilizando um driver do fabricante).

    Webdriver Ajuda a testar a compatibilidade de um site com o navegador Android.

    Figura 1.10 Android SDK Manager, mostrando componentes instalados e disponveis para download.

  • 8/10/2019 Android Cookbook

    18/63

    Android Cookbook38

    recomendado que voc efetue o download de vrias plataformas de SDK parapermitir testes de aplicativos em vrias conguraes de dispositivo. Vale notar quecomputadores mais antigos tero diculdade em executar os emuladores de disposi-tivos virtuais para as APIs mais recentes do Android; portanto, nesses computadores,

    desenvolva utilizando as plataformas SDK mais antigas. Se estiver em dvida quanto aqual download efetuar, aceite as escolhas iniciais e execute novamente o SDK Managerpara obter outros pacotes como e quando necessrio; ou marque todos os pacotespara efetuar o download de tudo (o download pode demorar um pouco). Clique noboto Install packages.

    Os pacotes selecionados sero mostrados em uma lista; se um pacote tiver termosde licena que requerem aceitao, ele ser mostrado com um ponto de interroga-o. Destaque cada pacote que tem um ponto de interrogao para ler os termos de

    licena. Voc pode aceitar ou rejeitar o pacote utilizando os botes de opo. Pacotesrejeitados so marcados com um vermelho. Alternativamente, clique emAccept All para aceitar tudo que est disponvel Clique no botoInstall e uma barra de progressomostrar os pacotes sendo instalados, bem como quaisquer erros que ocorram. NoWindows, um erro comum ocorre quando o SDK Manager incapaz de acessar oude renomear diretrios. Execute novamente o SDK Manager como administradore verique se o diretrio no tem nenhuma ag ou nenhum arquivo apenas paraleitura; veja a receita 1.12 para mais detalhes. Quando tiver concludo, feche o SDKManager clicando no boto no canto superior da janela.

    Instalao do plugin ADT

    A instalao do plugin ADT feita via Eclipse, mas para isso voc precisa executar oEclipse a partir da conta de administrador. Utilize o atalho criado antes ou oeclipse.exe na pastaeclipse. Em qualquer um dos casos, abra o menu de contexto (geralmentepor meio de um clique com o boto direito), selecione Executar como administradore aceite quaisquer avisos de segurana. Quando o Eclipse tiver carregado, abra o itemde menuHelp e selecioneInstall New Software.

    Na tela de instalao, digite este endereo na caixa Work with:https://dl-ssl.google.com/android/eclipse/

    Clique no botoAdd. Uma telaAdd Repository aparecer; na caixaName digite algo signi-cativo, como ADT plug-in (o endereo web mencionado antes ser mostrado nacaixaLocation); veja a gura 1.11.

    Clique no botoOK. A tela ser atualizada depois de brevemente mostrar Pendingna colunaName da tabela.

    Marque a caixa ao lado deDeveloper Tools. Ento, selecione o botoNext na parte inferiorda tela (veja gura 1.12).

  • 8/10/2019 Android Cookbook

    19/63

    39Captulo 1 Primeiros passos

    Figura 1.11 Incluso do repositrio ADT plug-in.

    Uma lista de itens a serem instalados ser mostrada. Se voc receber uma mensagemde erro, verique se o Eclipse foi executado na conta do administrador. SelecioneNext novamente. Uma tela mostrar as licenas; certique-se de que cada licena tenha

    sido aceita (selecione o boto de opo I accept the terms of the license agreements).Ento clique no botoFinish. Um aviso de segurana ter de ser aceito para concluira instalao; selecioneOK para esse aviso (o endereo digitado antes um endereoseguro). O Eclipse pedir uma reinicializao. Selecione o botoRestart Now e o Eclipsevai fechar e recarregar. Uma caixa de dilogo Welcome to Android Developmentvai aparecer. Dena a localizao do SDK na caixaExisting Location (uma vez que o SDKManager j foi executado), v at a pasta do SDK do Android (por padro,C:\Arquivosde Programas\Android\android-sdk ), e clique emNext (veja a gura 1.13).

    Uma pergunta de monitoramento de uso do Google Android SDK vai aparecer; mo-dique a opo se necessrio e clique emFinish. O Eclipse estar agora conguradopara compilar e depurar aplicativos Android. Veja a receita 3.3 para congurar umemulador Android; depois experimente a receita 1.4 como um teste de sanidade. Co-necte um dispositivo fsico no computador e utilize suas conguraes para ativar oUSB Debugging (emDevelopment, dentro deApplications).

    Veja tambm

    Receita 1.4; Receita 1.12; Receita 3.3;http://developer.android.com/sdk/installing.html ,http:// www.eclipse.org/ ; http://www.oracle.com/technetwork/java/javase/downloads/index.html.

  • 8/10/2019 Android Cookbook

    20/63

    Android Cookbook40

    Figura 1.12 Escolhendo o que instalar.

    Figura 1.13 Conexo do recm-instalado SDK ao recm-instalado plugin ADT.

  • 8/10/2019 Android Cookbook

    21/63

    41Captulo 1 Primeiros passos

    1.6 Entendendo o ciclo de vida do AndroidIan Darwin

    ProblemaAplicativos Android no tm um mtodo main; voc precisa aprender como elescomeam e como param ou so parados.

    SoluoA classeandroid.Activity fornece vrios mtodos de ciclo de vida bem denidos queso chamados quando um aplicativo iniciado, suspenso, reiniciado e assim pordiante, assim como um mtodo que voc pode chamar para marcar uma atividade

    como concluda.DiscussoSeu aplicativo Android executa seu prprio processo Unix, por isso, em geral, ele nopode afetar diretamente nenhum outro aplicativo em execuo. A VM Dalvik faz ainterface com o sistema operacional para chamar voc quando seu aplicativo inicia,quando o usurio muda para outro aplicativo e assim por diante. H um ciclo devida bem denido para aplicativos Android.

    Um aplicativo Android tem trs estados em que pode estar: Ativo, no qual o aplicativo est visvel para o usurio e em execuo.

    Pausado, no qual o aplicativo est parcialmente obscurecido e perdeu o focode entrada.

    Parado, no qual o aplicativo est completamente oculto da viso.

    Seu aplicativo percorrer esses estados quando o Android chamar os mtodos a seguirna atividade atual, no momento apropriado:

    void onCreate(Bundle savedInstanceState)void onStart()void onResume()void onRestart()void onPause()void onStop()void onDestroy()

    Voc pode ver o diagrama de estado desse ciclo de vida na gura 1.14.

    No caso da primeira atividade de um aplicativo,onCreate() a forma como voc sabeque o aplicativo foi iniciado. aqui que voc normalmente realiza trabalhos de tipo

  • 8/10/2019 Android Cookbook

    22/63

    Android Cookbook42

    construtor, como denir a janela principal comsetContentView() , incluir ouvintes(listeners) para botes que realizem trabalhos (inclusive iniciar atividades adicio-nais) e assim por diante. Esse o nico mtodo que at mesmo o mais simples dosaplicativos Android precisa.

    (no process)

    Running

    onStop()

    (new)

    onStart()

    onStop() onResume()

    onDestroy()

    onPause()onResume()

    onDestroy()

    StoppedPaused

    Figura 1.14 Estados de ciclo de vida do Android.

    Voc pode ver os efeitos dos vrios mtodos de ciclo de vida criando um projeto deteste no Eclipse e sobrescrevendo todos os mtodos utilizando instrues de log parans de depurao.

    1.7 Instalao de arquivos .apk em um emulador por meio do ADBRachee Singh

    Problema

    Voc tem um arquivo.apk de um aplicativo, e deseja instal-lo no emulador para con-ferir esse aplicativo, ou porque um aplicativo que voc est desenvolvendo o requer.

    SoluoUtilize a ferramenta de linha de comando ADB para instalar o arquivo.apk no emu-lador em execuo; voc tambm pode utilizar essa ferramenta para instalar umarquivo.apk em um dispositivo Android conectado.

  • 8/10/2019 Android Cookbook

    23/63

    43Captulo 1 Primeiros passos

    DiscussoPara instalar o arquivo.apk, siga estes passos:

    1. Encontre o local em sua mquina onde voc instalou o SDK do Android. No

    diretrio do SDK do Android, v at o diretriotools.2. Procure um executvel chamadoadb no diretriotools. Se ele estiver presente,essa a localizao do arquivoadb; do contrrio, deve haver um arquivo.txt chamado adb has moved. O contedo desse arquivo meramente direcionavoc para a localizao do binrio doadb; o arquivo arma que oadb estpresente no diretrio platform-tools em vez de estar no diretriotools.

    3. Assim que voc tiver localizado o programaadb, use o comandocd para chegara essa localizao em um terminal (Linux) ou prompt de comando (Windows).

    4. Utilize o comandoadb install localizao do .apk que voc deseja instalar . Se vocreceber command not found no Linux, tente utilizar ./adb em vez de apenasadb.

    Isso deve iniciar a instalao no dispositivo que est atualmente sendo executado(seja um emulador em execuo em seu desktop, ou um dispositivo fsico Androidconectado).

    Depois de a instalao terminar, no menu do dispositivo/emulador Android, vocdeve ver o cone do aplicativo que acabou de instalar (veja a gura 1.15).

    Figura 1.15 Comando da instalao.

  • 8/10/2019 Android Cookbook

    24/63

    Android Cookbook44

    1.8 Instalao de aplicativos em um emulador via SlideMEDavid Dawes

    ProblemaAs app stores (em uma traduo livre, lojas de aplicativos) so uma enorme parteda atrao dos smartphones modernos. O Android Market1 do Google aapp store ocial, mas voc tambm pode querer utilizar outras.

    SoluoA SlideMe LLC oferece umaapp store alternativa. Aapp store SlideME permite quevoc instale outros aplicativos (talvez voc queira integrar com outros aplicativos),

    bem como que voc teste a experincia de publicar e efetuar o download de seusprprios aplicativos em seu dispositivo emulado Android. A SlideME tambm alcanamuitos usurios Android que esto fora do Android Market, incluindo pessoas comdispositivos no suportados e aqueles que no vivem em um pas onde h suportedo Android Market.

    DiscussoUma alternativa ao Android Market ocial a SlideME, umaapp store alternativa. ASlideME pode no ter tantos aplicativos quanto o Android Market do Google, mastem algumas vantagens, incluindo o fato de que funciona facilmente em um dispo-sitivo Android emulado.

    V at o site da SlideME utilizando seu dispositivo Android emulado, navegue oubusque aplicativos e clique em um aplicativo gratuito. Depois de uma pausa paradownload do aplicativo, abra o download (a pequena seta no canto superior esquerdo),revise a licena e inicie o arquivo.apk do qual voc efetuou o download para instalaro aplicativo. Durante a instalao, ser pedido que voc revise e aceite a licena parao software.

    Assim que o aplicativo da SlideME tiver sido instalado, voc poder percorrer ocatlogo e instalar mais aplicativos sem utilizar o navegador. Isso muito mais fcildo que utilizar um navegador web para efetuar o download dos aplicativos, j quea apresentao projetada para o dispositivo Android; simplesmente escolha umacategoria, navegue dentro dela, e escolha um aplicativo para instalar. Eu tive algunsproblemas de estabilidade utilizando o aplicativo em meu emulador ele congelouem alguns casos , mas fui capaz de instalar alguns aplicativos bsicos gratuitos,como o Grocery List.1 N.T.: Android Market era o nome anterior da loja de aplicativos do Google, que hoje, unicada

    s lojas de msica, lmes e livros, chamada de Google Play (fonte: Wikipdia).

  • 8/10/2019 Android Cookbook

    25/63

    45Captulo 1 Primeiros passos

    Percebi, no frum de discusso Android Invasion noLinkedin.com, que alguns usuriosdo Android caram desapontados ao perceber que muitos provedores de telefonescelulares no incluem o Android Market ocial em suas ofertas de telefones celularesAndroid, e, a no ser que voc se sinta vontade em fazer o root2 e atualizar seu tele-

    fone Android, no h como acess-lo. A maioria dos clientes no se sente confortvelem fazer o root e atualizar seus telefones, e, para eles, a SlideME oferece um modoalternativo de encontrar aplicativos gratuitos e baratos para seus telefones.

    Veja tambmA SlideME tambm permite que voc publique seus aplicativos em suaapp store; vejaa pgina Applications no site da SlideME.

    Para informaes sobre o desenvolvimento de aplicativos para a SlideME, consultehttp://slideme.org/developers.

    1.9 Compartilhando classes Java de outro projeto EclipseIan Darwin

    ProblemaVoc deseja utilizar uma classe de outro projeto, mas no quer copiar e colar.

    SoluoInclua o projeto como um projeto referenciado, e o Eclipse (e o DEX) cuidaro dotrabalho.

    DiscussoVoc muitas vezes precisa reutilizar classes de outro projeto. Em meu programa demonitoramento GPS, o JPSTrack, a verso do Android empresta classes como o m-

    dulo de I/O de arquivos da verso Java SE. Voc certamente no deseja copiar e colarclasses inalteradas de um projeto para outro, pois isso torna a manuteno improvvel.

    No caso mais simples, quando o projeto de biblioteca contm o cdigo-fonte dasclasses que voc deseja importar, tudo que voc tem de fazer declarar o projeto quecontm as classes necessrias (a verso Java SE neste caso) como um projeto referen-ciado no path de compilao. SelecioneProject->Properties->Java Build Path, selecioneProjects,e clique emAdd. Na gura 1.16, eu estou incluindo o projeto SE jpstrack como umadependncia no projeto Android jpstrack.android.2 N.T.: O rooting um processo que permite a usurios de smartphones, tablets, e outros disposi-

    tivos que executam o sistema operacional Android, obter controle privilegiado (conhecido comoacesso raiz) dentro do subsistema do Android (fonte: Wikipdia).

  • 8/10/2019 Android Cookbook

    26/63

    Android Cookbook46

    Figura 1.16 Tornando um projeto dependente de outro utilizando Eclipse padro.

    Desenvolvedores mveis que tambm criam aplicativos para outras plataformas de-

    vem notar que essa tcnica no funciona se voc tem o plugin BlackBerry Java atual(do nal de 2011) instalado em sua instalao Eclipse. Esse um bug no plugin Bla-ckBerry Java; ele sinaliza incorretamente at mesmo projetos no BlackBerry comodependentes de projetos de biblioteca no BlackBerry, e marca o projeto como tendoum erro, o que impede a gerao e execuo correta do cdigo. Remova o plugindefeituoso ou coloque-o em uma instalao separada do Eclipse.

    Como alternativa, crie um arquivo JAR utilizando o Ant ou o assistente do Eclipse.Faa com que o outro projeto referencie esse arquivo como um JAR externo nas

    conguraes do classpath. Ou copie sicamente este arquivo para o diretriolibs efaa referncia a ele a partir desse local.

    Um mtodo mais novo que frequentemente mais convel, e agora ocialmenterecomendado, mas til apenas se ambos os projetos forem projetos Android, decla-rar o projeto de biblioteca como tal na guiaProject->Properties->Android->Library (marqueo boto Is Library), e utilizar o botoAdd no outro projeto, na mesma tela, para listar oprojeto de biblioteca como uma dependncia do projeto principal (veja a gura 1.17).

    Para fs da linha de comando, o primeiro mtodo envolve a edio do arquivo.class-

    path , enquanto o segundo simplesmente cria entradas no arquivo project.properties,por exemplo:

  • 8/10/2019 Android Cookbook

    27/63

    47Captulo 1 Primeiros passos

    # Projeto alvotarget=android-7android.library=falseandroid.library.reference.1=../wheel

    Figura 1.17 Tornando um projeto dependente de outro utilizando ADT.

    Como voc provavelmente est mantendo ambos os projetos em controle de verso(e se forem programas que em algum momento voc pretende lanar, voc deve!),lembre-se de marcar ambos os projetos quando lanar o projeto Android umdos pontos a favor do controle de verso que voc capaz de recriar exatamente oque entregou.

    Veja tambmConsulte a documentao ocial sobre projetos de biblioteca.

    1.10 Referenciando bibliotecas para implementar funcionalidades externRachee Singh

    ProblemaVoc precisa referenciar uma biblioteca externa em seu cdigo-fonte.

  • 8/10/2019 Android Cookbook

    28/63

    Android Cookbook48

    SoluoObtenha o arquivo JAR da biblioteca requerida e inclua-o em seu projeto.

    DiscussoComo exemplo, voc pode ter de utilizar o AndroidPlot, uma biblioteca para repre-sentao de diagramas e grcos em seu aplicativo, ou o OpenStreetMap, um projetowiki que cria e fornece dados e mapeamento geogrcos gratuitos. Se armativo, seuaplicativo precisa referenciar essas bibliotecas. Voc pode fazer isso no Eclipse empoucos passos simples:

    1. Efetue o download do arquivo JAR correspondente biblioteca que voc desejautilizar.

    2. Depois de criar seu projeto Android no Eclipse, clique com o boto direitosobre o nome do projeto e selecioneProperties no menu (Figura 1.18).3. Na lista do lado esquerdo, selecioneJava Build Path e clique na guiaLibraries.4. Clique no botoAdd External JARs.5. Fornea o local onde voc efetuou o download do arquivo JAR da biblioteca

    que voc deseja utilizar.

    Figura 1.18 Seleo de propriedades do projeto.

  • 8/10/2019 Android Cookbook

    29/63

    49Captulo 1 Primeiros passos

    Nesse ponto, voc ver um diretrioReferenced Libraries em seu projeto. Os JARs quevoc incluiu vo aparecer (veja a gura 1.19).

    Uma abordagem alternativa criar uma pastalib em seu projeto, copiar sicamente osarquivos JAR para ela e inclu-los individualmente como voc fez antes, mas, em vezdisso, clicando no botoAdd JARs. Isso mantm tudo em um lugar s (especialmentese seu projeto for compartilhado por meio de um sistema de controle de verso comoutros que podem utilizar um sistema operacional diferente e incapaz de utilizar os JARs externos no mesmo local). No entanto, isso eleva o fardo de responsabilidade paraquestes de licenciamento referentes aos arquivos JAR includos (veja a gura 1.20).

    Figura 1.19 Incluso de bibliotecas.

    Em qualquer um dos casos, se voc tambm compilar com Ant, certique-se deatualizar seu arquivobuild.xml.

    Qualquer que seja o modo escolhido bastante fcil incluir bibliotecas em seu projeto.

  • 8/10/2019 Android Cookbook

    30/63

    Android Cookbook50

    Figura 1.20 Incluso do arquivo JAR externo.

    1.11 Uso de exemplos do SDK para ajudar a evitar situaes de dvidaDaniel Fowler

    Problemas vezes difcil codicar determinada funcionalidade, especialmente quando adocumentao imprecisa ou no fornece nenhum exemplo.

    Soluo

    Analisar cdigos funcionais j existentes vai ajudar. O SDK do Android tem programasde exemplo que voc pode destrinchar para ver como funcionam.

    DiscussoO SDK do Android vem com vrios aplicativos de exemplo que podem ser teisquando voc estiver tentando codicar alguma funcionalidade. Analisar o cdigo doexemplo pode ser esclarecedor. Assim que voc tiver instalado o SDK do Android,vrios exemplos se tornaro disponveis:

  • 8/10/2019 Android Cookbook

    31/63

    51Captulo 1 Primeiros passos

    Accelerometer Play Accessibility Service API Demos Backup and Restore Bluetooth Chat Business Card Contact Manager Cube Live Wallpaper Home Honeycomb Gallery JetBoy Lunar Lander Multiple Resolutions Near Field Communication Note Pad RenderScript Sample Sync Adapter Searchable Dictionary

    Session Initiation Protocol Snake Soft Keyboard Spinner SpinnerTest StackView Widget TicTacToeLib

    TicTacToeMain USB Wiktionary Wiktionary (Simpli ed) Weather List Widget XML Adapters

    Para abrir um projeto de exemplo a partir do Eclipse, abra o menuFile e ento sele-

    cioneAndroid Project (veja a gura 1.21).

  • 8/10/2019 Android Cookbook

    32/63

    Android Cookbook52

    Figura 1.21 Iniciando um novo projeto Android.

    No dilogoNew Android Project, selecione a opoCreate project from existing sample. Clique emNext e selecione o alvo de compilao. Uma lista de exemplos disponveis para o alvoselecionado ser mostrada. Se o exemplo necessrio no for mostrado, volte e selecioneoutro alvo de compilao. (O exemplo pode no estar instalado; o SDK Manager podeser utilizado para instalar exemplos adicionais se eles estiverem faltando durante osetup do SDK.) Escolha o exemplo a ser carregado, clique emFinish, e o exemplo sercopiado para o Workspace e compilado (com o progresso mostrado na barra de status).

    Depois de pouco tempo o exemplo estar pronto para ser executado e voc ser capazde explorar o cdigo-fonte para ver como tudo feito.

    Se os exemplos foram movidos do diretriosamples do SDK, utilize a opo Createproject from existing source no dilogoNew Android Project para abrir o exemplo.Quando o exemplo for executado pela primeira vez, selecioneAndroid Application nodilogoRun As que deve aparecer. Tambm pode ser necessrio congurar um AVDapropriado para executar o exemplo (veja a receita 3.3). Veja a gura 1.22.

    Figura 1.22 Demonstraes da API em ao.

  • 8/10/2019 Android Cookbook

    33/63

    53Captulo 1 Primeiros passos

    Veja tambmO site Android Developers emhttp://developer.android.com/index.html ; este cookbook, claro.

    Voc tambm pode pesquisar a Web em busca de programas ou exemplos adicionais.Se voc ainda no conseguiu encontrar o que precisa, pode buscar ajuda no StackOverow (http://www.stackoverow.com ; utilize android como tag) ou no canal IRC(Internet Relay Chat)#androiddev no freenode .

    1.12 Mantendo o SDK do Android atualizadoDaniel Fowler

    ProblemaO SDK deve ser mantido atualizado para permitir que desenvolvedores de aplicativostrabalhem com as APIs mais recentes na plataforma Android que est sempre emevoluo.

    SoluoUtilize o programa Android SDK Manager para atualizar os pacotes SDK instaladosexistentes e instalar novos pacotes SDK. Isso inclui pacotes de terceiros para funcio-nalidades de dispositivos especcos.

    DiscussoO sistema operacional (SO) Android est evoluindo constantemente, e, portanto, omesmo vale para o SDK do Android. O desenvolvimento constante do Android motivado por estes fatores:

    A pesquisa e desenvolvimento do Google.

    Fabricantes de telefones estarem sempre desenvolvendo dispositivos novos emelhorados. A resoluo de problemas de segurana e possveis exploits3. A necessidade do suporte a novos dispositivos (por exemplo, o suporte a dis -

    positivos tablet foi includo com a verso 3.0). O suporte a novas interfaces de hardware (por exemplo, o suporte a comuni -

    cao de campo prximo foi includo na verso 2.3). A correo de bugs.

    3 N.T.: Um exploit, em segurana da informao, um programa de computador, ou uma sequnciade comandos que aproveita das vulnerabilidades de um sistema computacional (fonte: Wikipdia).

  • 8/10/2019 Android Cookbook

    34/63

    Android Cookbook54

    Melhorias de funcionalidades (por exemplo, um novo engine JavaScript).

    Alteraes no kernel Linux subjacente.

    A substituio de interfaces de programao redundantes.

    Novos usos (por exemplo, o Google TV). A comunidade de desenvolvimento Android como um todo.

    Abordamos a instalao do SDK do Android em outro local (veja a Receita 1.5 ouhttp://developer.android.com/sdk/installing.html ). Depois de o SDK ter sido instaladona mquina de desenvolvimento e de o ambiente de programao estar sendo exe-cutado sem problemas, desenvolvedores tero, de vez em quando, de vericar se hatualizaes para o SDK.

    Voc pode manter o SDK atualizado executando o programa SDK Manager. (Em umamquina Windows, execute oSDK Manager.exe na pastaC:\Arquivos de Programas\ Android\androidsdk , ou utilize o menuIniciar, e ento selecioneTodos os Programas->AndroidSDK Tools, e clique emSDK Manager). Voc tambm pode execut-lo dentro do Eclipse(utilizando o menuWindow e selecionandoAndroid SDK Manager); veja a gura 1.23. O SDKdo Android dividido em vrios pacotes. O SDK Manager procura automaticamentepor atualizaes para pacotes existentes e vai listar novos pacotes e aqueles fornecidospor fabricantes de dispositivos.

    Figura 1.23 SDK Manager do Android.

    Atualizaes disponveis sero mostradas em uma lista (assim como pacotes opcionaisdisponveis). Se uma atualizao ou um pacote tiver termos de licena que requeremaceitao eles sero mostrados com um ponto de interrogao. Destaque cada pacoteque tem um ponto de interrogao para ler os termos de licena. Voc pode aceitarou rejeitar o pacote utilizando os botes de opo. Pacotes rejeitados sero marcadoscom um vermelho (veja a gura 1.24).

  • 8/10/2019 Android Cookbook

    35/63

    55Captulo 1 Primeiros passos

    Figura 1.24 Escolha de pacotes do SDK.

    Como alternativa, clique emAccept All para aceitar tudo que estiver disponvel. Todosos pacotes e atualizaes que estiverem disponveis para download e instalao seromostrados com um sinal de visto verde.

    Clique no botoInstall para comear o download e a instalao; quando concludo,clique no botoClose (veja a gura 1.25).

    Figura 1.25 Janela de log do SDK Manager.

    Se o prprio programa SDK Manager tiver sido atualizado, voc ver uma mensagempedindo que reinicie o programa (veja a gura 1.26).

    O SDK Manager tambm utilizado para download de pacotes adicionais que noso parte da plataforma padro. Esse mecanismo utilizado por fabricantes de dispo-sitivos para fornecer suporte a seus prprios hardwares. Por exemplo, a LG Electronicsfornece um dispositivo 3D e, para oferecer suporte capacidade 3D em aplicativos,um pacote adicional fornecido. Ele tambm utilizado pelo Google para permitiro download de APIs opcionais.

  • 8/10/2019 Android Cookbook

    36/63

    Android Cookbook56

    Figura 1.26 Noticao de atualizao do SDK Manager.

    Na caixa de dilogo do SDK Manager, expanda e marque os pacotes necessrios nalista da esquerda e ento clique no botoInstall (veja a gura 1.27). Se um pacote deterceiros no estiver listado, o URL para um arquivorespository.xml , fornecido pelopublicador do pacote, ter de ser digitado por meio do menuTools.

    Figura 1.27 Lista de componentes instalados e instalveis.

    Possveis erros de atualizao no Windows

    Em um sistema to complexo, h muitas coisas que podem dar errado. Esta seodiscute algumas dessas coisas e suas solues.

    Execute o SDK Manager como administrador. Em uma mquina Windows, a localizaopadro para o SDK o diretrioC:\Arquivos de Programas\Android\android-sdk . Esse um diretrio restrito e isso pode fazer com que a instalao do SDK fracasse. Umdilogo de mensagem com o ttulo SDK Manager: failed to install pode aparecer(veja a gura 1.28).

  • 8/10/2019 Android Cookbook

    37/63

    57Captulo 1 Primeiros passos

    Figura 1.28 SDK Manager: falha ao instalar.

    Para resolver esse erro h algumas coisas a vericar: Desconecte quaisquer dispositivos Android (isso pode impedir o adb.exe de

    fechar).

    V at C:\Arquivos de Programas\Android\Android-sdk e abra as propriedades para a pasta de ferramentas (selecione o menu de contexto e entoPropriedades).Certique-se de que a caixa seletora Somente leitura (arquivos da pasta) noest clicada (veja gura 1.29).

    Figura 1.29 Denio do atributo de leitura e escrita no Microsoft Windows.

    Voc pode ter de dar permisso para alterar os atributos (veja a gura 1.30).

  • 8/10/2019 Android Cookbook

    38/63

    Android Cookbook58

    Figura 1.30 Conrmao de permisso necessria.

    Uma caixa de dilogo de conrmao das modicaes de atributos vai aparecer;certique-se de que a opo Aplicar as alteraes a esta pasta, subpasta e arquivosest selecionada e clique emOK. Ento, faa o seguinte:

    Reinicie o computador.

    Certi que-se de que todos os outros programas esto fechados, especialmentequalquer cpia do Gerenciador de Arquivos.

    Execute o SDK Manager.exe na conta de administrador. Abra o menu de contextoe selecione Executar como administrador (veja a gura 1.31).

    Figura 1.31 Executar como administrador.

    Feche o ADB antes de atualizar. Uma mensagem pedindo que voc reinicie o ADB (o An-droid Debugger) pode aparecer (Figura 1.32).

    Figura 1.32 Conrmao para reiniciar o ADB.

    Idealmente, melhor executar o SDK Manager sem que o ADB esteja sendo executado,e ele no deve estar sendo executado se o Windows tiver acabado de iniciar. Comoalternativa voc pode utilizar o Gerenciador de Tarefas do Windows para interrom-per o adb.exe. Se o ADB no estava sendo executado, respondaNo a esse prompt; docontrrio, respondaYes.

  • 8/10/2019 Android Cookbook

    39/63

    59Captulo 1 Primeiros passos

    O SDK Manager no pode se atualizar. Durante a instalao da atualizao do SDK podehaver um erro relacionado ao programa SDK Manager (veja a gura 1.33).

    Figura 1.33 Janela de log do SDK Manager do Android.

    Para solucionar esse erro, certique-se de que todos os programas esto fechados(inclusive oadb.exe). Depois copie oSDK Manager.exe de C:\Arquivos de Programas\ Android\android-sdk\tools\lib para C:\Arquivos de Programas\Android\android-sdk (ouonde quer que o SDK esteja instalado). Ento execute novamente o SDK Manager(veja a gura 1.32).

    Atualizao do Eclipse. Depois que voc atualizar o SDK e abrir o Eclipse, uma mensagemde erro pode aparecer (veja a gura 1.34).

    Figura 1.34 Verso incorreta do SDK do Android.

    No Eclipse, selecioneHelp e entoCheck for Updates. Espere at que o dilogo de progressotermine e as atualizaes do Android Eclipse sejam mostradas. Clique emNext duasvezes, e aceite os termos de licena. Ento, clique emFinish para comear o processode download e atualizao. Uma mensagem de aviso sobre contedo no assinadopode aparecer. Clique emOK para aceitar o aviso (faa isso apenas se voc estiveratualizando via Eclipse). Reinicie o Eclipse assim que a atualizao estiver concluda(uma mensagem para isso vai aparecer).

    Mais informaes sobre a resoluo de problemas do SDK Manager e do plugin doEclipse para Android esto disponveis no site Android Developers.

  • 8/10/2019 Android Cookbook

    40/63

    Android Cookbook60

    Veja tambmReceita 1.5; Instalao do SDK; Incluso de componentes SDK; Plugin ADT paraEclipse

    1.13 Captura de tela do emulador/dispositivo AndroidRachee Singh

    ProblemaVoc deseja obter uma captura de tela de um aplicativo executado em um dispositivoAndroid.

    SoluoUtilize a funcionalidade Device Screen Capture da viso DDMS (Dalvik DebugMonitor Server) no Eclipse.

    DiscussoPara utilizar a funcionalidade Device Screen Capture siga estes passos:

    1. Execute o aplicativo no Eclipse e v at a viso DDMS (Window menu->Open Pers-pective->Other->DDMS) ouWindow menu->Show View->Other->Android->Devices; a primeira mostrada na gura 1.36). Note que a linha que diz Resourcedoes not existaparece na gura 1.35 apenas porque outro projeto Eclipse foi fechado, e noafeta os passos listados aqui.

    Figura 1.35 Iniciando a viso DDMS.

  • 8/10/2019 Android Cookbook

    41/63

    61Captulo 1 Primeiros passos

    2. Na viso DDMS, selecione o dispositivo ou emulador cuja tela voc desejacapturar.

    3. Na viso DDMS, clique no cone Screen Capture (veja a gura 1-36).

    Figura 1.36 Captura de tela do dispositivo.

    4. Uma janela mostrando a tela atual do emulador/dispositivo Android sermostrada. Ela deve se parecer com a gura 1.37. Voc pode at salvar a capturade tela e utiliz-la para descrever o aplicativo!

    Figura 1.37 A captura de tela.

  • 8/10/2019 Android Cookbook

    42/63

    Android Cookbook62

    Veja tambmAlgumas distribuies fornecem modos alternativos de se obter capturas de tela.O CyanogenMod 7.x fornece uma captura de tela no menu que surge quando vocsegura pressionado o boto de ligar/desligar. Alguns tablets HTC com suporte acaneta oferecem capturas de tela no menu Pen. O Ice Cream Sandwich (Android 4.0)fornece um mecanismo integrado para captura de tela em dispositivos reais: bastapressionar o controle de diminuio de volume ao mesmo tempo em que o botode ligar/desligar e a imagem sero salvos em seu dispositivo e poder ser visualizadano aplicativo de galeria.

    1.14 Programa: um simples exemplo de CountDownTimerWagied Davids

    ProblemaVoc deseja um simples timer regressivo, um programa que far uma contagem re-gressiva a partir de um determinado nmero de segundos at atingir zero.

    SoluoO Android vem com uma classe integrada para construo deCountDownTimers. Ela

    fcil de utilizar, eciente e funciona (isso nem precisa dizer!).

    DiscussoOs passos para fornecer um timer regressivo so estes:

    1. Crie uma subclasse deCountDownTimer. O construtor dessa classe recebe doisargumentos,CountDownTimer(long millisInFuture, long countDownInterval) . O primei-ro o nmero de milissegundos, contados a partir de agora, determinandoquando o intervalo deve estar concludo; nesse ponto o mtodoonFinish()

    da subclasse ser chamado. O segundo a frequncia em milissegundos daregularidade em que voc deseja ser noticado de que o timer ainda est emexecuo, normalmente para atualizar um monitor de progresso ou comunicaro usurio de outra forma. O mtodoonTick() de sua subclasse ser chamado acada passagem desse nmero de milissegundos.

    2. Substitua os mtodosonTick() e onFinish() .3. Instancie uma nova instncia em sua atividade Android.4. Chame o mtodostart() na nova instncia criada!

  • 8/10/2019 Android Cookbook

    43/63

    63Captulo 1 Primeiros passos

    O programa de exemplo de timer regressivo consiste em um layout XML (que podeser visto no exemplo 1.4) e um pouco de cdigo Java (exemplo 1.5). Quando executa-do, ele deve se parecer mais ou menos com a gura 1.38, ainda que os tempos sejamprovavelmente diferentes.

    Exemplo 1.4 main.xml

    Exemplo 1.5 Main.javapackage com.examples;

    import android.app.Activity;import android.os.Bundle;

  • 8/10/2019 Android Cookbook

    44/63

    Android Cookbook64

    import android.os.CountDownTimer;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;

    public class Main extends Activity implements OnClickListener { private MalibuCountDownTimer countDownTimer; private long timeElapsed; private boolean timerHasStarted = false; private Button startB; private TextView text; private TextView timeElapsedView; private nal long startTime = 50 * 1000; private nal long interval = 1 * 1000;

    /** Chamado quando a atividade criada pela primeira vez */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startB = (Button) this. ndViewById(R.id.button); startB.setOnClickListener(this);

    text = (TextView) this. ndViewById(R.id.timer); timeElapsedView = (TextView) this. ndViewById(R.id.timeElapsed); countDownTimer = new MalibuCountDownTimer(startTime, interval); text.setText(text.getText() + String.valueOf(startTime)); } @Override public void onClick(View v) { if (!timerHasStarted)

    { countDownTimer.start(); timerHasStarted = true; startB.setText("Start"); } else { countDownTimer.cancel(); timerHasStarted = false; startB.setText("RESET");

    } }

  • 8/10/2019 Android Cookbook

    45/63

    65Captulo 1 Primeiros passos

    // Classe CountDownTimer public class MalibuCountDownTimer extends CountDownTimer { public MalibuCountDownTimer(long startTime, long interval) {

    super(startTime, interval); } @Override public void onFinish() { text.setText("Time's up!"); timeElapsedView.setText("Time Elapsed: " + String.valueOf(startTime)); } @Override public void onTick(long millisUntilFinished) { text.setText("Time remain:" + millisUntilFinished); timeElapsed = startTime - millisUntilFinished; timeElapsedView.setText("Time Elapsed: " + String.valueOf(timeElapsed)); } } }

    Figura 1.38 Reset do timer.

  • 8/10/2019 Android Cookbook

    46/63

    Android Cookbook66

    URL de download do cdigo-fonteO cdigo-fonte para esse exemplo est no repositrio do Android Cookbook,em http://github.com/AndroidCook/Android-Cookbook-Examples , no subdiretrioCountDownTimerExample (veja Obteno e uso de exemplos de cdigo na pgina 20).

    1.15 Programa: Tipster, um calculador de gorjetas para o Android OSSunit Katkar

    ProblemaQuando voc vai com amigos a um restaurante e deseja dividir a conta e a gorjeta,pode se envolver em muitos clculos manuais e controvrsias. Em vez disso, voc

    deseja utilizar um aplicativo que permita que voc simplesmente some o percentualda gorjeta ao total e divida o valor pelo nmero de presentes. O Tipster uma imple-mentao disso no Android, para mostrar um aplicativo completo.

    SoluoEste um exerccio simples que utiliza os elementos bsicos da GUI ( graphical userinterface, ou interface grca de usurio), combinando-os a alguns clculos simplese a um cdigo de UI (user interface , ou interface de usurio) orientada a eventos para

    reunir todos os elementos. Ns utilizaremos os seguintes componentes de GUI:TableLayout

    Fornece controle adequado sobre o layout da tela. Esse layout permite que vocutilize o paradigma da tag HTMLTable para posicionar os widgets.

    TableRow

    Dene uma linha noTableLayout . como as tags HTMLTR e TD combinadas.

    TextView

    EssaView fornece um rtulo para apresentao de texto esttico na tela.

    EditText

    EssaView fornece um campo de texto para entrada de valores.

    RadioGroup

    Agrupa botes de opo.

    RadioButtonFornece um boto de opo.

  • 8/10/2019 Android Cookbook

    47/63

    67Captulo 1 Primeiros passos

    Button

    Esse o boto normal.

    View

    Ns utilizaremos umaView para criar um separador visual com certos atributosde altura e cor.

    DiscussoO Android utiliza arquivos XML para o layout de widgets. Em nosso projeto deexemplo, o plugin do Android para Eclipse gera um arquivomain.xml para o layout.Esse arquivo tem as denies XML dos vrios widgets e de seus contineres.

    H um arquivostrings.xml que tem todos os recursos de strings utilizados no aplicativo.

    Um arquivoicon.png padro fornecido para o cone do aplicativo.E h tambm o arquivoR.java que gerado automaticamente (e atualizado quandoquaisquer alteraes so feitas aomain.xml). Esse arquivo tem as constantes denidaspara cada layout e widget. No edite esse arquivo manualmente; o plugin far issopara voc ao efetuar qualquer modicao em seus arquivos XML.

    Em nosso exemplo temosTipster.java como o arquivo Java principal para aActivity .

    A receita 1.4, assim como diversos tutoriais do Google, mostra como utilizar o plugin.

    Utilizando o plugin do Eclipse, crie um projeto Android chamado Tipster. O resultadonal ser um layout de projeto que se parecer com o da gura 1.39.

    Criao do layout e posicionamento dos widgets

    O objetivo nal criar um layout semelhante quele mostrado na gura 1.39.

    Para o layout dessa tela voc vai utilizar estes layouts e widgets:

    TableLayout

    Fornece controle adequado sobre o layout da tela. Esse layout permite que vocutilize o paradigma da tag HTMLTable para posicionar os widgets.

    TableRow

    Dene uma linha noTableLayout . como as tags HTMLTR e TD combinadas.

    TextView

    EssaView fornece um rtulo para apresentao de texto esttico na tela.

    EditText

    EssaView fornece um campo de texto para entrada de valores.

  • 8/10/2019 Android Cookbook

    48/63

    Android Cookbook68

    RadioGroup

    Agrupa botes de opo.

    RadioButton

    Fornece um boto de opo.Button

    Esse o boto normal.

    View

    Ns utilizaremos umaView para criar um separador visual com certos atributosde altura e cor.

    Familiarize-se com esses widgets j que voc vai utiliz-los bastante nos aplicativos queconstruir. Ao vericar os Javadocs relacionados a layouts e widgets, d uma olhadanos atributos XML. Isso vai ajud-lo a correlacionar o uso no arquivo de layoutmain. xml e o cdigo Java (Tipster.java e R.java) onde eles so acessados.

    Tambm est disponvel um editor visual de layout no ADT do Eclipse, bem comouma ferramenta independente de UI chamada DroidDraw, ambas as quais permitemque voc crie um layout arrastando e soltando widgets a partir de uma paleta, comoqualquer ferramenta de design de formulrios. No entanto, recomendo que voc crie olayout mo em XML, pelo menos nos estgios iniciais de seu aprendizado Android.Futuramente, medida que aprender todas as nuances da API de layout XML, vocpoder delegar essa tarefa a tais ferramentas.

    O arquivo de layout,main.xml , tem as informaes de layout (veja o exemplo 1.6). UmwidgetTableRow cria uma nica linha dentro doTableLayout . Por isso voc utiliza tantasTableRows quanto for o nmero de linhas que deseja. Neste tutorial, vamos utilizar oitoTableRows cinco para os widgets at o separador visual abaixo dos botes, e trs paraa rea de resultados abaixo dos botes e do separador.

    Exemplo 1.6 /res/layout/main.xml

  • 8/10/2019 Android Cookbook

    49/63

    69Captulo 1 Primeiros passos

    por duas colunas. Assim, um total de 4 colunas nesta linha -->

  • 8/10/2019 Android Cookbook

    50/63

    Android Cookbook70

    text eld para entrada de um percentual personalizado de gorjeta -->

  • 8/10/2019 Android Cookbook

    51/63

    71Captulo 1 Primeiros passos

    android:text="@string/btnCalculate"/>

  • 8/10/2019 Android Cookbook

    52/63

    Android Cookbook72

    android:layout_column="0" android:text="@string/textLbl6"/>

    TableLayout e TableRow

    Depois de analisarmain.xml , voc pode perceber queTableLayout eTableRow so simplesde usar. Voc cria oTableLayout uma vez, e ento insere umaTableRow. Agora voc estlivre para inserir quaisquer outros widgets, comoTextView, EditView e assim por diante,dentro dessaTableRow.

    No deixe de dar uma olhada nos atributos, especialmente emandroid:stretchColumns ,android:layout_column eandroid:layout_span , os quais permitem que voc posicione widgetsda mesma forma que voc faria com uma tabela HTML comum. Recomendo que vocsiga os links para esses atributos e aprenda como eles funcionam em umTableLayout.

    Controle de valores de entradaD uma olhada no widgetEditText , marcado no arquivomain.xml como . Esse oprimeiro campo de texto para entrada do Valor total da conta. Queremos apenasnmeros aqui. Podemos aceitar nmeros decimais porque contas de restaurantesreais tambm podem ter valores em centavos, e no apenas nmeros inteiros. Por issoutilizamos o atributoandroid:numeric com um valor dedecimal . Isso permitir valoresde nmeros inteiros, como 10, e valores decimais, como 10.12, mas impedir qualqueroutro tipo de entrada.

    Essa uma forma simples e concisa de controlar valores de entrada, economizando-noso trabalho de escrever cdigo de validao no arquivoTipster.java , e garantindo queo usurio no digite valores errados. Essa funcionalidade do Android de limitaocom base em XML bastante poderosa e til. Voc deve explorar todos os atributospossveis que acompanham um widget especco para extrair o mximo de benef-cios desse modo XML abreviado de denir restries. Em um lanamento futuro, ano ser que eu no tenha visto isso nesta verso, eu espero que o Android permita aentrada de intervalos para o atributoandroid:numeric , de modo que voc possa denirqual intervalo de nmeros deseja aceitar.

  • 8/10/2019 Android Cookbook

    53/63

    73Captulo 1 Primeiros passos

    Como (at onde eu sei) intervalos atualmente no esto disponveis, voc ver futu-ramente que temos realmente de vericar a presena de certos valores, como zero ouvalores vazios, para garantir que as contas de nosso calculador de gorjeta no falhem.

    Anlise do Tipster.javaAgora vamos analisar o arquivoTipster.java que controla nosso aplicativo. Essa aclasse principal que cuida do layout, do tratamento de eventos e da lgica do aplicativo.

    O plugin do Eclipse para Android cria o arquivoTipster.java em nosso projeto como cdigo padro que pode ser visto no exemplo 1.7.

    Exemplo 1.7 Trecho de cdigo 1 de /src/com/examples/tipcalc/Tipster.javapackage com.examples.tipcalc;

    import android.app.Activity;

    public class Tipster extends Activity { /** Chamado quando a atividade criada pela primeira vez */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}

    A classeTipster estende a classeandroid.app.Activity . Uma atividade uma nica aoconcentrada que o usurio pode realizar. A classeActivity cuida de criar a janela edepois de apresentar a UI. Voc tem de chamar o mtodosetContentView(View view) paracolocar sua UI naActivity . Por isso, pense emActivity como uma moldura externaque est vazia, e que voc preenche com sua UI.

    Agora verique o trecho da classeTipster.java que pode ser visto no exemplo 1.8. Pri-meiro, denimos os widgets como membros de classe. Verique, mais especicamente,de a para referncia.

    Ento, utilizamos o mtodofndViewById(int id) para localizar os widgets. O ID de cadawidget, denido em seu arquivomain.xml , automaticamente denido no arquivoR.java quando voc limpa e compila o projeto no Eclipse. (Se voc congurou o Eclipsepara compilar automaticamente, o arquivoR.java ser atualizado instantaneamentequando voc atualizarmain.xml.)

    Cada widget derivado da classeView, e fornece funcionalidades GUI especiais. Assim,uma TextView fornece uma forma de colocar rtulos na UI, enquanto que oEditText fornece um campo de texto. Verique de a no exemplo 1.8. Voc pode ver comofndViewById() utilizado para localizar os widgets.

  • 8/10/2019 Android Cookbook

    54/63

    Android Cookbook74

    Exemplo 1.8 Trecho de cdigo 2 de /src/com/examples/tipcalc/Tipster.javapublic class Tipster extends Activity { // Widgets do aplicativo private EditText txtAmount;

    private EditText txtPeople; private EditText txtTipOther; private RadioGroup rdoGroupTips; private Button btnCalculate; private Button btnReset;

    private TextView txtTipAmount; private TextView txtTotalToPay; private TextView txtTipPerPerson;

    // Para o id do boto de opo selecionado private int radioCheckedId = -1;

    /** Chamado quando a atividade criada pela primeira vez */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

    // Acessa os vrios widgets por id em R.java txtAmount = (EditText) ndViewById(R.id.txtAmount); // No carregamento do aplicativo, o cursor deve estar no campo Amount

    txtAmount.requestFocus();

    txtPeople = (EditText) ndViewById(R.id.txtPeople); txtTipOther = (EditText) ndViewById(R.id.txtTipOther);

    rdoGroupTips = (RadioGroup) ndViewById(R.id.RadioGroupTips);

    btnCalculate = (Button) ndViewById(R.id.btnCalculate); // No carregamento do aplicativo, o boto Calculate est desabilitado btnCalculate.setEnabled(false);

    btnReset = (Button) ndViewById(R.id.btnReset);

    txtTipAmount = (TextView) ndViewById(R.id.txtTipAmount); txtTotalToPay = (TextView) ndViewById(R.id.txtTotalToPay); txtTipPerPerson = (TextView) ndViewById(R.id.txtTipPerPerson);

    // No carregamento do aplicativo, desabilite o campo de texto Other Tip PercentagetxtTipOther.setEnabled(false);

    Lidando com consideraes de facilidade de uso ou usabilidade

    Nosso aplicativo deve tentar ser to utilizvel quanto qualquer outro aplicativo oupgina web consolidado. Em resumo, incluir recursos de usabilidade resultar em

    uma boa experincia de usurio. Para lidar com essas consideraes, d uma olhadano exemplo 1.8 novamente.

  • 8/10/2019 Android Cookbook

    55/63

    75Captulo 1 Primeiros passos

    Veja , onde utilizamos o mtodorequestFocus() da classeView. Como o widgetEditText derivado da classeView, esse mtodo aplicvel a ele. Isso feito para que, quandonosso aplicativo carregar, o campo de textoTotal Amount receba foco e o cursor seja po-sicionado nele. Isso semelhante tela de login de aplicativos web populares onde

    o cursor est presente no campo de texto do nome do usurio.Agora verifique , onde o boto Calculate desabilitado chamando o mtodosetEnabled(boolean enabled) no widgetButton. Isso feito para que o usurio no possaclicar nele antes de digitar valores nos campos obrigatrios. Se permitssemos queo usurio clicasse emCalculate sem digitar valores nos camposTotal Amount e No. of People,teramos de escrever um cdigo de validao para capturar essas condies. Isso signi-caria mostrar um alerta em popup avisando o usurio dos valores vazios. Algo dessetipo adicionaria cdigo e interao de usurio desnecessrios. Quando o usurio v

    o botoCalculate

    desabilitado, ca bastante bvio que, a no ser que todos os valoressejam digitados, a gorjeta no poder ser calculada.

    Verique no exemplo 1.8. Aqui o campo de textoOther Tip Percentage est desabilitado.Isso feito porque o boto de opo 15% tip selecionado por padro quando oaplicativo carrega. Essa seleo padro no carregamento do aplicativo feita por meiodo arquivomain.xml . D uma olhada na linha demain.xml onde a instruo a seguirseleciona o boto de opo 15% tip:

    android:checkedButton="@+id/radioFifteen"

    O atributoandroid:checkedButton deRadioGroup permite que voc selecione um dos widgetsRadioButton no grupo por padro.

    A maioria dos usurios que j utilizou aplicativos populares no desktop ou na webest familiarizada com o paradigma widgets desabilitados que so habilitados emcertas condies. Incluir essas pequenas convenincias sempre torna um aplicativomais utilizvel e a experincia do usurio mais rica.

    Processamento de eventos da UI

    Semelhante aos populares frameworks de UI do Windows, Java Swing, Flex e outros, oAndroid tambm fornece um modelo de eventos que permite a voc escutar determi-nados eventos na UI provocados pela interao do usurio. Vejamos como podemosutilizar o modelo de eventos do Android em nosso aplicativo.

    Primeiro, vamos nos concentrar nos botes de opo da UI. Queremos saber qualboto de opo o usurio selecionou, uma vez que isso nos permitir determinar opercentual de gorjeta em nossos clculos. Para escutar botes de opo, utilizamosa interface estticaOnCheckedChangeListener(). Isso vai nos noticar quando o estado de

    seleo de um boto de opo mudar.

  • 8/10/2019 Android Cookbook

    56/63

    Android Cookbook76

    Em nosso aplicativo, queremos habilitar o campo de textoOther Tip Percentage apenasquando o boto de opoOther estiver selecionado. Quando os botes 15% tip e20% tip estiverem selecionados, ns queremos desabilitar esse campo de texto. Almdisso, queremos incluir um pouco mais de lgica em nome da usabilidade. Como

    discutimos antes, no devemos habilitar o botoCalculate at que todos os camposobrigatrios tenham valores vlidos. Em termos dos trs botes de opo, queremosgarantir que o botoCalculate esteja habilitado para as duas condies a seguir:

    O boto de opo Other est selecionado e o campo de textoOther Tip Percentage tem valores vlidos.

    Os botes de opo 15% tip ou 20% tip esto selecionados e os campos detexto Total Amount e No. of People tm valores vlidos.

    Veja o exemplo 1.9, o qual lida com os botes de opo. Os comentrios do cdigo--fonte so bastante autoexplicativos.

    Exemplo 1.9 Trecho de cdigo 3 de /src/com/examples/tipcalc/Tipster.java/** Anexa um OnCheckedChangeListener ao grupo de opo* para monitorar botes de opo selecionados pelo usurio*/rdoGroupTips.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) { // Habilita/desabilita o campo Other Tip Percentage

    if (checkedId == R.id.radioFifteen || checkedId == R.id.radioTwenty) { txtTipOther.setEnabled(false); /* * Habilita o boto Calculate se os campos Total

    * Amount e No. of People tiverem valores vlidos */ btnCalculate.setEnabled(txtAmount.getText().length() > 0 && txtPeople.getText().length() > 0); } if (checkedId == R.id.radioOther) { // Habilita o campo Other Tip Percentage

    txtTipOther.setEnabled(true); // de ne o foco para este campo txtTipOther.requestFocus(); /* * Habilita o boto Calculate se os campos Total Amount e No. of People tiverem

    * valores vlidos. Tambm assegura que o usurio digitou um valor em Other Tip

    * Percentage antes de habilitar o boto Calculate */

  • 8/10/2019 Android Cookbook

    57/63

    77Captulo 1 Primeiros passos

    btnCalculate.setEnabled(txtAmount.getText().length() > 0 && txtPeople.getText().length() > 0 && txtTipOther.getText().length() > 0); } // Para determinar a escolha do percentual de gorjeta feita pelo usurio

    radioCheckedId = checkedId; }});

    Monitorando atividade de teclas em campos de texto

    Como mencionei antes, o botoCalculate no deve ser habilitado a no ser que oscampos de texto tenham valores vlidos. Ento temos de garantir que o botoCalculate seja habilitado apenas se os campos de textoTotal Amount, No. of People e Other Tip Percentage tiverem valores vlidos. O campo de textoOther Tip Percentage ser habilitado apenas seo boto de opoOther Tip Percentage for selecionado.

    No temos de nos preocupar com o tipo dos valores, ou seja, se o usurio digitouou no nmeros negativos ou letras, pois o atributoandroid:numeric foi denido paraos campos de texto, limitando, dessa forma, os tipos de valores que o usurio podedigitar. Temos apenas de garantir que os valores estejam presentes.

    Ento utilizamos a interface estticaOnKeyListener() . Ela vai nos noticar quando umatecla for pressionada. A noticao chegar at ns antes de a tecla pressionada em si

    ser enviada para o widgetEditText .Verique o cdigo nos exemplos 1.10 e 1.11, que lidam com eventos de teclas emcampos de texto. Assim como no exemplo 1.9, os comentrios do cdigo-fonte sobastante autoexplicativos.

    Exemplo 1.10 Trecho de cdigo 4 de /src/com/examples/tipcalc/Tipster.java/** Anexa um KeyListener aos campos de texto Tip Amount, No. of People* e Other Tip Percentage*/txtAmount.setOnKeyListener(mKeyListener);txtPeople.setOnKeyListener(mKeyListener);txtTipOther.setOnKeyListener(mKeyListener);

    Note que criamos apenas um ouvinte, em vez de criar ouvintes annimos/internospara cada campo de texto. No tenho certeza se meu estilo melhor ou recomendado,mas sempre escrevo dessa forma se os ouvintes vo realizar aes habituais. Aqui, apreocupao comum a todos os campos de texto que eles no devem estar vazios,

    e apenas quando tiverem valores que o botoCalculate deve ser habilitado.

  • 8/10/2019 Android Cookbook

    58/63

    Android Cookbook78

    Exemplo 1.11 Trecho de cdigo 5 de KeyListener.java/** KeyListener para os campos de texto Total Amount, No of People e Other Tip* Percentage. Precisamos aplicar esse ouvinte de teclas para veri car estas condies:

    ** 1) Se o usurio selecionar Other Tip Percentage, o campo de texto Other Tip Percentage* deve ter um percentual de gorjeta vlido inserido pelo usurio. Habilite o* boto Calculate apenas quando o usurio digitar um valor vlido.** 2) Se o usurio no digitar valores nos campos Total Amount e No. of People,* no poderemos realizar os clculos. Assim, habilitaremos o boto Calculate* apenas quando o usurio digitar valores vlidos.*/private OnKeyListener mKeyListener = new OnKeyListener() {

    @Override public boolean onKey(View v, int keyCode, KeyEvent event) {

    switch (v.getId()) { case R.id.txtAmount: case R.id.txtPeople: btnCalculate.setEnabled(txtAmount.getText().length() > 0 && txtPeople.getText().length() > 0); break; case R.id.txtTipOther: btnCalculate.setEnabled(txtAmount.getText().length() > 0 && txtPeople.getText().length() > 0 && txtTipOther.getText().length() > 0); break; } return false; }};

    Em no exemplo 1.11, analisamos o ID daView. Lembre-se de que cada widget temum ID nico denido no arquivomain.xml . Esses valores so, ento, denidos naclasseR.java gerada.Em e , se o evento-chave ocorreu nos camposTotal Amount ouNo. of People, vericamoso valor digitado no campo. Estamos garantindo que o usurio no tenha deixadoambos os campos em branco.

    Em , vericamos se o usurio selecionou o boto de opoOther, e ento garantimosque o campo de textoOther no esteja vazio. Tambm vericamos mais uma vez se oscamposTotal Amount e No. of People esto vazios.

    Assim, o propsito de nossoKeyListener agora est claro: garantir que todos os camposde texto no estejam vazios, e apenas ento habilitar o botoCalculate.

  • 8/10/2019 Android Cookbook

    59/63

    79Captulo 1 Primeiros passos

    Escutando cliques em botes

    Agora vamos vericar os botesCalculate e Reset. Quando o usurio clicar nesses bo-tes, utilizaremos a interface estticaOnClickListener() que nos informar quando umboto for clicado.

    Como zemos com os campos de texto, criamos apenas um ouvinte e, dentro dele,detectamos qual boto foi clicado. Dependendo do boto que foi clicado, o mtodocalculate() ou reset() ser chamado.

    O exemplo 1.12 mostra como o ouvinte de cliques adicionado aos botes.

    Exemplo 1.12 Trecho de cdigo 6 de /src/com/examples/tipcalc/Tipster.java/* Anexa um ouvinte aos botes Calculate e Reset */btnCalculate.setOnClickListener(mClickListener);btnReset.setOnClickListener(mClickListener);

    O exemplo 1.13 mostra como detectar qual boto foi clicado vericando o ID daView que recebe o evento de clique.

    Exemplo 1.13 Trecho de cdigo 7 de /src/com/examples/tipcalc/Tipster.java/*** ClickListener para os botes Calculate e Reset.* Dependendo do boto clicado, o mtodo correspondente ser chamado.

    */private OnClickListener mClickListener = new OnClickListener() {

    @Override public void onClick(View v) { if (v.getId() == R.id.btnCalculate) { calculate(); } else { reset(); }

    }};

    Reset do aplicativo

    Quando o usurio clicar no botoReset, os campos de texto devero ser limpos, oboto de opo-padro 15% tip dever ser selecionado, e quaisquer resultadoscalculados devero ser limpos.

    O exemplo 1.14 mostra o mtodoreset() .

  • 8/10/2019 Android Cookbook

    60/63

    Android Cookbook80

    Exemplo 1.14 Trecho de cdigo 8 de /src/com/examples/tipcalc/Tipster.java/*** Faz o reset das vises de texto dos resultados na parte inferior da tela,* assim como dos campos de texto e dos botes de opo.

    */private void reset() { txtTipAmount.setText(""); txtTotalToPay.setText(""); txtTipPerPerson.setText(""); txtAmount.setText(""); txtPeople.setText(""); txtTipOther.setText(""); rdoGroupTips.clearCheck(); rdoGroupTips.check(R.id.radioFifteen);

    // de ne o foco no primeiro campo txtAmount.requestFocus();}

    Validao da entrada para calcular a gorjeta

    Como eu disse antes, estamos limitando o tipo de valor que o usurio pode digitarnos campos de texto. No entanto, o usurio ainda pode digitar um valor de zero noscampos de texto Total Amount, No. of People e Other Tip Percentage, provocando, dessa forma,condies de erro, como diviso por zero, em nossos clculos de gorjetas.

    Se o usurio digitar zero, devemos mostrar um popup de alerta pedindo que digiteum valor diferente de zero. Lidaremos com isso utilizando um mtodo chamadoshowErrorAlert(String errorMessage, fnal int feldId) , mas discutiremos isso mais deta-lhadamente no futuro.

    Primeiro, verique o exemplo 1.15, o qual mostra o mtodocalculate() . Note como osvalores digitados pelo usurio so processados como valores do tipoDouble.

    Agora perceba e , onde vericamos a presena de valores iguais a zero. Se o usurio

    digitar zero, mostraremos um popup de alerta para avis-lo. Depois, verique , ondeo campo de textoOther Tip Percentage habilitado porque o usurio selecionou o botode opoOther. Aqui tambm devemos vericar se o percentual de gorjeta no zero.

    Quando o aplicativo carregar, o boto de opo 15% tip ser selecionado por padro.Se o usurio modicar a seleo, atribuiremos o ID do boto de opo selecionado varivel membroradioCheckedId , como vimos no exemplo 1.9, emOnCheckedChangeListener.

    Mas se o usurio aceitar a seleo padro, oradioCheckedId ter o valor padro de1.Em resumo, nunca saberemos qual boto de opo foi selecionado. Ns sabemos,

    claro, qual est selecionado por padro, e poderamos ter codicado a lgica de modo

  • 8/10/2019 Android Cookbook

    61/63

    81Captulo 1 Primeiros passos

    levemente diferente, para presumir 15% seradioCheckedId tiver o valor de1. Mas sevoc consultar a API, ver que podemos chamar o mtodogetCheckedRadioButtonId() noRadioGroup e no em botes individuais de opo. Isso ocorre porqueOnCheckedChangeListener nos fornece prontamente o ID do boto de opo selecionado.

    Apresentao dos resultados

    Calcular a gorjeta simples. Se no houver nenhum erro de validao, a ag boole-ana isError ser false . Verique de a no exemplo 1.15 para observar os clculossimples da gorjeta. Na sequncia, os valores calculados sero denidos nos widgetsTextView de a .

    Exemplo 1.15 Trecho de cdigo 9 de /src/com/examples/tipcalc/Tipster.java

    /*** Calcule a gorjeta de acordo com os dados digitados pelo usurio*/private void calculate() { Double billAmount = Double.parseDouble(txtAmount.getText().toString()); Double totalPeople = Double.parseDouble(txtPeople.getText().toString()); Double percentage = null; boolean isError = false; if (billAmount < 1.0) { showErrorAlert("Enter a valid Total Amount.", txtAmount.getId());

    isError = true; } if (totalPeople < 1.0) { showErrorAlert("Enter a valid value for No. of People.", txtPeople.getId()); isError = true; }

    /* * Se o usurio nunca modi car sua seleo de opo,

    * signi ca que a seleo padro de 15% est em efeito. Mas mais seguro veri car

    */ if (radioCheckedId == -1) { radioCheckedId = rdoGroupTips.getCheckedRadioButtonId(); } if (radioCheckedId == R.id.radioFifteen) { percentage = 15.00; } else if (radioCheckedId == R.id.radioTwenty) { percentage = 20.00; } else if (radioCheckedId == R.id.radioOther) { percentage = Double.parseDouble(

    txtTipOther.getText().toString()); if (percentage < 1.0) {

  • 8/10/2019 Android Cookbook

    62/63

    Android Cookbook82

    showErrorAlert("Enter a valid Tip percentage", txtTipOther.getId()); isError = true; } } /*

    * Se todos os campos estiverem preenchidos com valores vlidos, prossiga* para o clculo das gorjetas

    */ if (!isError) { Double tipAmount = ((billAmount * percentage) / 100); Double totalToPay = billAmount + tipAmount; Double perPersonPays = totalToPay / totalPeople;

    txtTipAmount.setText(tipAmount.toString()); txtTotalToPay.setText(totalToPay.toString()); txtTipPerPerson.setText(perPersonPays.toString()); }}

    Apresentao dos alertas

    O Android fornece a classeAlertDialog para mostrar popups de alerta. Isso nos permitemostrar uma caixa de dilogo com at trs botes e uma mensagem.

    O exemplo 1.16 mostra o mtodoshowErrorAlert , o qual utiliza esseAlertDialog para mostraras mensagens de erro. Perceba que informamos dois argumentos a esse mtodo:Stringerror Message e int feldId . O primeiro argumento a mensagem de erro que queremosmostrar ao usurio. OfeldId o ID do campo que causou a condio de erro. Depoisque o usurio dispensar o dilogo de alerta, essefeldId nos permitir solicitar o focopara esse campo, de modo que o usurio saiba qual campo contm o erro.

    Exemplo 1.16 Trecho de cdigo 10 de /src/com/examples/tipcalc/Tipster.java/*** Mostra a mensagem de erro no dilogo de alerta

    ** @param errorMessage* String a ser mostrada pela mensagem de erro* @param eldId* o Id do campo que provocou o erro. Isso necessrio para que o foco possa ser de nido* nesse campo assim que o dilogo for dispensado.*/private void showErrorAlert(String errorMessage,

    nal int eldId) { new AlertDialog.Builder(this).setTitle("Error")

    .setMessage(errorMessage).setNeutralButton("Close", new DialogInterface.OnClickListener() {

  • 8/10/2019 Android Cookbook

    63/63

    83Captulo 1 Primeiros passos

    @Override public void onClick(DialogInterface dialog,

    int which) { ndViewById( eldId).requestFocus(); }

    }).show();}

    Quando reunimos tudo isso, o resultado deve car como a gura 1.39.

    Figura 1.39 Tipster em ao.

    Concluso

    O desenvolvimento para o OS Android no to diferente do desenvolvimento paraqualquer kit de ferramentas de UI, incluindo Microsoft Windows, X Windows, JavaSwing ou Adobe Flex. O Android tem, claro, suas diferenas e, em geral, um designmuito bom. O paradigma de layout em XML muito interessante e til para criaode UIs complexas utilizando XML simples. Alm disso, o modelo de tratamento deeventos simples, rico em funcionalidades e intuitivo de se utilizar no cdigo.

    URL de download do cdigo-fonteVoc pode efetuar o download do cdigo-fonte para esse exemplo emhttp://www.