You are on page 1of 70

Apostila de Android

Documento de auxilio

Rafael do Nascimento Junior 10/08/2011

Android Apostila Bsica

Sumario.................................................................................................................................................... 3 Lio 1: Desenvolvimento para Android ................................................................................................. 4 Lio 2: Ambiente de desenvolvimento .................................................................................................. 9 Lio 3: Obtendo e analisando um projeto pronto ............................................................................... 13 Lio 4: Criando sua primeira aplicao Android .................................................................................. 19 Lio 5: Layout e interface com usurio ................................................................................................ 25 Lio 6: Internacionalizao e localizao ............................................................................................. 37 Lio 7: menus e estilos ......................................................................................................................... 43 Lio 8: Temas e imagens ...................................................................................................................... 49 Lio 9: Listas ......................................................................................................................................... 54 Lio 10: Context menu e instalao de aplicaes .............................................................................. 59

A plataforma Android baseada em sistema operacional Linux, adaptada para funcionamento em dispositivos mveis, como: smart phones, PDAs e Tablets. Para o desenvolvimento de aplicativos, foi disponibilizada uma mquina virtual, especialmente otimizada para uso em dispositivos mveis, alm de um ambiente de programao completo, com componentes visuais, de acesso a dados e redes. Interessante notar que a mquina virtual Dalvik um projeto Open Source (http://code.google.com/p/dalvik/), e NO UMA MQUINA VIRTUAL JAVA ! Isso http://code.google.com/p/dalvik/), http://code.google.com/p/dalvik/ mesmo: DALVIK NO JAVA! Existe uma aplicao, chamada dx , que pode converter o bytecode compilado a partir da mquina virtual Java (especificao da Oracle), no bytecode da Dalvik. A Google disponibilizou um ambiente de programao baseado em Java , que permite o desenvolvimento de aplicaes para a plataforma Android. Ele possui emuladores de desenvolvimento dispositivos Android e conversores de bytecode. Segundo pesquisa da empresa Canalys , no quatro trimestre de 2010, quase 33 milhes de smartphones equipados com o sistema Android foram entregues, comparado com 31 milhes equipados com o sistema Symbian, da Nokia. Arquitetura do ambiente Android

A arquitetura do ambiente de desenvolvimento Android dividida em camadas. Sua aplicao desenvolvimento roda na camada superior, por exemplo: contatos, telefone, jogos, calendrio, seu programa etc. Abaixo desta camada, vem um framework de componentes, que formam uma API de gerenciamento e servios para uso das aplicaes. para Abaixo da camada de framework, temos as bibliotecas de servios, como OpenGL e SQLite SQLite, e as bibliotecas principais do ambiente, alm da prpria mquina virtual Dalvik.

Finalmente, abaixo de tudo, temos o Kernel Linux. Embora seja possvel, devido a grande diversidade de dispositivos, no recomendado seja programar aplicaes em C/C++. O ambiente de programao Android fornece tudo o que voc necessita para criar aplicaes sinistras! Voc no precisa programar em C/C++ ou usar chamadas ao Kernel. chamadas Tudo o que necessita para criar aplicaes Android, do SDK e de um ambiente de programao Java. Cada aplicao Android executada por uma instncla da mquina virtual Dalvik, rodando em um processo separado dentro do sistema operacion operacional. Componentes Uma aplicao Android um conjunto de componentes, que podem ser: Activities atividades ou telas; Services servios em background; Content Providers disponibilizam dados; Broadcast Receivers respondem a avisos gerais do sistema; Uma aplicao Android orientada a eventos. Um evento um sinal, que pode ter sido originado pelo usurio (um toque) ou no (o timer, o bloqueio de tela etc). Logo, uma aplicao dividida em diversos tipos de componentes (activities, services etc), que compartilham um nome de pacote (sim, muito importante) e de aplicao comum, por exemplo: br.com.thecodebakers.hpp.Hppfree br.com.thecodebakers.hpp.Hppfree Os tipos de componentes so declarados e implementados na camada framework , e voc os estende para criar seus componentes especficos. View e ViewGroups

Uma View um elemento de interface. Comparando com uma pgina HTML, seriam os

elementos de formulrio, como: botes, caixa de texto, radio buttons etc. botes, As Views podem gerar e receber Eventos, que podem ser interceptados no cdigo cdigo-fonte. As Views podem ser agrupadas em ViewGroups, que fornecem o layout de arrumao na tela. Existem Views fornecidas pelo framework, que j agregam a parte visual e algum tipo de framework, comportamento. So chamadas de Widgets . Se a sua aplicao possuir algum tipo de interface visual, o que o caso para a maioria delas, ento conter algumas Telas (activities), com Layouts (ViewGroups) e Views arrumadas nelas. atravs das Views que voc e o usurio se comunicam. Activity

Uma Activity uma tela onde o usurio pode fazer algo. Note que o relacionamento entre Activity e caso de uso no 1 para 1. Um caso de uso pode envolver vrias activities. Para criar uma Activity necessrio criar um arquivo de layout, que contm um ViewGroup e ViewGroup um ou mais ViewGroups ou Views internos, todos arrumados de acordo com a usabilidade da sua aplicao. Depois, necessrio criar a subclasse de Activity, que ser invocada quando o usurio solicitar. A parte de cdigo quem comanda o espetculo, usando a parte de layout. Todos os eventos gerados pelas Views do Layout, e pelos controles do aparelho (boto de menu , menu de contexto e boto back ) podero ser tratados no cdigo de sua activity. Uma activity pode iniciar outros componentes de sua aplicao, como: outras Activities, Services etc; Service http://developer.android.com/guide/topics/fundamentals/services.html

Um componente que executa operaes de longo prazo e em background; Podemos iniciar um service em outro componente. Ele continuar a executar mesmo que o usurio mude de aplicao. Outros componentes podem se conectar com o nosso service. Exemplos: I/O, servios de rede, de GPS, de alerta etc. Imagine uma aplicao de vendas. Os vendedores recebem atualizaes de Clientes e as acessam atravs da sua aplicao, O Download automtico de atualizaes poderia ser feito por um Service de sua aplicao. Um service, uma instncia de: android.app.Service, fica rodando em Background e pode executar tarefas longas, repetitivas ou a intervalos determinados. E tambm pode ser acessado por outras aplicaes. Um Media Player, por exemplo, utiliza um Service, que fica tocando a msica mesmo que a interface do media player seja fechada. Sua aplicao pode criar seus prprios Services ou usar Services fornecidos por outros. A criao de Services est fora do escopo deste curso, mas abordada em cursos mais avanados. Content Provider http://developer.android.com/guide/topics/providers/content-providers.html Amazenam e recuperam dados, disponibilizando-os para outras aplicaes. Exemplos: Contacts, Agenda etc. Voc tambm pode criar Content Providers para outras aplicaes; O Android vem com vrios Content Providers, como por exemplo as informaes de contato. Voc pode obter a lista de contatos do usurio (desde que autorizado por ele), acrescentar, remover etc. Voc no precisa criar um Content Provider para lidar com os dados de sua aplicao, mas, se quiser compartilh-los, ento ter que pensar nisto. Como as aplicaes Android so muito relacionadas com MashUps , bom pensar em compartilhar os dados de suas aplicaes, tornando-as mais populares. O desenvolvimento de content providers est fora do escopo deste curso. Broadcast Receiver http://developer.android.com/reference/android/content/BroadcastReceiver.html Classe que recebe alertas gerais do sistema. Podem ser gerados pelas activities ou no. Exemplo: SCREEN_OFF gerado pelo sistema quando a tela bloqueada. Voc pode tomar atitudes de acordo com o tipo de alerta recebido. Um Broadcast Receiver (derivado de: android.content.BroadcastReceiver) segue o padro GoF Observer . Ele se registra e fica observando se determinado evento geral acontece.

diferente da classe de uma Activity, que somente observa eventos gerados pelas suas Views. Este tipo de componente pode receber eventos gerados pelo cdigo de sua aplicao, de outras aplicaes ou mesmo do sistema Android. Quando a tela desligada, por exemplo, possvel tomar alguamas atitudes. Nosso projeto: Hercules Password Protector (http://code.google.com/p/hercules-password-protector) usa um Broadcast Receiver para fechar o cofre caso a tela tenha sido desligada.

Android APK Para ser executada e distribuda, sua aplicao Android tem que ser empacotada dentro de um distribuda, arquivo com formato e extenso apk (Android Package). Algumas coisas so muito importantes neste arquivo: O hashcode de todas as pastas calculado e colocado dentro do MANIFEST.MF , que fica dentro do META a META-INF; A pasta res contm todos os recursos no compilveis da aplicao, como: arquivos XML, Layouts, menus, imagens etc; Arquivo dex . Este contm todo o bytecode da sua aplicao, traduzido para bytecode Dalvik; Dalvik Arquivo arsc . Este contm os strings e uma tabela com todas as entradas do contm diretrio res , em formato binrio;

Antes de instalar um APK, voc deve assin lo digitalmente. Isto pode ser feito com um assin-lo certificado de assinatura de cdigo ou com uma chave auto assinada. auto-assinada. O processo de montagem manual de um APK bastante complexo e est fora do escopo deste processo curso. Veremos como criar APKs utilizando a IDE "eclipse". A APP dentro do Device Tudo acontece dentro do diretrio /data , em seu dispositivo Android. A figura mostra um shell de comandos conectado a um emulador Android. Veremos como administrar ell dispositivos mais adiante.

Dentro da pasta /data/dalvik cache , temos os arquivos .dex acessados, e dentro da pasta /data/dalvik-cache /data/app , temos os arquivos apk de cada aplicao que instalamos.

Android Market

Toda infra-estrutura para voc distribuir sua aplicao para o grande pblico. Pode ser gratuita ou paga. http://market.android.com. De acordo com pesquisas da loja de aplicativos GetJar , o mercado de aplicativos para dispositivos mveis, ou apps , deve crescer de 7 bilhes de downloads para cerca de 50 bilhes at 2012, tornando-se um mercado mais lucrativo que o de CD's. O crescimento da plataforma Android, cujo nmero de novos aparelhos superou a Symbian no terceiro trimestre de 2010, tornando-se a mais utilizada no mundo, apontado (juntamente com o iPad) como o fator impulsionador do mercado apps. Na plataforma Android, temos o site Android Market, que pode ser facilmente acessado pelos dispositivos mveis. Neste site possvel encontrar inmeros aplicativos, tanto gratuitos como pagos. E voc pode facilmente publicar suas aplicaes nele. Ns, The Code Bakers, temos algumas aplicaes publicadas no Android Market. Voc pode publicar suas aplicaes no Android Market. As nicas exigncias so: 1. Sua aplicao tem que estar assinada com uma chave criptogrfica privada, cuja validade termine depois de 22 de Outubro de 2033; 2. Sua aplicao tem que definir os atributos: android:versionCode e android:versionName no elemento <manifest>, de seu arquivo AndroidManifest.xml ; 3. Sua aplicao tem que definir os atributos: android:icon e android:label no elemento <application> do arquivo AndroidManifest.xml ; 4. Voc tem que fornecer um cone de alta resoluo (512 x 512 pixels) independentemente do cone de lanamento da aplicao; 5. Voc tem que fornecer o apk da sua aplicao; 6. Voc tem que fornecer pelo menos dois screen shots , de 320 x 480 pixels; 7. Voc tem que ter uma conta no Android Market, pagando US$ 25,00 pelo registro (uma nica vez);

Todo o processo de publicao feito pela Internet e no h nenhum tempo de aprovao, ou seja, publicou, valeu! Sua aplicao pode ser gratuita ou paga. Se for paga, ento h necessidades posteriores (fora do escopo deste curso). Ambiente de desenvolvimento Para desenvolver aplicaes Android, podemos utilizar a IDE "eclipse", acrescentando um "plug-in" chamado ADT, e o framework do Android (Android SDK). O desenvolvimento feito em Java e, quando compilado, transformado em bytecode Dalvik. No necessrio possuir um dispositivo Android! Voc pode desenvolver e executar em um "emulador", que permite emular vrios tamanhos de tela e caractersticas de dispositivos mveis.

Configurao do ambiente Baixar o eclipse (ltima verso), s com Java; Baixar o Android SDK SDK: o Windows: http://dl.google.com/android/android sdk_r10-windows.zip http://dl.google.com/android/android-sdk_r10 windows.zip o Mac: http://dl.google.com/android/android sdk_r10-mac_x86.zip http://dl.google.com/android/android-sdk_r10 mac_x86.zip o Linux: http://dl.google.com/android/android sdk_r10-linux_x86.t http://dl.google.com/android/android-sdk_r10 linux_x86.tgz Baixar o plug-in ADT: configurar eclipse update site: "https://dlplug : "https://dl ssl.google.com/android/eclipse/"; ssl.google.com/android/eclipse/ O SDK que voc est baixando apenas para configurar a instalao. Na segunda etapa, baixaremos atravs do eclipse as APIs necessrias. Descompacte o em qualquer diretrio e baixaremos Descompacte-o anote este como a raiz do SDK. Baixe o eclipse e, dentro dele, configure o site de download indicado. Isto feito em Help / Install New Software / Add Site . Selecione todos os arquivos e baixe. todos Selecione o menu: Window / Preferences e selecione Android , para indicar ao eclipse onde est instalado o SDK. Indique o diretrio clicando no boto Browse . Baixando as plataformas especficas O ambiente composto por vrios outros componentes: Plataformas, exemplos, APIs e vrios documentao. Para desenvolver, voc precisa uma plataforma, de modo a poder criar um AVD (Android Virtual Device), ou seja, um emulador. O mnimo necessrio : O SDK (voc j baixou e instalou); Platform (voc pode baixar pelo Android SDK and AVD Manager - menu: Window form / SDK and AVD Manager do eclipse); Platform-tools; tools;

Podemos instalar vrias plataformas e APIs, dependendo da verso do Android e da API que desejamos.

Ns sempre instalamos a API level 7, pois corresponde verso do Android dos nossos celulares. Voc no precisa instalar todos os SDKs. Veja quais so as verses de Android e os API levels:

Eclipse Neste curso, temos que assumir que voc j possua alguns conhecimentos bsicos: Java e eclipse. Por que eclipse? Por que no o NetBeans? Por que no fazer "na mo"? Bem, ns achamos que "eclipse" a IDE mais utilizada pelos desenvolvedores. um chute, mas baseado na nossa experincia como professores e como membros de vrias comunidades Open Source. Em segundo lugar, o plugin ADT foi desenvolvido para "eclipse". Voc pode fazer tudo "na mo", sem IDE alguma, mas vai ser muito mais difcil. Se voc no conhece "eclipse", existe farto material na Internet, inclusive este curso gratuito: https://www.buzzero.com/Feedib/curso-online-JAVA-ECLIPSE.html

ANDROID VERSION x API LEVEL Existem muitas verses do Android, assim como de sua API de programao. Isto muito importante! Voc deve baixar a plataforma (via SDK and AVD Manager) correspondente ao pblico-alvo que voc quer atingir. Atualmente, a maioria dos aparelhos que temos visto usa Android 2.2 (e 2.3 em segundo lugar). Voc pode estabelecer os requisitos para sua aplicao atravs de trs atributos de seu arquivo AndroidManifest.xml : android:minSdkVersion: Qual o menor nvel de API que sua aplicao suporta. O default 1 ; Se sua aplicao exige um determinado nvel de API, voc deve informar isto; android:targetSdkVersion: Qual o nvel de API que sua aplicao prefere executar. E,m alguns casos, permite que sejam usados elementos do nvel desejado, ao invs do nvel mnimo; android:maxSdkVersion: Qual o nvel mximo de SDK que sua aplicao suporta;

E voc deve desenvolver em uma plataforma (AVD) compatvel com o nvel de API que voc espera. Veja as verses do Android e o nvel de API de cada uma, at agora:

Code name (no code name)

Version 1.0

API level API level 1

Code name (no code name) Cupcake Donut Eclair Eclair Eclair Froyo Gingerbread Gingerbread Honeycomb Honeycomb

Version 1.1 1.5 1.6 2.0 2.0.1 2.2.x 2.3 - 2.3.2 2.3.3 - 2.3.4 3.0 3.1

API level API level 2 API level 3, NDK 1 API level 4, NDK 2 API level 5 API level 6 API level 8, NDK 4 API level 9, NDK 5 API level 10 API level 11 API level 12

2.1 (incl. 2.1-update 1) API level 7, NDK 3

Segundo nossas estatsticas, at agora (Junho 2011), as verses "Eclair" (2.1) e "Froyo" (2.2), so as mais utilizadas pelas pessoas que baixaram nossas aplicaes do Android Market.

Google Code e Subversion Ns mantemos todo o nosso cdigo-fonte dentro do "Google Code", que um repositrio de projetos Open Source. Ele fornece acesso a servidores de controle de verso (CVS, Subversion e Mercurial), que permitem aos usurios baixar e subir atualizaes. Ns optamos por utilizar sempre o Subversion, logo, para obter os projetos, necessrio que voc instale um novo plugin no "eclipse", chamado: "Subeclipse". A URL do update site : http://subclipse.tigris.org/update_1.6.x. Para instalar o plugin: 1. 2. 3. 4. 5. Clique no menu "Help / Install New Software..."; Clique no boto "Add..." para adicionar o update site; Informe a URL: "http://subclipse.tigris.org/update_1.6.x" e adicione; Feche a Janela e selecione o site recm-adicionado; Aps carregar, marque todos. Pode demorar um pouco. Certifique-se de aceitar a licena de uso;

Agora, voc pode fazer "checkout" de projetos armazenados no Servidor SVN (subversion). Para isto, veja qual a URL do servidor do projeto: 1. No site do Google Code do projeto, por exemplo, o BioMago, selecione a aba "Source"; 2. No conjunto de abas logo abaixo, deixe "Checkout" selecioando. Voc ver uma caixa com o ttulo: "Use this command to anonymously check out the latest project source code:", logo, anote a URL que est logo aps as palavras "svn checkout". No caso do BioMago, a URL : "http://biomago.googlecode.com/svn/trunk/";

Desta forma, voc ter a URL que deve ser informada ao configurar o "repositrio SVN" dentro do "eclipse". Se quiser saber mais sobre Controle de Verses e Subversion, recomendamos o site da quiser Wikipedia: http://pt.wikipedia.org/wiki/Subversion. http://pt.wikipedia.org/wiki/Subversion

Um projeto no eclipse Agora, sente se em posio de ltus, respire fundo e murmure: "Ohmmmmmm", ou seja, sente-se fundo relaxe e entre em meditao profunda, de modo a prestar ateno no que vamos dizer neste momento. Sabemos que voc est com pressa. Ns, tcnicos, sempre temos pressa em fazer tudo e no temos pacincia para ler manuais. Existe at um ditado famoso: "Quanto tudo mais falhar, leia manuais. o Manual!" Antes de voc fazer um projeto seu no Android, colocar no Celular e mostrar para a Me, o Pai, o Av, a Namorada ou o Namorado, melhor conhecer um projeto j existente. Voc tem que ver como estruturado, quais so as pastas, quais so os principais arquivos etc. Assim, ue quando chegar o momento de fazer seu prprio programa, evitar diversos problemas (e xingamentos). Tenha pacincia e v com calma. O laboratrio desta lio voc conseguir baixar um voc projeto, analisar o cdigo fonte e executar no emulador. cdigo-fonte Agora, pode sar da posio de ltus! Vamos usar o Subversion para importar um projeto para a nossa workspace; Crie um repositrio: http://biomago.googlecode.com/svn/trunk http://biomago.googlecode.com/svn/trunk: Selecione Window / Show View / SVN Repositories e clique com o boto direito, selecionando: New / Repository location . Depois, informe a URL acima; Agora, vamos baixar o projeto para nossa Workspace: Selecione File / Import / SVN / Checkout projects from SVN , selecione o repositrio que voc acabou de criar, aceite os defaults, e importe o projeto;

A estrutura bem simples. Na pasta src temos todo o cdigo-fonte Java desenvolvido. Na pasta gen , temos uma classe muito importante: R.java! Nunca altere este arquivo! Ele contm identificadores para imagens, layouts, menus e strings da aplicao. Ele auto-gerado a cada novo recurso que adicionamos ao projeto. A pasta res contm os recursos em si: imagens (drawables), layouts (de activities), menus, estilos e strings. O arquivo AndroidManifest.xml a declarao da aplicao. Ele contm todas as configuraes necessrias para empacotar, distribuir e executar a aplicao. O arquivo default.properties contm as propriedades do projeto. A mais importante qual Plataforma est sendo usada para executar o projeto. Para mudar isto: selecione o projeto e, com o boto direito, selecione: Properties . Abra a parte Android e selecione a plataforma desejada. Ateno: Para executar esta aplicao, voc deve ter baixado a plataforma: Google Inc.:Google APIs:7. Porm, se voc baixou apenas o Android SDK 7, ento deve mudar a plataforma, conforme ensinado anteriormente.

Executando a aplicao Sua aplicao ser executada DENTRO de um programa emulador de ambiente Android. Voc precisa criar um "AVD" (Android Virtual Device) para isto. claro que pode executar diretamente no seu Celular, o que contra-producente.

Criando um Android Virtual Device - AVD (Emulador) Para criar um AVD: 1. Clique no menu "Window" e selecione SDK and AVD Manager; 2. Clique em new ; 3. Informe os dados desejados: o name: o nome do seu dispositivo virtual; o target: a verso de Android e o nvel de API que ele vai suportar; o SD-card (size): o tamanho em megabytes do SD Card; o Skin: a tela. Selecione "builtin". Recomendamos usar HVGA; 4. Clique em Create AVD e v tomar um caf... Demora MUUUUUUIIIIITO! Voc s precisar criar AVDs uma nica vez, ou ento, sempre que desejar testar em um dispositivo diferente. Voc pode criar AVDs que simulem o seu Celular ou Tablet, ou ento o que voc espera encontrar no mercado. Porm, o Google sempre se refere a uma configurao chamada de "Baseline": Tela: HVGA (320x480) Se voc usar esta configurao, ser fcil adaptar seu programa para utilizar outras formas e

tamanhos de tela. Guarde o nome do AVD que voc criou. Ele pode ser econtrado na pasta: Linux: ( uma pasta oculta): ~/.android/avd/[nome d o avd]; do Windows: DOCUMENTS_AND_SETTINGS/android/avd/[nome do avd];

Executando a aplicao Selecione seu projeto, na Janela "Project Explorer", e faa o seguinte: 1. Selecione: Run / Run Configurations; 2. Abra a aba target , e indique qual AVD o preferenci preferencial; 3. Depois, selecione apply e run ;

Nas prximas vezes, s clicar no projeto e selecionar "Run as / Android Application"

Emulador

O emulador como se fosse um dispositivo mvel mesmo! Ele possui todas as teclas de um aparelho tpico, inclusive um teclado de hardware. Ele tem as teclas home , menu , back e magnify . A tecla menu desbloqueia o aparelho. Se quiser, pode at alternar entre em p alternar (portrait) e deitado (landscape) usando CONTROL ESQUERDO + F11. Voc conhece o Android? No? Ento aproveite! Acione a tecla back , saia do aplicativo e veja o que o Android oferece a voc, Talvez voc esteja se perguntando: eu preciso ter um dispositivo Android para desenvolver? ter A resposta NO! Porm, ajuda bastante. Ns temos alguns smartphones Sony Xperia (um X10 e um X10 mini), alm de um Samsung S . Ah! E para depurar a mesma coisa, s que voc tem que acionar Debug e colocar breakpoints no cdigo cdigo-fonte.

Problemas de publicao do Blogger O Blogger, servio do Google que utilizamos para manter nossa comunidade, est apresentando problemas intermitentes de publicao. Logo, tivemos que dividir algumas lies, incluindo esta, em duas partes, de modo a diminuir o tamanho e o nmero de imagens. Laboratrio O laboratrio desta lio voc conseguir instalar o plugin subeclipse, conectar ao servidor SVN, baixar o projeto BioMago (http://code.google.com/p/biomago/), analisar o cdigo-fonte e conseguir executar o aplicativo.

Est na hora de criar um "Hello world" O aprendizado de toda linguagem de programao comea com um famoso programa, do tipo: "Hello World". Vamos fazer a mesma coisa! Siga as instrues a seguir, de modo a criar uma aplicao simples no "eclipse". 1) Para comear, vamos criar uma nova Workspace: Depois de cri-la, configure o Android SDK. Abra o menu: "window" / "preferences", selecione "Android" e aponte para a localizao do SDK. Se voc j tem uma workspace criada (a do projeto anterior), ento pode utiliz-la. Lembre-se de fechar o projeto "BioMago", para no confundir (selecione o projeto e, no menu de contexto, clique em "Close Project"). 2) Com a Workspace criada, hora de criar um projeto: Selecione o menu: "File / New / Android Project". Pode ser que a opo "Android Project" no aparea, neste caso, selecione: "Project...", escolhendo "Android" na tela seguinte. Preencha os campos conforme a lista abaixo: Informe o campo: "Project Name" com o nome do futuro projeto (no use espaos nem caracteres especiais); Deixe selecionados os campos: "Create new project in workspace" e "Use default location"; Marque o campo "Build target". Ns s temos dispositivos Android 2.1. Se quiser uma verso posterior, tem que baixar a plataforma. Role a tela para cima; Preencha o campo: "Application Name" com o nome que voc quer que as pessoas conheam o seu projeto; Preencha o campo: "Package Name" com o nome do pacote Java. Em Android este nome muito importante. Normalmente, usamos o nome de domnio ao contrrio, acrescido do nome do projeto; Marque o campo "Create Activity" e informe o nome da classe da Activity principal, que o assistente criar para ns (este um class name!); Informe o campo "Min SDK version" com a verso de SDK mnima necessria para que sua aplicao seja executada. Se estiver usando Android 2.1, ento use "7";

Ao clicar "Next", note que oferecida a opo de criar um projeto de teste. Neste momento, deixe desmarcada e clique "finish"; Aps algum tempo, seu projeto estar criado. Selecione seu projeto, abra suas propriedades e selecione "Android". Voc ver que a API desejada estar marcada. 3) Configure o AVD e execute o projeto no emulador: Configure Para executar o projeto, voc deve ter criado um AVD (Android Virtual Device). No curso, h instrues sobre como fazer isto. Selecione seu projeto, escolha "Run Configurations". Marque "Android Application", e clique no boto "new" da caixa de dilogo. Selecione o AVD "target", aponte o nome do projeto, depois pressione: "Apply" e "Run". Da prxima vez, no ter que fazer isto.

Ao aparecer o Emulator com a "cara de um celular" na tela, pressione o boto "menu" para desbloque lo (se aparecer um dilogo de espera, selecione o boto "Wait"). desbloque-lo Examinando o cd cdigo-fonte gerado fonte

Pera... Ns no escrevemos nada! Como pode haver cdigo-fonte? O plug-in "ADT" gera uma aplicao "Hello World" automaticamente, logo, todo o cdigofonte e configuraes necessrios j esto prontos. Vamos examinar a aplicao. Para comear, ela j possui uma activity com um layout criado, alm de recursos, como strings e cones: Classe da Activity "Principal.java", dentro de "src" e dentro do pacote Java que voc informou. Layout "main.xml" (os layouts e todos os arquivos XML do Android devem ter nomes em minsculas), dentro de "res/layout". cone "icon.png", dentro de cada uma das trs pastas "drawable", dentro de "res". Dois strings "hello" e "app_name", criados dentro de um arquivo "strings.xml", dentro da pasta: "res/values". Uma classe "R.java", criada automaticamente dentro da pasta: 'src/gen". Um arquivo "AndroidManifest.xml", criado na raiz do projeto. Um arquivo "default.properties", contendo as propriedades do projeto. Um arquivo "proguard.cfg", criado na raiz do projeto - ProGuard um ofuscador de cdigo, que "embaralha" o byte code da aplicao, dificultando a engenharia reversa. Este um arquivo que configura esta ferramenta. Vamos examinar o cdigo-fonte da nossa Activity: view plainprint? 1. package br.com.thecodebakers.primeiro; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. 6. public class Principal extends Activity { 7. /** Called when the activity is first created. */ 8. @Override 9. public void onCreate(Bundle savedInstanceState) { 10. super.onCreate(savedInstanceState); 11. setContentView(R.layout.main); 12. } 13. }

O mtodo "onCreate" invocado quando a Activity criada (no existe na pilha). A chamada do mtodo "setContentView()" indica qual o layout que deve ser exibido na tela que a Activity vai exibir.

Ciclo de vida de activities

Quando uma activity est em estado "running", est visvel, com todo seu estado preservado e pode receber eventos, seja do sistema ou de suas Views. Se outra atividade ou dilogo receber o foco, a activity passa para o estado "Paused". Ela continua "visvel" e retm seu estado. Ela pode ser destruda pelo sistema, caso haja extrema necessidade de memria e recursos. Neste estado, ideal que as anima es sejam pausadas e animaes o estado seja salvo. Outra atividade recebeu o foco e o controle, ocultando totalmente a primeira, que passa a estar em estado "Stopped". Ela poder ser desativada pelo sistema, caso haja necessidade de memria. Ela continuar a reter seu estado. H uma nuance de diferena entre o estado "Paused" e o "Stopped", pois ambos partem do pressuposto que a activity foi "oculta". A nuance a visibilidade. Uma activity em estado "Paused" no est totalmente oculta, um exemplo disto quando um a caixa de dilogo uma aberta (ou uma janela de notificao). J uma activity em estado "Stopped" foi completamente ocultada por outra Activity, por exemplo, neste comando: view plain plainprint? 1. public void clicouLinear(View view) { 2. Intent i = new Intent (this.getApplicationContext(), LinearDemo.class); .getApplicationContext(), LinearDemo.class 3. this.startActivity(i); .startActivity(i); 4. }

Ao executar a linha com a chamada: "startActivity()", a atividade a qual este cdigo fonte cdigo-fonte pertence passar a ficar em estado "Stopped", pois acaba de iniciar outra Activity. pois O Estado "Killed", na verdade no existe. A Activity fica nesse estado somente por uns poucos momentos, enquanto seu mtodo "onDestroy()" est sendo executado. A no ser em casos extremamente especficos, ns no encerramos manualmente as activities, encerramos deixando esta tarefa a cargo do sistema.

Para cada transio de estado, um mtodo "callback" da classe Activity invocado. Voc pode ou no sobrescrev-los, dependendo da sua necessidade. Normalmente, sobrescrevemos apenas o mtodo "onCreate()", mas existem os mtodos: onCreate quando a actitivy est para se tornar "Running". onStart a activity est para se tornar visvel. onRestart a activity estava "Stopped" e foi ativada novamente. onResume a activity vai comear a interagir com o usurio, recebendo input e eventos. onPause a activity est parcialmente oculta. Neste mtodo, voc pode fazer "commit" de alteraes ou parar animaes, de modo a poupar recursos do sistema. onStop a activity est totalmente oculta por outra activity e esta funo chamada. onDestroy a activity est para ser eliminada da memria. Existem outros "callbacks" importantes, como: "onBackPressed()", invocado quando a tecla "back" do dispositivo acionada.

Arquivo "AndroidManifest.xml" Abra o arquivo "AndroidManifest.xml", dentro da raiz do projeto. Note que ele possui diversas informaes sobre seu projeto. Para comear, dentro do TAG <manifest>, ele possui alguns atributos interessantes: package: muito importante! Sua aplicao conhecida pelo nome do pacote; android:versionCode e android:versionName: nmero da verso da aplicao. Primeiro em forma numrica e depois em forma String; Dentro do tag <application> temos atributos importantes: android:icon: identificao do cone da aplicao, de acordo com os nomes de imagens dentro da classe "R"; android:label: ttulo da aplicao. Todas as activities que no especificarem este atributo, herdaro o valor deste; Ainda dentro do tag <application>, ns inserimos os tags de nossas activities. O Assistente do ADT faz isto para ns, porm, se inserirmos mais classes de activities, temos que inserir tags <activity> manualmente: android:name: o nome da classe (ser concatenado ao string especificado no atributo "package", do tag <manifest>);

Se a activity for utilizada para lanar a aplicao, ento temos que colocar um tag <intent-filter> com dois subtags. Veja a activity principal ("main") para ver como se faz; Existe muito mais para se saber sobre o arquivo "AndroidManifest.xml". Sugerimos que voc leia os manifestos dos nossos projetos ou ento entre no site do Android (http://developer.android.com/guide/topics/manifest/manifest-intro.html).

Criao de layout Um Layout um arquivo XML que define quais ViewGroups existem e quais Views elas contm. Pontos importantes: Toda activity deve possuir pelo menos uma View para interagir com o usurio; Normalmente, usamos um arquivo de layout, contendo um ViewGroup e algumas Views; Todos os elementos de layout so referenciados na classe R.java ; Baixe o projeto http://layout-exercise.googlecode.com/svn/trunk/ : 1. No eclipse, abra a view: SVN repositories ; 2. Adicione o repositrio acima; 3. Expanda o repositrio; 4. Selecione a pasta Layouts e faa Checkout ; Examine o arquivo res/layout/main.xml : view plainprint? 1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2. android:orientation="vertical" 3. android:layout_width="fill_parent" 4. android:layout_height="fill_parent" 5. > 6. <TextView 7. style="@style/titulo_link.vermelho" 8. android:layout_width="fill_parent" 9. android:layout_height="wrap_content" 10. android:text="@string/linear" 11. android:onClick="clicouLinear" 12. /> 13. <TextView 14. style="@style/titulo_link.verde" 15. android:layout_width="fill_parent" 16. android:layout_height="wrap_content" 17. android:text="@string/table" 18. android:onClick="clicouTable" 19. /> 20. <TextView 21. style="@style/titulo_link.azul" 22. android:layout_width="fill_parent" 23. android:layout_height="wrap_content" 24. android:text="@string/relative" 25. android:onClick="clicouRelative" 26. /> 27. <TextView 28. style="@style/titulo_link.lilas" 29. android:layout_width="fill_parent"

30. android:layout_height="wrap_content" android:layout_height="wrap_content" 31. android:text="@string/with_images" android:text="@string/with_images" 32. android:onClick="clicouWithImages" d:onClick="clicouWithImages" 33. /> 34. <TextView 35. style="@style/titulo_link.laranja1" "@style/titulo_link.laranja1" 36. android:layout_width="fill_parent" android:layout_width="fill_parent" 37. android:layout_height="wrap_content" android:layout_height="wrap_content" 38. android:text="@string/dontDoIt01" android:text="@string/dontDoIt01" 39. android:onClick="clicouDont01" android:onClick="clicouDont01" 40. /> 41. <TextView 42. style="@style/titulo_link.piscina" "@style/titulo_link.piscina" 43. android:layout_width="fill_parent" android:layout_width="fill_parent" 44. android:layout_height="wrap_content" android:layout_height="wrap_content" 45. android:text="@string/dontDoIt02" android:text="@string/dontDoIt02" 46. android:onClick="clicouDont02" android:onClick="clicouDont02" 47. /> 48. <TextView TextView 49. style="@style/titulo_link.amarelo" "@style/titulo_link.amarelo" 50. android:layout_width="fill_parent" android:layout_width="fill_parent" 51. android:layout_height="wrap_content" android:layout_height="wrap_content" 52. android:text="@string/listacombarra" android:text="@string/listacombarra" 53. android:onClick="clicouLista" android:onClick="clicouLista" 54. /> 55. </LinearLayout>

Todo layout um arquivo ANDROID XML, cujo nome deve comear com letras minsculas, odo e deve residir na pasta: res/layout . Ele deve possuir um e somente um ViewGroup principal, que, neste caso, o LinearLayout. O LinearLayout coloca tudo em sequncia. Exec a Execute aplicao e selecione LinearLayout :

Todas as views filhas so organizadas em sequncia, enquando couberem na mesma linha. Voltando ao arquivo main.xml , note que temos 7 Views dentro do nosso ViewGroup principal e todas so do tipo TextView , Uma TextView serve para exibir textos. Agora, abra o seu primeiro projeto, cujo layout mais simples, e veja o arquivo res/main.xml : view plainprint? 1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:orientation="vertical" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent" 6. > 7. <TextView 8. android:layout_width="fill_parent" 9. android:layout_height="wrap_content" 10. android:text="@string/hello" 11. /> 12. </LinearLayout>

Temos uma nica TextView , com trs propriedades informadas: android:layout_width Qual a largura que a View prefere ter, dentro de seu parent , que, neste caso o ViewGroup LinearLayout. android:layout_height Qual a altura que a View prefere ter dentro de seu parent . android:text Qual o texto que ser exibido dentro da View. As propriedades android:layout_width e android:layout_height so muito importantes e so obrigatrias. Ns podemos especificar trs valores: FILL_PARENT A view quer ser to grande naquela dimenso (altura ou largura) como o seu parent . Ela encher o ViewGroup; WRAP_CONTENT A view quer ser grande o suficiente para conter o texto (ou imagem) atribudo; Unidades Podem ser dp - density independent values, sp - scale independent, pt - 1/72 de polegada ou px -pixels; No nosso caso, estamos estabelecento que a TextView ser da largura de seu parent e ter a altura suficiente para conter o texto que atribumos (este o padro para TextView ). Na propriedade android:text especificamos um string resource. Nossa aplicao pode ter vrios tipos de recursos (resources): layouts, estilos, strings,

imagens etc; os nomes dos recursos ficam compilados em uma tabela binria, chamada de <projeto>.arsc . Para identificar o recurso, usamos um nmero inteiro, que o seu ndice na tabela. Sempre que criamos alguma coisa na pasta res , o ADT altera a classe R.java , dentro da pasta gen . Ele cria uma constante dentro da inner class apropriada. Eis o R.java do nosso primeiro projeto: view plainprint? 1. package br.com.thecodebakers.primeiro; 2. 3. public final class R { 4. public static final class attr { 5. } 6. public static final class drawable { 7. public static final int icon=0x7f020000; 8. } 9. public static final class layout { 10. public static final int main=0x7f030000; 11. } 12. public static final class string { 13. public static final int app_name=0x7f040001; 14. public static final int hello=0x7f040000; 15. } 16. }

Temos trs inner classes que so constantes dentro desta classe: attr , que representa atributos (no estamos usando), drawable , que representa imagens, layout , que representa layouts de views, e string , que representa recursos de strings. Outro muito importante o id , que representa os identificadores que criamos dentro de nossos layouts (veja a classe R.java do projeto Layouts ). No layout de nossa activity (primeiro projeto), dissemos o seguinte: android:text="@string/hello" Logo, o texto que ser exibido o que est contido dentro do recurso de strings chamado hello . E onde fica ele? Dentro de um arquivo XML, que fica na pasta res : view plainprint? 1. <?xml version="1.0" encoding="utf-8"?> 2. <resources> 3. <string name="hello">Hello World, Principal!</string> 4. <string name="app_name">Primeiro Projeto</string> 5. </resources>

Por que isto? para facilitar a localizao (L10N) de nossa aplicao. Finalmente, temos tambm os ids . Abra o projeto BioMago , que importamos na primeira aula. Execute o programa e cadastre um registro. Note que, ao cadastrar, o BioMago tem que pegar o nome e a data de nascimento. A atividade que faz o cadastramento a Edicao.java e seu layout R.layout.edicao , ou o arquivo: edicao.xml . Vamos primeiramente ver o arquivo de layout: view plainprint? 1. <RelativeLayout 2. xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="fill_parent" 4. android:layout_height="fill_parent"> 5. 6. <TextView 7. android:layout_alignParentTop="true" 8. android:layout_centerHorizontal="true" 9. android:text="@string/lblNome" 10. style="@style/titulo" 11. android:layout_height="wrap_content" 12. android:layout_width="fill_parent" 13. android:id="@+id/lblnome"/> 14. <EditText 15. android:layout_below="@+id/lblnome" 16. android:layout_centerHorizontal="true" 17. android:id="@+id/txtNome" 18. android:maxLines="1" 19. android:layout_height="wrap_content" 20. android:layout_width="fill_parent"/> 21. 22. <TextView 23. android:layout_below="@+id/txtNome" 24. android:layout_centerHorizontal="true" 25. style="@style/titulo" 26. android:text="@string/lblNascimento" 27. android:layout_height="wrap_content" 28. android:layout_width="fill_parent" 29. android:id="@+id/lbldata"/> 30. 31. <DatePicker 32. 33. android:layout_below="@+id/lbldata" 34. android:layout_centerHorizontal="true" 35. android:id="@+id/dtData" 36. android:layout_height="wrap_content" 37. android:layout_width="fill_parent" 38. ></DatePicker> 39.

40. <ImageView 41. android:layout_alignParentBottom="true" 42. android:layout_alignParentLeft="true" 43. android:src="@drawable/ok" 44. android:layout_gravity="left" 45. android:id="@+id/btnSalvar" 46. android:layout_height="wrap_content" 47. android:layout_width="wrap_content" 48. android:onClick="salvar" 49. ></ImageView> 50. <ImageView 51. android:layout_alignParentBottom="true" 52. android:layout_alignParentRight="true" 53. android:src="@drawable/cancelar" 54. android:layout_gravity="left" 55. android:id="@+id/btnCancelar" 56. android:layout_height="wrap_content" 57. android:layout_width="wrap_content" 58. android:onClick="cancelar" 59. ></ImageView> 60. </RelativeLayout>

Neste projeto, usamos outro tipo de ViewGroup, que o RelativeLayout . Note a View EditText , que est em negrito: view plainprint? 1. <EditText 2. android:layout_below="@+id/lblnome" 3. android:layout_centerHorizontal="true" 4. android:id="@+id/txtNome" 5. android:maxLines="1" 6. android:layout_height="wrap_content" 7. android:layout_width="fill_parent"/>

O que isso? A propriedade id permite que nos referenciamos a uma View dentro do cdigo-fonte Java, podendo obter o valor que o usurio digitou, por exemplo. O que informamos dentro da propriedade foi @+id/txtNome , que significa: se no existir o id txtNome , crie-o. Uma entrada foi criada dentro de R.java: view plainprint? 1. public final class R { 2. public static final class attr { 3. ... 4. } 5. public static final class drawable { 6. ...

7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. }

} public static final class id { ... public static final int txtNome=0x7f07000a; ... } public static final class layout { ... } public static final class menu { ... } public static final class string { ... } public static final class style { ... }

Ou seja, criamos um novo identificador de View dentro de nosso projeto, e podemos us-lo para nos referenciar EditText que criamos. Para obter o nome do usurio, o cdigo da Activity tem que declarar uma varivel do tipo: android.widget.EditText: view plainprint? 1. public class Edicao extends Activity { 2. ... 3. private EditText txtNome; 4. 5. public void salvar (View view) { 6. txtNome = (EditText) this.findViewById(R.id.txtNome); 7. Elemento elemento = new Elemento(); 8. elemento.setNome(txtNome.getText().toString()); 9.

Assim, podemos acessar a View e pegar o nome que o usurio informou. A EditText possui alguns atributos e propriedades muito interessantes, por exemplo, o atributo XML android:inputType nos permite determinar qual tipo de dado o usurio pode digitar, e o atributo: android:password substitui o valor digitado por um crculo, como se fosse um campo de senha. Podemos pegar o contedo de uma EditText com o mtodo getText() , mas note que ele somente devolve um Editable . Se quisermos pegar o string, temos que usar o mtodo: getText().toString() . E, se quisermos converter em um nmero: Long.valueOf(txt.getText().toString());

Se informarmos numberSigned no atributo XML android:inputType , nossa EditText somente aceitar a digitaco de algarismos, com ou sem sinal. Para concluir esta parte, precisamos ter uma maneira de reagir aos eventos provocados pelo usurio, como o clique de um boto, por exemplo. Todo elemento Clicvel possui o atributo XML: android:onClick , que nos permite nomear um mtodo de callback dentro da classe da Activity. Por exemplo, abra o layout main,xml e a Activity Principal.java , do projeto Layouts : view plainprint? 1. <TextView 2. style="@style/titulo_link.vermelho" 3. android:layout_width="fill_parent" 4. android:layout_height="wrap_content" 5. android:text="@string/linear" 6. android:onClick="clicouLinear" 7. />

view plainprint? 1. public void clicouLinear(View view) { 2. Intent i = new Intent (this.getApplicationContext(), LinearDemo.class); 3. this.startActivity(i); 4. }

Repare que no layout, a TextView est apontando o android:onClick para clicouLinear , e que na classe da Activity, temos um mtodo com a assinatura: public void clicouLinear (View view) . O nome do mtodo tem que ser o mesmo informado no atributo, e a assinatura tem que ter void como retorno, e uma instncia de View como argumento. Este mtodo ser invocado quando aquela TextView for clicada pelo usurio. E o que o mtodo faz? Ele invoca outra Activity! Ele cria uma instncia de android.content.Intent, que serve para determinar o que ser executado. Pode ser uma Actrivity do projeto ou um aplicativo externo, como uma pgina Web. Neste caso, estamos criando um Intent que chama a classe da atividade LinearDemo. O mtodo startActivity() inicia a outra atividade. Tambm poderamos mostrar uma caixa de dilogo, uma mensagem, tipo JOptionPane, s que usamos outra classe para isto: view plainprint? 1. Resources res = this.getResources(); 2. new AlertDialog.Builder(this) 3. .setMessage(res.getString(R.string.erro_data_posterior))

4. .setNeutralButton(res.getString(R.string.lblOK), new DialogInterface.OnClickListen er() { 5. public void onClick(DialogInterface dialog, int which) { 6. } 7. }) 8. .show();

J sei... Muita calma nessa hora! Para comear, apontamos para os recursos da aplicao usando a classe android.content.res.Resources. Ela serve para obtermos recursos, por exemplo strings , dentro do cdigo-fonte Java. Nos arquivos XML usamos apenas @string/<nome> , mas no cdigo Java precisamos usar: <instncia de Resources>.getString(identificador). Lembrando que todo resource string est possui seu identificador dentro da classe R.java . Depois, criamos uma instncia de android.app.AlertDialog.Builder e outra de AlertDialog; Poderamos reescrever este cdigo-fonte assim: view plainprint? 1. AlertDialog.Builder construtor = new AlertDialog.Builder(this); 2. construtor.setMessage(res.getString(R.string.erro_data_posterior)) 3. .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 4. public void onClick(DialogInterface dialog, int id) { 5. // comandos... 6. } 7. }); 8. AlertDialog alert = construtor.create(); 9. alert.show();

Dois pontos importantes: 1 Todos os dilogos so MODELESS; 2 Use sempre string resources e evite literais; Agora, voc tem todos os elementos para fazer o laboratrio 2. Laboratrio 2 Vamos criar uma aplicao que interage com o usurio. Ela receber um nmero e far sua fatorao (decomposio em nmeros primos), exibindo um dilogo que mostrar o resultado. 1 Crie um novo projeto Android, conforme fizemos no Laboratrio 1; 2 Edite o layout main.xml e acrescente: a Uma TextView contendo o rtulo: Nmero (dever estar dentro de um string

resource); Uma EditView que receba o nmero digitado (deve apenas receber nmeros e deve b ter id ); c Um boto Button, que invoque o callback para fazer e mostrar a fatorao; 3 O callback dever decompor o nmero informado em fatores primos, e usar um dilogo para mostrar o resultado; O crivo de Eratstenes Para decompor em fatores primos, necessrio, primeiramente, obter uma lista de nmeros necessrio, primos! Segundo a Wikipedia: O Crivo de Eratstenes um algoritmo e um mtodo simples e prtico para encontrar nmeros primos at um certo valor limite. Segundo a tradio, foi criado pelo matemtico grego Eratstenes (c. 285 194 a.C.), o terceiro bibliotecrio chefe da Biblioteca de go 285-194 bibliotecrio-chefe Alexandria. Felizmente, para voc, estvamos de bom humor e providenciamos uma implementao do Crivo , que pode ser encontrada ao final da lio. O resultado de sua aplicao deve ser como a figura: aplicao

Implementao do Crivo view plain plainprint? 1. 2. 3. 4. 5. 6. 7. 8. package br.nom.sampaio.cleuton.factorwiz; br.nom.sampaio.cleuton.factorwiz; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import android.view.View; public class FatoracaoBO { private static List<Long> primos;

9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.

private static long sinalUltimo = 1; public static String fatorar (long numero) { String resultado = null; if (numero == 0) { resultado = "0"; } else { if (numero > 0 && numero < 3) { resultado = Long.toString(numero); } else { Long valor = numero; if (numero < 0) { sinalUltimo = -1; valor = numero * (-1); } primos = crivo(valor); resultado = calcular(valor); } } return resultado; } private static String calcular(Long numero) { String resultado = ""; Long valor = numero; Iterator<Long> it = primos.iterator(); Long primo = it.next(); while (valor > 1) { long resto = valor % primo; if (resto > 0) { primo = it.next(); } else { if (resultado.length() > 0) { resultado += "x"; } valor = valor / primo; if (valor == 1) { primo = primo * sinalUltimo; } resultado += Long.toString(primo); } }

59. return resultado; 60. } 61. 62. private static List<Long> crivo (long n) { 63. List<Long> lprimos = new ArrayList<Long>(); 64. 65. for (long x = 2; x <= n; x++) { 66. lprimos.add(x); 67. } 68. long p = 2; 69. Iterator<Long> it = lprimos.iterator(); 70. while (Math.pow((double)p,2) <= n) { 71. int m = 2; 72. while (m*p <= n) { 73. it = lprimos.iterator(); 74. while (it.hasNext()) { 75. Long valor = it.next(); 76. if (valor==(m*p)) { 77. it.remove(); 78. break; 79. } 80. } 81. m++; 82. } 83. 84. it = lprimos.iterator(); 85. while (it.hasNext()) { 86. Long valor = it.next(); 87. if (valor > p) { 88. p = valor; 89. break; 90. } 91. } 92. } 93. 94. return lprimos; 95. 96. } 97. }

Internacionalizao i18n significa Internationalization , ou internacionalizao, que preparar uma aplicao para vrios idiomas e/ou culturas. l10n significa Localization , ou localizao, que adaptar uma aplicao internacionalizada para um determinado idioma / cultura. So aspectos muito importantes em um projeto de software, principalmente hoje em dia, com a economia globalizada. Talvez voc j tenha ouvido falar nesses termos, porm, o que talvez no saiba, que h muito mais alm da simples traduo dos termos (o que pode ser feito no Google Translator!). As prprias palavras utilizadas, a ordem da escrita (de trs para frente ou vertical), as imagens que voc est utilizando, enfim, diversos itens podem ser mal interpretados em suas aplicaes. muito difcil internacionalizar uma aplicao, embora a API do Android oferea algumas facilidades, o problema social e humano. Na verdade, existem vrias empresas, como a RS Globalization, que oferecem servio de internacionalizao de produtos. Para ter uma ideia, veja "checklist" da comunidade do OpenOffice: Se a caracterstica ser traduzida para um idioma com ordem da direita para a esquerda, seu layout deve ser examinado literalmente utilizando um espelho. A ordem das palavras (adjetivos, pronomes e substantivos) pode variar de um idioma para outro. Eu me assegurei que no existem elementos GUI dentro de textos? A equipe examinou com cuidado a internacionalizao de um componente de terceiros, antes de utiliz-lo dentro do seu produto? As figuras humanas, partes do corpo e especialmente mos, foram evitados a todo custo? A nica figura aceitvel aquele bonequinho utilizado em banheiros, sem cabelo, sem roupas, sem mos e sem dedos. Mos: nem tente! No existe uma s posio de mos que no seja ofensiva em algum lugar da Terra. E no assuma que exista uma posio com significado universal, como o sinal de "ok", por exemplo. Foram evitadas figuras que contenham palavras? Especialmente trocadilhos ou representaes de palavras? Voc ser certificou que um nico cone no seja utilizado com significados diferentes? O texto escolhido para a interface de usurio deve refletir um produto internacional. Evite jarges, regionalismos, textos "bonitinhos" e humor.

Alm disto, outros itens importantes so: cores, figuras de animais e sons. Muito cuidado com eles! Procure saber se est utilizando cores prprias (em alguns lugares, a cor da bandeira do vizinho ofensiva!) Figuras de animais so extremamente complicadas, por exemplo, ces, que so animais de estimao por aqui, podem significar alimento em outro lugar! E sons?

Gemidos, gritos, sussurros, e at mesmo "bips" podem ser considerados ofensivos. Localizao Uma vez que sua aplicao esteja internacionalizada, ou seja, no mnimo: No existam literais "string" dentro do cdigo-fonte No existam literais "string" dentro de elementos de layout

Para que seja possvel fazer a localizao (L10N) de uma aplicao, necessrio que ela esteja preparada para isto, ou seja, Internacionalizada (i18n). Isto feito atravs de algumas atitudes importantes, a comear pelos textos exibidos. Vamos ver um exemplo: view plainprint? 1. AlertDialog.Builder construtor = new AlertDialog.Builder(this); 2. construtor.setMessage( O registro foi alterado ) 3. .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 4. public void onClick(DialogInterface dialog, int id) { 5. // comandos... 6. } 7. }); 8. AlertDialog alert = construtor.create(); 9. alert.show();

Neste exemplo, temos dois literais string dentro de uma caixa de dilogo. Se decidirmos criar uma verso para o Ingls (ou Francs), teremos que alterar o cdigo-fonte da aplicao, o que tornar difcil manter vrias verses simultaneamente. Vejamos outro exemplo ruim: view plainprint? 1. <TextView 2. style="@style/titulo_link.vermelho" 3. android:layout_width="fill_parent" 4. android:layout_height="wrap_content" 5. android:text="Informe seu nome" 6. android:onClick="clicouLinear" 7. />

Repare que informamos um literal string na propriedade android:text . Isto tambm dificultar a criao de verses da aplicao para outros idiomas. Agora, abra o projeto Layouts e mude o idioma do simulador para en (Ingls): 1. Abra o exemplo Layouts (http://layout-exercise.googlecode.com/svn/trunk/); 2. Mande rodar;

3. Saia da aplicao e selecione Custom locale ; 4. Selecione en english e mantenha pressionado o mouse (menu de contexto). Selecione Apply ; 5. Agora, procure o cone da aplocao Layout exercise e rode novamente;

Voc ver que a aplicao automaticamente passou a exibir os elementos em Ingls (inclusive seu ttulo). Isto porque ela foi Localizada para Ingls. Na prtica, recomendamos que voc sempre crie a aplicao com o idioma default em Ingls, fazendo as localizaes necessrias. Desta forma, mesmo que voc no a tenha preparado para determinado idioma (Espanhol, por exemplo), ela aparecer em Ingls. Prticas para promover a Internacionalizao Para criar uma aplicao Internacionalizada, JAMAIS USE LITERAIS STRING! A no ser para criar mensagens de log, usando a classe android.util.Log (Log.d( Teste , Mensagem )). Crie STRING RESOURCES (ou recursos String), dentro da pasta res/values . Para isto, basta selecionar a pasta e escolher new / Android XML File , selecionando values . Dentro do arquivo de String resources, inicie com um TAG: <resources></resources> e acrescente os tags <string></string>, como no exemplo: view plainprint? 1. <?xml version="1.0" encoding="utf-8"?> 2. <resources> 3. <string name="hello">Hello World, Principal!</string> 4. <string name="app_name">Laboratorio2</string> 5. <string name="numero">Nmero</string> 6. <string name="resultado">Resultado</string> 7. <string name="fatorar">Fatorar</string> 8. </resources>

Temos vrios string resources criados e o ADT automaticamente os compilar dentro do arquivo .arsc , criando entradas dentro da classe R.java : view plainprint? 1. package br.com.thecodebakers.lab02; 2. 3. public final class R { 4. public static final class attr { 5. } 6. public static final class drawable { 7. public static final int icon=0x7f020000; 8. } 9. public static final class id {

10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. }

public static final int txtNumero=0x7f050000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int fatorar=0x7f040004; public static final int hello=0x7f040000; public static final int numero=0x7f040002; public static final int resultado=0x7f040003; }

Podemos utilizar string resources dentro de cdigo-fonte Java e dentro de arquivos de layout. Vamos ver como usar em um arquivo de layout: view plainprint? 1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:orientation="vertical" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent" 6. > 7. <TextView 8. android:layout_width="fill_parent" 9. android:layout_height="wrap_content" 10. android:text="@string/numero" 11. /> 12. <EditText 13. android:id="@+id/txtNumero" 14. android:layout_width="fill_parent" 15. android:layout_height="wrap_content" 16. /> 17. <Button 18. android:text="@string/fatorar" 19. android:onClick="fatorar" 20. android:layout_width="wrap_content" 21. android:layout_height="wrap_content" 22. /> 23. </LinearLayout>

Note que usamos dois resource strings neste layout: um para o rtulo do campo a ser digitado e outro para o do boto de clculo. Ambos esto definidos dentro de res/values/strings.xml (o nome do arquivo no importa). Se usarmos @string/ e teclarmos CTRL+ESPAO, ser aberta uma lista de escolha contendo todos os resource strings declarados.

Para usar resource strings dentro do cdigo-fonte Java, temos que obter uma instncia da classe : android.content.res.Resources desta forma: Resources <varivel> = this.getResources(); Vejamos um exemplo prtico: view plainprint? 1. public void fatorar(View view) { 2. Resources res = getResources(); 3. EditText txtNumero = (EditText) this.findViewById(R.id.txtNumero); 4. long numero = Long.valueOf(txtNumero.getText().toString()); 5. String resultado = FatoracaoBO.fatorar(numero); 6. new AlertDialog.Builder(this) 7. .setMessage(res.getString(R.string.resultado) + ": " + resultado) 8. .setNeutralButton("OK", new DialogInterface.OnClickListener() { 9. public void onClick(DialogInterface dialog, int which) { 10. } }).show(); 11. }

A classe Resources contm o mtodo getString() (entre outros), que nos permite obter o texto de um resource string, dado o seu ndice (dentro da tabela .arsc ). Onde obtemos este nmero? Ah! Dentro da classe R.java ! Como criar Localizao de uma aplicao Uma aplicao internacionalizada pode ser facilmente localizada. Toda a pasta res/values pode ser localizada desta forma: res/values-pt para portugus! Basta usarmos a tabela internacional de idiomas (ISO 639-1) e dialetos (ISO 3166-1) como sufixo do nome da pasta values . Exemplos: res/values-pt Portugus em geral. res/values-pt-rBR Portugus do Brasil (o r para informar que as duas letras a seguir so o cdigo da regio). res/values-en-rUS Ingls dos Estados Unidos. Uma vez criada a pasta do idioma, basta copiar os arquivos de recursos (estilos, strings, cores etc) para dentro dela e traduzir seu contedo. A pasta sem sufixo passa a ser a localizao default . Sugerimos que seja sempre em ingls. O emulador possui uma aplicao Custom Locale , que permite alterar o idioma dele. Se o pas / idioma no estiver l, possvel adicionar um. Neste caso, no usamos r . Exemplo: pt_BR . No s os values (estilos, strings etc) podem ser localizados, mas as imagens tambm. As

pastas drawable tambm podem possuir o sufixo de pas e idioma. Devemos lembrar que certas imagens podem ter entendimento diferente, dependendo do pas.

Laboratrio 3 Internacionalize o exerccio anterior, criando a verso para Portugus e deixando o Ingls como a localizao default . Teste em ambos os idiomas. Se for "jogar a toalha", temos o zip da soluo dentro do projeto: http://code.google.com/p/curso-basico-thecodebakers/downloads

Menu de opes Toda activity pode ter menus: Menu de opes (options menu) acionado pela tecla "menu" do dispositivo; Menu de contexto (context menu) acionado pelo "touch and hold";

Recupere o projeto "BioMago", que utilizamos nas lies anteriores (http://code.google.com/p/biomago/ http://code.google.com/p/biomago/). http://code.google.com/p/biomago/

O menu de opes utilizado para opes gerais, que se aplicam Activity como um todo. Ele acionado quando o usurio aciona a tecla "menu" do dispositivo. O menu de contexto utilizado em listas (veremos mais adiante), quando vrios itens so exibidos simultaneamente. Ele se aplica a um s item. Devemos evitar colocar opes de item dentro do menu de opes e opes gerais dentro do menu de contexto. O Menu de Opes deve conter TODOS os comandos da Activity, independentemente se h h botes para eles na tela. Ele a opo preferencial de comandos do usurio. Entre colocar um boto na tela e colocar um comando no menu, prefira sempre a segunda opo. Para criar um menu de opes, devemos criar um menu resource, que um arquivo Andr oid Android XML, dentro da pasta: "res/menu". Apesar de ser possvel, no localizamos o menu em si, mas os Strings que ele exibe. Eis um arquivo de menu: view plain plainprint?

1. <?xml version= version="1.0" encoding="utf-8"?> encoding="utf 2. <menu xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:android="http://schemas.android.com/apk/res/android" "http://schemas.android.com/apk/res/android"> 3. 4. <item android:id="@+id/mnuIncluirRegistro" android:id="@+id/mnuIncluirRegistro" 5. android:title="@string/mnu_novo_registro" /> android:title="@string/mnu_novo_registro" 6. 7. <item android:id="@+id/mnuAjuda" android:id="@+id/mnuAjuda" 8. android:title="@string/mnu_ajuda" /> android:title="@string/mnu_ajuda" 9. 10. 11. </menu>

Cada elemento "item" uma entrada de menu, cujo rtulo est na propriedade: "android: "item" title". Note tambm que foram atribudos "ids" a cada elemento, de modo que possam ser referenciados no cdigo fonte. cdigo-fonte. Podemos ter cones no meu, mas teremos que fornecer as imagens, ou utilizar as que esto no Android. Por exemplo:

view plain plainprint? 1. 2. 3. 4. 5. 6. 7. <?xml version= version="1.0" encoding="utf-8"?> encoding="utf <menu xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:android="http://schemas.android.com/apk/res/android" "http://schemas.android.com/apk/res/android"> <item android:id="@+id/mnuIncluirRegistro" android:id="@+id/mnuIncluirRegistro" android:icon="@android:drawable/ic_menu_add" android:icon="@android:drawable/ic_menu_add" android:title="@string/mnu_novo_registro" android:title="@string/mnu_novo_registro" />

8. <item android:id="@+id/mnuAjuda" 9. android:icon="@android:drawable/ic_menu_help" 10. android:title="@string/mnu_ajuda" /> 11. 12. 13. </menu>

S devemos ficar atentos porque os cones do Android podem variar, quando mudamos a plataforma ou a verso. Uma vez que criamos nosso menu resource, precisamos "infl-lo" dentro da Activity. E isto feito no "callback" "onCreateOptionsMenu()". Este "callback" invocado apenas uma nica vez, quando o menu precisa ser criado. Se voc quiser alterar o menu antes de exibi-lo, use o "callback": "opPrepareOptionsMenu()". view plainprint? 1. 2. 3. 4. 5. 6. @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_lista, menu); return true; }

Usamos a classe "android.view.MenuInflater" para transformar nosso XML de menu em uma estrutura de objetos de menu. claro que o identificador do nosso menu foi criado dentro da classe "R.java", bastando pass-lo no mtodo "inflate", juntamente com o menu recebido. Ao invs de fazer isto, poderamos criar o menu "na mo", preenchendo os itens necessrios dentro do "callback". Isto est fora do escopo deste curso e no recomendamos que seja feito. Agora s falta uma coisa: interceptar quando o usurio clicar em um item do menu! Como voc deve ter advinhado, h um "callback" para quando um item do menu de opes clicado: "onOptionsItemSelected() ". Eis o cdigo usado no projeto "BioMago: view plainprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.mnuIncluirRegistro: this.incluirRegistro(null); return true; case R.id.mnuAjuda: Intent i = new Intent (this.getApplicationContext(), Ajuda.class);

10. this.startActivity(i); 11. return true; 12. default: return super.onOptionsItemSelected(item); 13. } 14. }

Este "callback" recebe uma instncia de "android.view.MenuItem", classe que representa um item de menu. Se analisarmos a propriedade "id", atravs do seu "getter" ("item.getItemId()"), podemos comparar com os "ids" criados em nossa classe "R.java" (lembre-se: todo "id" criado tambm dentro da classe "R.java", e voc criou "ids" para os itens de menu dentro do XML!). A parte sobre menu de contexto veremos mais adiante. Agora hora de mais exerccios! Laboratrio 4 - Menu de opes Vamos criar uma nova Activity para a Ajuda: 1. Crie um novo arquivo de layout chamado: "ajuda.xml", dentro de "res/layout" (new / Android XML file layout); 2. Crie um bonito layout, com um texto explicativo sobre sua aplicao. Veja como fizemos no projeto BioMago; 3. Crie uma classe que estenda "android.app.Activity" e escreva seu "callback" "onCreate()", inicializando o seu layout. Veja o "callback" da activity principal; 4. Altere o arquivo "AndroidManifest.xml" para acrescentar a sua activity. Veja como o do BioMago foi feito;

Agora, vamos criar um menu resource: 1. 2. 3. 4. Crie um string resource: "ajuda", com os textos apropriados em Portugus e Ingls! Crie uma pasta "menu", dentro da pasta "res"; Selecione a pasta "menu" e crie um novo Android XML File, do tipo "menu"; Coloque os itens: "novoRegistro" e "ajuda". Tenha cuidado com os "ids" e com os "titles". Use os strings que j existem;

Finalmente, vamos inflar o menu dentro do nosso cdigo-fonte: 1. No cdigo da Activity principal (Principal.java), adicione o "callback": "onCreateOptionsMenu()", conforme fizemos na apostila e no BioMago; 2. No mesmo cdigo, acrescente o "callback": "onOptionsItemSelected() ", conforme a apostila e o BioMago, alterando as opes do "switch" para: o calcular o fatorial; o invocar a activity de ajuda;

Se voc no conseguir fazer, relaxe! Ns j colocamos a soluo dentro do projeto do curso (http://code.google.com/p/curso-basico-thecodebakers/downloads/list). Estilo Um estilo um conjunto de propriedades que afetam a visualizao de um item. Podem ser definidas diretamente ou em um arquivo XML (similar ao conceito de CSS). Tambm existe o conceito de herana, onde um estilo "herda" de outros. Exemplo: view plainprint? 1. <style name="titulo_link" parent="@android:style/TextAppearance.Large"> 2. <item name="android:textColor">#ffffff</item> 3. <item name="android:typeface">monospace</item> 4. <item name="android:textStyle">bold</item> 5. <item name="android:layout_height">wrap_content</item> 6. <item name="android:clickable">true</item> 7. </style> 8. <style name="titulo_link.vermelho"> 9. <item name="android:textColor">#ff0000</item> 10. </style>

Podemos utilizar o estilo derivado em qualquer View: view plainprint? 1. 2. 3. 4. 5. 6. 7. <TextView style="@style/titulo_link.vermelho" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/linear" android:onClick="clicouLinear" />

Podemos definir vrias propriedades, dependendo do tipo de elemento, por exemplo: TextView / EditText "android:gravity" como alinhar o texto se ele for menor que a "View". Os valores possveis so: "top", "bottom", "left", "right", "center_vertical", "center_horizontal", "center", "fill_vertical", "fill_horizontal" etc; "android:height"

altura da View. A unidade pode ser: px (pixels), dp (density-independent pixels), sp (scaled pixels basedos no tamanho de letra preferido), in (polegadas), mm (milmetros).; "android:textColor" uma cor em formato RGB Html (ou uma referncia a outro estilo); "android: textSize" tamanho da letra. Pode usar qualquer unidade das j mencionadas; "android:textStyle" "normal", "bold" ou "italic"; "android: typeFace" "normal", "sans", "serif" e "monospace" (**);

(**) Se voc quiser utilizar fontes externas, possvel carregar arquivos "TTF" - Trye Type Font, como "asset" e configurar em sua aplicao, Mas isto est fora do escopo deste curso. Os estilos podem ficar dentro de arquivos XML, localizados na pasta "res/values". Veja o projeto "Layouts".

Temas (Themes) Um Tema (ou "Theme") um conjunto de estilos aplicatos a uma Activity inteira (ou a uma aplicao inteira). definido como os estilos e pode ser aplicado a uma Activity (tag <activity>, do layout) ou aplicao inteira (tag <application>) no arquivo "AndroidManifest.xml". Abra o projeto "BioMago" novamente e veja o arquivo "AndroidManifest.xml": view plainprint? 1. 2. 3. 4. 5. 6. 7. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="br.com.thecodebakers.biomago" android:versionCode="01010001" android:versionName="@string/NOME_VERSAO"> <uses-sdk android:minSdkVersion="7" /> <usespermission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

8. <application android:icon="@drawable/icon" android:label="@string/NOME_VERS AO"> 9. <activity android:name=".activities.main" 10. android:theme="@style/imagem" 11. android:label="@string/NOME_VERSAO"> 12. <intent-filter> 13. <action android:name="android.intent.action.MAIN" /> 14. <category android:name="android.intent.category.LAUNCHER" /> 15. </intent-filter> 16. </activity>

Note que aplicamos um tema chamado "imagem", que dever estar dentro de um arquivo Android XML, entre tags <style></style>, na pasta "res/values". Tambm dever existir uma entrada em "R.java", criada automaticamente. Eis o estilo: view plainprint? 1. <style name="imagem" parent="@android:style/Theme.Black"> 2. <item name="android:windowBackground">@drawable/fundo</item> 3. </style> Ele usa o item "android:windowBackground", que permite informar um recurso de imagem (drawable) para ser aplcado ao fundo da tela. Se procurarmos nas pastas "res/drawable..." veremos um arquivo "fundo.png", que o fundo de tela, adaptado para formato "em p" (portrait -port) ou "deitado" (landscape -land).

O Android j possui vrios temas que podemos usar, como: "@android:style/Theme.Black", ou podemos herdar duas propriedades com o atributo "Parent". Recursos de imagem Um "drawable" "algo que se pode desenhar", como uma imagem, por exemplo. Eles podem como ser divididos por: resoluo, idioma, orientao da tela etc, separando os arquivos em pastas, de acordo com os atributos das imagens. As pastas "drawable" ficam dentro da pasta "res", em seu projeto. A cada imagem c riada l, criada uma nova entrada criada na classe "R.java", sobre a qual ns j falamos anteriormente. Cada pasta "drawable" pode ter um ou mais sufixos, indicando ao Android qual o tipo de recurso que est l.

No projeto "BioMago" podemos ver estas pastas com seus recursos. Quando usamos uma usamos imagem, o Android automaticamente seleciona de qual pasta ele vai pegar, dependendo da configurao do dispositivo mvel (ou do emulador) em uso. As telas dos dispositivos que executam aplicaes Android podem ter caractersticas totalmente diversas. A plataforma define como configurao bsica (Baseline Configuration): diversas. HVGA (320x480) em uma tela de 3.2" polegadas. recomendvel que voc inicie seu desenvolvimento sempre usando esta configurao. Para ver um exemplo, voc deve ter criado um AVD utilizando a configurao default utilizando ("HVGA"). Para iniciar um emulator fora do eclipse, abra uma janela console e digite: Para Linux 1 - Abra a pasta onde instalou o Android SDK e v para a subpasta "tools"; 2 - Digite Android-SDK o comando: ./emulator -avd <nome do avd>; avd avd Para Windows 1 - Abra a pasta onde instalou o Android SDK e v para a subpasta "tools"; 2 - Digite Android-SDK o comando: emulator -avd <nome do avd>; -avd Agora, abra outra janela de comandos (deixando a original aberta) e veja se o seu emulador est sendo executado corretamente: Para Linux

1 - Abra a pasta onde instalou o Android-SDK e v para a subpasta "platform-tools"; 2 - Digite o comando: ./adb devices; Voc ver o seu emulador listado, incluindo qual Porta TCP ele est escutando. Depois, digite: ./adb logcat para ver o log de execuo. Para Windows 1 - Abra a pasta onde instalou o Android-SDK e v para a subpasta "platform-tools"; 2 - Digite o comando: adb devices; Voc ver o seu emulador listado, incluindo qual Porta TCP ele est escutando. Depois, digite: adb logcat para ver o log de execuo. muito importante aprender a utilizar corretamente o ADB, por fora do "eclipse". Voltando ao nosso assunto, as caractersticas das imagens podem ser: Tamanho Em polegadas medidas na diagonal maior; Taxa de aspecto Se muito mais alta ou muito mais larga que a configurao bsica; Resoluo Quantidade de pixels na tela, normalmente medida por pixels horizontais x pixels verticais 1 pixel = 1/72 de polegada Densidade Distribuio dos pixels pela tela medida em DPI; muito importante adaptar os recursos de imagem de acordo com o tipo de tela que estamos esperando. Podemos at mesmo delimitar o tipo de dispositivo no qual nosso aplicativo roda, por exemplo, dentro do arquivo "AndroidManifest.xml", podemos especificar o elemento <supports-screens></supports-screens>, que permite estabelecer os tamanhos de tela suportados e se nossa aplicao sabe lidar com diferentes densidades: "android:smallScreens" (true / false) "android:normalScreens (true / false) "android:largeScreens (true / false) "android:anyDensity" (true / false) se "true", o android desabilita seu mecanismo de escala automtica de pixels, confiando na aplicao para isto. Se "false", o android liga seu mecanismo e faz a escala automaica Padres de sufixos Para simplificar a vida do desenvolvedor, a plataforma Android criou os seguintes padres: Para tamanho de tela: small, normal, large e xlarge; Para densidade: ldpi (baixa), mdpi (mdia), hdpi (alta) e xhdpi (muito alta); Podemos classificar os recursos de imagem, colocando-os nas pastas apropriadas. O Android fornece uma tabela com os vrios tipos de diretrios, de acordo com o tipo de tela ou idioma (http://developer.android.com/guide/topics/resources/providingresources.html#AlternativeResources). Vamos reproduzir aqui os mais importantes:

sufixo Idioma e regio

Exemplo -pt, -pt-rBR, -en-rUS

Descrio Idioma e regio dos recursos contidos nesta pasta

Tamanho -small, de tela -normal, -large, -xlarge Orientao -port, -land

Recursos classificados por tamanho de tela Orientao da tela, se est "em p": portrait, ou "deitada": landscape De acordo com a densidade da tela. Se no for importante, use "nodpi"

Densidade -ldpi, -mdpi, -hdpi, -xhdpi e nodpi

Podemos classificar nossos recursos de imagem combinando estes sufixos. desde que seja EXATAMENTE NA ORDEM DA TABELA, por exemplo: "res/drawable-normal-port" : recursos de imagem para telas de tamanho normal () em orientao "em p"; "res/drawable-land-hdpi" : recursos de imagem para telas em orientao "deitada" e de alta densidade; Se tentarmos criar uma pasta assim: "res/drawable-ldpi-port", tomaremos um erro porque a ordem est incorreta. Todos os diretrios de recursos, como: layouts, values e drawables, podem ter sufixos, desde que a ordem seja seguida. Calculando a densidade Nada impede que voc use um s tamanho, independentemente de densidade ou tamanho da tela. O Android tenta carregar a imagem de acordo com a densidade da tela. Se no houver (por exemplo, voc no est usando o sufixo de densidade ou ento est usando "-nodpi") o Android tentar escalar a imagem para a densidade correta. Providenciando as imagens de acordo com a densidade, ns evitamos este trabalho e nos certificamos de que as imagens apaream corretamente, de acordo com a configurao bsica do Android. Os cones de lanamento (Launch Icons) so um bom exerccio de densidade. Eis o tamanho (em pixels) dos cones de lanamento, de acordo com a densidade da tela: ldpi: 36 x 36 pixels; mdpi: 48 x 48 pixels; hdpi: 72 x 72 pixels;

Podemos criar imagens de densidades e tamanhos diferentes utilizando programas grficos

como o GIMP (http://www.gimp.org/) . Criamos uma cpia da imagem do cone em tamanho maior (72 x 72 pixels), colocamos na pasta "-drawable-hdpi". Depois, vamos diminuindo a imagem e colocando na pasta correspondente, at que tenhamos completado as trs.

Portrait / Landscape O Android automaticamente re-inicia nossa activity caso ocorra alguma mudana na configurao, como a orientao da tela, por exemplo. Neste caso, os mtodos "onDestroy()" e "onRestart()" sero invocados. No faz parte do escopo deste curso interceptar este comportamento. H certos dipos de imagens (e at layouts) que podem variar, dependendo da orientao da tela. Neste caso, podemos criar imagens de background adequadas e coloc-las nas pastas corretas ("-port" ou "-land"), respeitando a ordem mostrada na tabela anterior. Observaes Os nomes das imagens em cada subdiretrio de "drawable" devem ser iguais! No use: letras maisculas, hfens e caracteres especiais (incluindo espaos) nos nomes das imagens! Laboratrio 5 Este um "Big lab"! Dentro do projeto do curso (http://code.google.com/p/curso-basicothecodebakers/downloads/list), h um arquivo "exemplos_temas.zip", que contm algumas sugestes de imagens, tanto de cones como de backgrounds, para que voc melhore sua aplicao de fatorao. Use sempre a ltima como ponto inicial. Neste laboratrio, voc vai: 1. Melhorar a aplicao, substituindo o boto por uma imagem (uma imagem "clicvel", como o programa "BioMago" usa para inserir novo registro ajuste a imagem de acordo com a densidade da tela; 2. Centralize a imagem e a caixa de texto. Crie estilos para ambos; 3. Crie fundos de tela para orientaes diferentes;

Tente fazer! Se estiver ameaado(a) de divrcio, no insista! Baixe logo a soluo (http://code.google.com/p/curso-basico-thecodebakers/downloads/list).

Trabalhando com listas Listas so estruturas lineares contendo elementos, dentre os quais podemos escolher qualquer um com soft touch (toque curto) sobre ele. Tambm possvel selecionar o menu de contexto soft-touch de um elemento com touch and-hold (toque longo) sobre ele. touch-and hold

Uma lista uma view do tipo "ListView", e implementada usando um Layout e um Adapter, dentro da classe Java da Activity. Os elementos de uma lista podem ser selecionados com soft touch e podemos criar "Intents" soft-touch contendo a posio do elemento, passando a como "extra" para outra activity. passando-a Montagem de uma lista Abra o projeto "Layouts" (http://code.google.com/p/layout exercise/) para ver a (http://code.google.com/p/layout-exercise/) implementao bsica de uma view. Para comear, temos o arquivo de Layout: arquivo view plain plainprint? 1. <LinearLayout 2. xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android" 3. android:orientation="vertical" android:orientation="vertical" 4. android:layout_width="fill_parent" android:layout_width="fill_parent" 5. android:layout_height="fill_parent" android:layout_height="fill_parent" 6. > 7. <ListView android:id="@android:id/list" android:id="@android:id/list"

8. android:layout_width="fill_parent" 9. android:layout_height="fill_parent" 10. android:layout_weight="1" 11. android:background="#999999" 12. /> 13. 14. <RelativeLayout 15. android:layout_width="fill_parent" 16. android:layout_height="wrap_content" 17. > 18. <ImageView 19. android:layout_width="wrap_content" 20. android:layout_height="wrap_content" 21. android:src="@drawable/terra_icone" 22. android:id="@+id/btnIncuir" 23. android:layout_centerHorizontal="true" 24. ></ImageView> 25. </RelativeLayout> 26. </LinearLayout>

Aqui, combinamos uma "ListVIew" e uma "ImageView", formando uma barra inferior. Isto feito atribuindo-se "1" ao "peso" (android:layout_weight) da "ListView". Assim, possvel a convivncia de ambos, conforme a figura apresentada anteriormente. O preenchimento da lista feito dentro do cdigo-fonte da "Activity": view plainprint? 1. public class ListaComBarra extends Activity { 2. private static final String TAG = "main"; 3. private ListView listView; 4. private String [] lv_arr = new String[3]; 5. private ArrayAdapter<String> adapter = null; 6. 7. @Override 8. public void onCreate(Bundle savedInstanceState) { 9. super.onCreate(savedInstanceState); 10. setContentView(R.layout.listascombarra); 11. listView = (ListView)findViewById(android.R.id.list); 12. listView.setTextFilterEnabled(true); 13. } 14. 15. @Override 16. protected void onStart() { 17. super.onStart(); 18. Resources res = this.getResources(); 19. lv_arr[0] = res.getString(R.string.lista1); 20. lv_arr[1] = res.getString(R.string.lista2);

21. 22.

lv_arr[2] = res.getString(R.string.lista3); adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, l v_arr); 23. listView.setAdapter(adapter); 24. listView.setOnItemClickListener(this); 25. }

O evento "onStart()" invocado quando a Activity vai comear a receber inputs do usurio. Para comear, usamos o "id" da lista padro do Android: "android.R.id.list", porque usamos isto no Layout: "@android:d/list". um padro usar sempre este "id" porque podemos usar Activities especiais (ListActivity), que so assunto para outro curso. Criamos um vetor de Strings e o passamos para uma instncia de "android.widget.ArrayAdapter", que uma classe adaptadora para passar elementos para a ListView. No construtor, passamos uma referncia para a prpria Activity, um formato de layout e o prprio vetor. Pronto! A lista est construda.

Processando seleo de elementos Abra o projeto "BioMago". O usurio seleciona um elemento com "soft-touch", ou seja, clicando sobre o elemento desejado. Uma das maneiras de fazer isto implementar a interface: "android.widget.AdapterView.OnItemClickListener", que oferece o mtodo "onItemClick()" que nos permite saber qual item foi selecionado: view plainprint? 1. @Override 2. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 3. // Houve um soft-touch na lista 4. // Pegamos o elemento e mostramos o biorritmo dele. 5. String elementoBruto = listaElementos.get(arg2); 6. ... 7. }

O terceiro argumento do mtodo (arg2) o ndice do elemento selecionado (comeando em zero). Atravs dele, podemos obter o elemento em uma varivel de instncia e passar para a outra Activity. No momento, preste ateno apenas a esta linha.

Intents com "extras" Podemos "pendurar" informao dentro dos "Intents", passando-as para a Activity seguinte. Por exemplo, eis um cdigo que invoca outra activity passando "extras": view plainprint?

1. 2. 3. 4. 5.

Intent i = new Intent(this.getApplicationContext(), GrafBio.class); i.putExtra("nome", dados[0]); i.putExtra("data", dados[1]); this.startActivity(i);

Agora, veja o cdigo (da activity de destino) que recebe e trata a informao contida nos "extras": view plainprint? 1. Bundle extras = getIntent().getExtras(); 2. if (extras != null) { 3. imagem.setNome(extras.getString("nome"));

Um intent serve para invocar outra Activity da mesma aplicao ou de outra aplicao. Por enquanto, estamos utilizando apenas para invocar Activities internas. Ele tambm pode carregar "Strings" como argumentos para a Activity que est sendo invocada. Assim, podemos passar informaes entre Activities. Na Activity de origem, simplesmente usamos o mtodo "putExtra (String, String)", passando o nome e o valor do String que queremos "pendurar" no Intent. Na Activity de destino, pegamos o "Bundle" (android.os.Bundle) que veio anexado ao "Intent", O mtodo "getIntent()", da classe "Activity" nos permite obter uma referncia para o Intent passado para ela. Podemos at testar se veio algo ou no. O mtodo "getString()" da classe "Bundle", nos permite obter um string atravs do seu nome. Laboratrio 6 Listas Vamos alterar o projeto "Layouts" para usar uma lista na primeira Activity: 1. Altere o layout "main" para usar uma lista, ao invs de TextViews; 2. Na Activity "Principal.java", Crie um vetor de instncia e dentro de "onStart()" o preencha; 3. Implemente "OnItemClickListener" e o mtodo "onItemClick()"; Eis a imagem da nova "cara" da activity:

Extra: se houver tempo, insira uma TextView em pelo menos duas das Activities, mostrando o String que veio no Extra. Passe o nome selecionado.

Tente fazer! Se estiver difcil, siga nosso conselho anterior: sente se em posio de ltus e sente-se medite por 1 hora, fazendo o som: "OOOOMMMMMM"! Caso ainda no consiga, ento baixe logo a soluo (http://code.google.com/p/curso-basico thecodebakers/downloads/list). (http://code.google.com/p/curso basico-thecodebakers/downloads/list http://code.google.com/p/curso thecodebakers/downloads/list

Context Menu

um menu "popup", exibido pela ao touch touch-and-hold (pressionar e segurar) sobre um hold item, que pode ser um elemento de lista. Serve para aes executadas sobre um nico e determinado elemento. Um context menu criado como um recurso de menu, dentro da p asta "res/menu", da mesma pasta maneira que o Options menu. Abra o projeto BioMago e veja o arquivo de menu "menu_contexto.xml": view plain plainprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. <?xml version= version="1.0" encoding="utf-8"?> encoding="utf <menu xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:android="http://schemas.android.com/apk/res/android"> id.com/apk/res/android" <item android:id="@+id/mnuCntExibir" android:id="@+id/mnuCntExibir" android:title="@string/mnu_exibir_grafico" android:title="@string/mnu_exibir_grafico" /> <item android:id="@+id/mnuCntExcluir" android:id="@+id/mnuCntExcluir" android:title="@string/mnu_excluir" android:title="@string/mnu_excluir" /> </menu>

Criamos dois itens neste menu, com os string resources e ids bem identificados. Depois, na Activity, temos que: 1) criar o menu a partir do recurso e 2) interceptar o clique no

menu de contexto. A primeira coisa sobrescrever o mtodo "onCreateContextMenu()", da classe "Activity": view plainprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); Resources res = getResources(); menu.setHeaderTitle(res.getString(R.string.mnu_titulo_menu)); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_contexto, menu); }

Usamos um "MenuInflater" da mesma maneira que fizemos com o Options Menu, passando o identificador do nosso Menu Resource para ele. A diferena que temos que informar um ttulo (que deve ser um resource string), pois menus de contexto sempre possuem um ttulo. No "onCreate()" da Activity, precisamos usar o mtodo: "registerForContextMenu(listView);" Passando a instncia da View que pode gerar menu de contexto. Neste caso, passamos a instncia da ListView que criamos em nosso Layout. Para interceptar o clique em um menu de contexto, sobrescrevemos o mtodo: "onContextItemSelected()", da classe "Activity". Eis o exemplo do BioMago: view plainprint? 1. @Override 2. public boolean onContextItemSelected(MenuItem item) { 3. AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 4. final Elemento elemento = (Elemento)bo.getListaPessoas().get(info.position); 5. SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance(); 6. sdf.applyPattern("dd/MM/yyyy"); 7. switch (item.getItemId()) { 8. case R.id.mnuCntExibir: 9. Intent i = new Intent(this.getApplicationContext(), GrafBio.class); 10. i.putExtra("nome", elemento.getNome()); 11. i.putExtra("data", sdf.format(elemento.getNascimento())); 12. this.startActivity(i); 13. return true; 14. case R.id.mnuCntExcluir: 15. Resources res = getResources(); 16. String txtSim = res.getString(R.string.txtSim); 17. String txtNao = res.getString(R.string.txtNao); 18. new AlertDialog.Builder(this).setMessage(R.string.msg_confirmar_exclusao) 19. .setPositiveButton(txtSim, new DialogInterface.OnClickListener() { 20. public void onClick(DialogInterface dialog, int which) { 21. comandarExclusao(elemento);

22. } }) 23. .setNegativeButton(txtNao, new DialogInterface.OnClickListener() { 24. public void onClick(DialogInterface dialog, int which) { 25. return; 26. } }) 27. .show(); 28. 29. return true; 30. default: return super.onContextItemSelected(item); 31. } 32. }

Usamos um "AdapterContextMenuInfo" para obter a posio do elemento na lista. Pode ser a propriedade "id", que retorna o id do elemento na lista, ou a propriedade "position", que retorna a posio do elemento dentro da lista (comeando de zero). Tudo depende de como voc quer localizar o elemento selecionado.

Instalao de aplicaes no seu dispositivo mvel Podemos instalar aplicaes de 3 maneiras: A partir do Android Market Copiando para o aplicativo (via Astro ou semelhante) Utilizando o progama "ADB" Enquanto voc estiver desenvolvendo e testando sua aplicao, melhor usar o utilitrio "ADB" Antes de passarmos o laboratrio, pensamos que seria o momento de conversar sobre mais funcionalidades do utilitrio "ADB". Como este um curso bsico, no queremos ficar perdendo tempo explicando detalhes que no interessam. O objetivo, neste momento, que voc crie aplicaes o mais rapidamente possvel. Porm, chegou a hora de instalarmos as aplicaes no seu dispositivo mvel (Celular ou Tablet). Se voc ainda no tem um dispositivo com Android, pode pular esta parte, embora possa utilizar o "ADB" para instalar em um emulador. O ADB fica na subpasta "platform-tools", dentro da pasta onde o Android SDK est instalado. Para utiliz-lo, necessrio abrir um "prompt de comandos" (ou janela "Terminal", se estiver utilizando Linux). Com o ADB podemos fazer diversas tarefas, entre elas: Instalar uma aplicao, seja em um dispositivo real ou em uma instncia de emulador; Encaminhar portas TCPForwarding Ports; Copiar arquivos de/para um dispositivo ou instncia de emulador; Abrir um Shell de comandos para o dispositivo ou emulador;

Ns j vimos como listar os dispositivos/emuladores ativos (adb devices), e tambm como

ativar a janela de log (adb logcat). Agora, o que nos interessa como instalar aplicativos no seu dispositivo. O ADB uma aplicao distribuda, que roda em trs partes: Cliente: que permite enviar comandos ou pegar informaes de um dispositivo. O Cliente executado no seu desktop, ativado pelo comando "adb"; Servidor: que roda como um "daemon" (um servio) no seu desktop, de modo a permitir a comunicao entre o Cliente e o Dispositivo; Remoto: que roda como um "daemon" no dispositivo/emulador, se comunicando com o Servidor do seu desktop;

Criao de certificado e assinatura de cdigo A assinatura digital de uma aplicao protege seus usurios ao garantir que ela autntica e que no foi adulterada. Antes de instalar necessrio assinar digitalmente o seu APK. Se voc no fizer isto, no poder instalar via ADB, embora seja possvel executar copiando o APK diretamente para seu dispositivo. A tendncia do projeto Android acabar com o uso de aplicaes sem assinatura digital, logo, recomendamos que voc sempre assine. Para assinar, preciso um certificado digital de Code Signing ou Assinatura de Cdigo (para saber mais: http://www.di.ufpe.br/~flash/ais98/cripto/criptografia.htm). Voc tem duas opes: adquirir um certificado emitido por uma Autoridade Certificadora reconhecida, ou criar um certificado auto-assinado. Para adquirir um certificado de assinatura de cdigo, voc pode procurar boas empresas, como estas abaixo: Serasa: Validade 12 meses: R$ 1.255,20 (*) Verisign: Validade 12 meses: US$ 499,00 (*) Thawte: Validade 12 meses: US$ 299,00 (*) (*) A validade e os preos podem variar. Estas cotaes estavam disponveis on-line (nas pginas das empresas) e foram obtidas em Junho de 2011. Existem vrias empresas no Brasil, como a Comodo, a CertSolutions e a Certisign, e voc pode contat-las para obter informaes sobre certificados de Code Signing para aplicaes Java.

Certificado auto-assinado Voc pode emitir um certificado e assinar seu cdigo com ele. Isto garante que o seu cdigo no foi violado, mas apenas para voc mesmo. Porm, quem garante aos outros que voc quem diz ser? Quem garante que o Certificado realmente pertence a voc? por isso que recomendamos a aquisio e uso de um certificado de Assinatura de Cdigo emitido por uma empresa reconhecida. A compra e instalao de um certificado de Assinatura de Cdigo um processo complexo.

Futuramente, quando tivermos "grana" para ter um destes, vamos publicar um artigo explicando este processo. Porm, os custos so altos. Ns mesmos no tivemos condies de comprar um certificado desses at agora! Estamos usando certificado auto-assinado em nossas aplicaes. E para desenvolvimento e teste esta a melhor opo. Se o seu produto for remunerado, ento pode comprar um Certificado e diluir o custo na formao do seu preo. O ADT ajuda voc a gerar um certificado auto assinado.

Gerando um pacote APK assinado Selecione o seu projeto na janela "Package Explorer" (ou "Project Explorer"), da sua workspace "eclipse", clique com o boto direito. No menu de contexto, selecione "Android tools" e "Export signed application package" (exportar pacote de aplicao assinado). A janela "Export Android Application" vai aparecer e voc dever selecionar seu projeto e clicar "next". Se voc j possui uma "keystore" (um arquivo que armazena certificados) e sabe a senha, ento s informar o caminho e digitar a senha. Agora, se ainda no tem uma "keystore", deve criar uma. Preencha os dados da tela e guarde muito bem a senha escolhida. Tome cuidado com o campo "Validity (years)", pois o Android Market exige que o certificado expire depois de 22 de Outubro de 2033. Pronto! Seu APK est gerado e assinado.

Instalando no dispositivo via ADB Recomendamos fechar o "eclipse" e todas as instncias de emulador que estiverem ativas (a no ser que voc queira realmente instalar no emulador!) Depois, conecte o dispositivo na USB (veja o artigo: Desenvolvendo diretamente no dispositivo Android para saber detalhes da configurao USB). Abra uma janela "Prompt de comandos" (ou "Terminal", se for Linux). Abra a pasta onde o Android SDK est instalado e a subpasta "platform-tools". Digite o comando: adb install -r <path-do-APK-assinado> Se voc estiver utilizando Linux, digite "./" antes do "adb". Agora s executar diretamente a aplicao do seu dispositivo.

Laboratrio 7 Context menu

Crie um context menu no projeto do lab 6. As opes sero: Mostrar Item e Ajuda. claro que voc vai ter que criar uma Activity de Ajuda tambm! Voc j sabe o que vamos dizer, no ? Tem que tentar! Como vai criar o prximo "Angry birds" se no se esforar para fazer os laboratrios? Bem, se esse argumento ainda no te convenceu, ento baixe a soluo (http://code.google.com/p/curso-basicothecodebakers/downloads/list).

Lio 11: Persistencia e retorno de activities


Persistncia Podemos ler e gravar dados de vrias formas: Propriedades Bancos de Dados SQLite Arquivos de dados

Neste curso, vamos apenas gravar arquivos internos, na memria do aparelho. H vrias maneiras de ler e gravar dados em um dispositivo Android. Podemos gravar propriedades particulares da aplicao, propriedades compartilhadas, Bancos de Dados SQLite, arquivos dentro do dispositivo e arquivos dentro do SD Card. Neste curso, veremos como gravar arquivos dentro da memria interna do dispositivo. Por que? Porque ele fcil, simples e atende a 90% das necessidades. E a gravao de arquivos e a mesma sendo em armazenamento interno ou removvel. Deixaremos bancos de dados SQLite, propriedades e SD Card para outro curso.

Arquivos internos Para lidar com arquivos internos, usamos os mtodos: "openFileOutput" e "openFileInput", da classe Activity. Vamos ver como criar ou gravar arquivos: view plainprint? 1. FileOutputStream fos = 2. this.openFileOutput("dados.txt", 3. Context.MODE_PRIVATE); 4. OutputStreamWriter owr = new OutputStreamWriter(fos); 5. PrintWriter bw = new PrintWriter(owr); 6. bw.println("BOM DIA"); 7. bw.flush(); 8. bw.close(); 9. owr.close(); 10. fos.close();

Um arquivo ser criado dentro de /data/data/./files: /data/data/br.com.thecodebakers.lab08/files. O mtodo "openFileOutput" pode criar arquivos dentro do diretrio interno da aplicao. O parmetro "mode" uma constante que significa:

Context.MODE_PRIVATE Vai criar um arquivo ou sobrescrever. E vai torn-lo privado da sua aplicao. Context.MODE_APPEND Vvai adicionar dados a um arquivo existente. Context.MODE__WORLD_READABLE Vpermite que outras aplocaes leiam o arquivo. Context.MODE_WORLD_WRITEABLE Vpermite que outras aplicaes gravem no arquivo. Para leitura, usamos o mtodo "openFileInput()", que retorna uma instncia de "FileInputStream" com o arquivo que desejamos ler: view plainprint? 1. FileInputStream fin = this.openFileInput("dados.txt"); 2. InputStreamReader ir = new InputStreamReader(fin); 3. BufferedReader br = new BufferedReader(ir); 4. StringBuffer texto = new StringBuffer(); 5. while (true) { 6. String lido = br.readLine(); 7. if (lido == null) { 8. break; 9. } 10. texto.append(lido); 11. }

SQLite SQLite um "engine" de banco de dados "embutido", ou seja, para ser utilizado DENTRO de outras aplicaes. Ele no possui servidor e apenas uma biblioteca de funes de banco de dados, com SQL e mecanismo de controle de transaes. Alm disto, totalmente domnio pblico. O Android j inclui a biblioteca do SQLite e possui alguns pacotes para facilitar seu uso. android.database.sqlite.*. Ns no vamos abordar SQLite neste curso (embora tenhamos a inteno de criar um curso separado), porm, se quiser ver um exemplo em ao, Baixe o projeto Hrcules Password Protector, adicionando o repositrio: http://code.google.com/p/hercules-password-protector.

Invocando activities e recebendo retorno No Android nada sncrono ou modal. Pois, ao construirmos aplicaes desta forma, prendemos recursos desnecessariamente, o que aumenta o consumo de bateria em dispositivos mveis. Sabemos que podemos passar "extras" dentro de um "Intent", mas como receber o resultado

de outra Activity? Por exemplo, abrimos uma Activity para que o usurio selecione o contato desejado etc. Criamos um exemplo para demonstrar isto. Este processo envolve duas Activities: uma ser a principal e a outra ser a sub-activity. A principal invoca a sub e aguarda um resultado. Baixe o exemplo "sub.zip" (http://code.google.com/p/curso-basicothecodebakers/downloads/detail?name=sub.zip&can=2&q=). Veja o cdigo da Activity principal que invoca a sub-activity: view plainprint? 1. public void chamar(View view) { 2. Intent i = new Intent(this.getApplicationContext(),Outra.class); 3. startActivityForResult(i, CODIGO_SUBATIVIDADE); 4. }

O mtodo "startActivityForResult()" invoca um callback especial quando a sub-atividade finalizada: "onActivityResult()". Note que passamos um "Intent" e um literal inteiro. Atravs do "Intent", podemos identificar qual a Activity que est sendo invocada e podemos at mesmo passar parmetros. O literal "int" um cdigo para nos informar qual foi a Activity que invocou "onActivityResult()": view plainprint? 1. @Override 2. protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3. super.onActivityResult(requestCode, resultCode, data); 4. if (requestCode == CODIGO_SUBATIVIDADE) { 5. Bundle extras = data.getExtras(); 6. String texto = extras.getString("valor"); 7. new AlertDialog.Builder(this) 8. .setMessage(texto) 9. .setTitle(R.string.titulo) 10. .setNeutralButton("OK", new DialogInterface.OnClickListener() { 11. public void onClick(DialogInterface dialog, int which) { 12. } 13. }) 14. .show(); 15. } 16. }

A sub-activity pode exibir uma lista de seleo ou mesmo fazer qualquer outra coisa. Ao concluir, ela ter que ser finalizada (invocando o mtodo "finish()"). Eis o nosso exemplo: view plainprint? 1. public void fechar (View view) { 2. txt = (EditText) this.findViewById(R.id.txt1);

3. 4. 5. 6. 7.

Intent retorno = new Intent(); retorno.putExtra("valor" retorno.putExtra("valor", txt.getText().toString()); setResult(RESULT_OK, retorno); finish(); }

Desta forma, a Activity principal vai ser acionada e vai receber um "Intent" com dados. um

Laboratrio 8 Arquivos Crie uma aplicao que leia e grave um arquivo texto. No momento em que a activity for iniciada, procure por um arquivo interno. Se ele existir, carregue uma EditText com seu contedo. Se no existir, mostre uma mensagem na EditText. O usurio poder digitar alguma coisa e clicar em um boto para salvar no arquivo. Eis uma proposta de Activity:

Esse o ltimo laboratrio. O projeto final no ter soluo publicada, logo, sua ltima chance! Caso ainda no esteja convencido, ento baixe a soluo (http://code.google.com/p/curso http://code.google.com/p/curso le.com/p/curso-basico-thecodebakers/downloads/list thecodebakers/downloads/list). thecodebakers/downloads/list

Projeto final Vamos criar uma lista de compras! Normalmente, quando vamos ao mercado, precisamos

criar uma lista de compras, que voc possa utilizar no Supermercado. Deve haver uma lista de produtos mais comuns, os quais o usurio pode selecionar para comprar. Ao comprar, o produto deve ser marcado na lista, para evitar confuso. Voc pode criar um arquivo com a lista de itens a serem comprados e marcar se j comprou. Crie um arquivo interno para a lista e voc poder editar este arquivo. Lembre-se de criar imagens, cones, fundo etc. A beleza e usabilidade que sero os principais atrativos do seu software. Para este projeto no haver "cola"! Voc dever implementar sozinho(a), de modo a testar seus conhecimentos. Depois, se ficar "irado", faa upload para o Android Market! T na hora de transformar o tempo investido no curso em grana!

You might also like