Você está na página 1de 62

Lio 1: Desenvolvimento para Android

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 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
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 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.

Abaixo da camada de framework, temos as bibliotecas de servios, como OpenGL e
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
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.

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 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

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.

As Views podem gerar e receber Eventos, que podem ser interceptados no 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 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 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.

A criao de Broadcast Receivers est fora do escopo deste curso.

Lio 2: Ambiente de desenvolvimento
Android APK

Para ser executada e distribuda, sua aplicao Android tem que ser empacotada dentro
de um 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-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;
Arquivo arsc. Este contm os strings e uma tabela com todas as entradas do
diretrio res, em formato binrio;

Antes de instalar um APK, voc deve assin-lo digitalmente. Isto pode ser feito com um
certificado de assinatura de cdigo ou com uma chave auto-assinada.

O processo de montagem manual de um APK bastante complexo e est fora do escopo
deste 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
dispositivos mais adiante.



Dentro da pasta /data/dalvik-cache, temos os arquivos .dex acessados, e dentro da
pasta /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:
o Windows: http://dl.google.com/android/android-sdk_r10-windows.zip
o Mac: http://dl.google.com/android/android-sdk_r10-mac_x86.zip
o Linux: http://dl.google.com/android/android-sdk_r10-linux_x86.tgz
Baixar o plug-in ADT: configurar eclipse update site: "https://dl-
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 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.

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
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 / SDK and AVD Manager do eclipse);
Platform-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:


Lio 3: Obtendo e analisando um projeto pronto
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 Version API level
(no code name) 1.0 API level 1
(no code name) 1.1 API level 2
Cupcake 1.5 API level 3, NDK 1
Donut 1.6 API level 4, NDK 2
Eclair 2.0 API level 5
Eclair 2.0.1 API level 6
Eclair 2.1 (incl. 2.1-update 1) API level 7, NDK 3
Froyo 2.2.x API level 8, NDK 4
Gingerbread 2.3 - 2.3.2 API level 9, NDK 5
Gingerbread 2.3.3 - 2.3.4 API level 10
Honeycomb 3.0 API level 11
Honeycomb 3.1 API level 12


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. Clique no menu "Help / Install New Software...";
2. Clique no boto "Add..." para adicionar o update site;
3. Informe a URL: "http://subclipse.tigris.org/update_1.6.x" e adicione;
4. Feche a Janela e selecione o site recm-adicionado;
5. 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
Wikipedia: http://pt.wikipedia.org/wiki/Subversion.


Um projeto no eclipse

Agora, sente-se em posio de ltus, respire fundo e murmure: "Ohmmmmmm", ou
seja, 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 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, 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
projeto, analisar o cdigo-fonte e executar no emulador.

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:
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 do avd];
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 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 (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? 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-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.





Lio 4: Criando sua primeira aplicao Android
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:

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").

Examinando o cdigo-fonte gerado

Pera... Ns no escrevemos nada! Como pode haver cdigo-fonte?

O plug-in "ADT" gera uma aplicao "Hello World" automaticamente, logo, todo o
cdigo-fonte 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 animaes
sejam pausadas e 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 uma caixa de
dilogo aberta (ou uma janela de notificao). J uma activity em estado "Stopped" foi
completamente ocultada por outra Activity, por exemplo, neste comando:
view plainprint?
1. public void clicouLinear(View view) {
2. Intent i = new Intent (this.getApplicationContext(), LinearDemo.class);
3. this.startActivity(i);
4. }

Ao executar a linha com a chamada: "startActivity()", a atividade a qual este cdigo-
fonte pertence passar a ficar em estado "Stopped", pois acaba de iniciar outra Activity.

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, 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).


Lio 5: Layout e interface com usurio
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"
31. android:text="@string/with_images"
32. android:onClick="clicouWithImages"
33. />
34. <TextView
35. style="@style/titulo_link.laranja1"
36. android:layout_width="fill_parent"
37. android:layout_height="wrap_content"
38. android:text="@string/dontDoIt01"
39. android:onClick="clicouDont01"
40. />
41. <TextView
42. style="@style/titulo_link.piscina"
43. android:layout_width="fill_parent"
44. android:layout_height="wrap_content"
45. android:text="@string/dontDoIt02"
46. android:onClick="clicouDont02"
47. />
48. <TextView
49. style="@style/titulo_link.amarelo"
50. android:layout_width="fill_parent"
51. android:layout_height="wrap_content"
52. android:text="@string/listacombarra"
53. android:onClick="clicouLista"
54. />
55. </LinearLayout>

Todo layout um arquivo ANDROID XML, cujo nome deve comear com letras
minsculas, 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. Execute a 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. public static final class id {
9. ...
10. public static final int txtNome=0x7f07000a;
11. ...
12. }
13. public static final class layout {
14. ...
15. }
16. public static final class menu {
17. ...
18. }
19. public static final class string {
20. ...
21. }
22. public static final class style {
23. ...
24. }
25. }

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.OnClick
Listener() {
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);
b
Uma EditView que receba o nmero digitado (deve apenas receber nmeros e
deve 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 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 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:



Implementao do Crivo
view plainprint?
1. package br.nom.sampaio.cleuton.factorwiz;
2. import java.util.ArrayList;
3. import java.util.Iterator;
4. import java.util.List;
5. import android.view.View;
6.
7. public class FatoracaoBO {
8. private static List<Long> primos;
9. private static long sinalUltimo = 1;
10. public static String fatorar (long numero) {
11. String resultado = null;
12.
13. if (numero == 0) {
14. resultado = "0";
15. }
16. else {
17. if (numero > 0 && numero < 3) {
18. resultado = Long.toString(numero);
19. }
20. else {
21. Long valor = numero;
22. if (numero < 0) {
23. sinalUltimo = -1;
24. valor = numero * (-1);
25. }
26.
27. primos = crivo(valor);
28. resultado = calcular(valor);
29. }
30. }
31.
32. return resultado;
33. }
34.
35. private static String calcular(Long numero) {
36. String resultado = "";
37. Long valor = numero;
38.
39. Iterator<Long> it = primos.iterator();
40. Long primo = it.next();
41.
42. while (valor > 1) {
43. long resto = valor % primo;
44. if (resto > 0) {
45. primo = it.next();
46. }
47. else {
48. if (resultado.length() > 0) {
49. resultado += "x";
50. }
51. valor = valor / primo;
52. if (valor == 1) {
53. primo = primo * sinalUltimo;
54. }
55. resultado += Long.toString(primo);
56. }
57. }
58.
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. }


Lio 6: Internacionalizao e localizao
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. public static final int txtNumero=0x7f050000;
11. }
12. public static final class layout {
13. public static final int main=0x7f030000;
14. }
15. public static final class string {
16. public static final int app_name=0x7f040001;
17. public static final int fatorar=0x7f040004;
18. public static final int hello=0x7f040000;
19. public static final int numero=0x7f040002;
20. public static final int resultado=0x7f040003;
21. }
22. }

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


Lio 7: menus e estilos
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/).



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


Cada elemento "item" uma entrada de menu, cujo rtulo est na propriedade:
"android: title". Note tambm que foram atribudos "ids" a cada elemento, de modo que
possam ser referenciados no cdigo-fonte.

Podemos ter cones no meu, mas teremos que fornecer as imagens, ou utilizar as que
esto no Android. Por exemplo:



view plainprint?
1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
3.
4. <item android:id="@+id/mnuIncluirRegistro"
5. android:icon="@android:drawable/ic_menu_add"
6. android:title="@string/mnu_novo_registro" />
7.
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. @Override
2. public boolean onCreateOptionsMenu(Menu menu) {
3. MenuInflater inflater = getMenuInflater();
4. inflater.inflate(R.menu.menu_lista, menu);
5. return true;
6. }


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. @Override
2. public boolean onOptionsItemSelected(MenuItem item) {
3. switch (item.getItemId()) {
4. case R.id.mnuIncluirRegistro:
5. this.incluirRegistro(null);
6. return true;
7. case R.id.mnuAjuda:
8. Intent i = new Intent (this.getApplicationContext(),
9. 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. Crie um string resource: "ajuda", com os textos apropriados em Portugus e
Ingls!
2. Crie uma pasta "menu", dentro da pasta "res";
3. Selecione a pasta "menu" e crie um novo Android XML File, do tipo "menu";
4. 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. <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. />


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".

Lio 8: Temas e imagens
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. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2. package="br.com.thecodebakers.biomago"
3. android:versionCode="01010001"
4. android:versionName="@string/NOME_VERSAO">
5.
6. <uses-sdk android:minSdkVersion="7" />
7. <uses-
permission android:name="android.permission.WRITE_EXTERNAL_STORA
GE" />
8. <application android:icon="@drawable/icon" android:label="@string/NOME_V
ERSAO">
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 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
criada l, 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 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): 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
("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 o comando: ./emulator -avd <nome do avd>;
Para Windows
1 - Abra a pasta onde instalou o Android-SDK e v para a subpasta "tools"; 2 -
Digite o comando: emulator -avd <nome do 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/providing-
resources.html#AlternativeResources). Vamos reproduzir aqui os mais importantes:

sufixo

Exemplo

Descrio

Idioma
e regio

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

Idioma
e regio dos recursos contidos nesta pasta

Tamanho
de tela

-small,
-normal, -large, -xlarge

Recursos
classificados por tamanho de tela

Orientao

-port,
-land

Orientao
da tela, se est "em p": portrait, ou "deitada":
landscape

Densidade

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

De
acordo com a densidade da tela. Se no for
importante, use
"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-basico-
thecodebakers/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).

Lio 9: Listas
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 de um elemento com touch-and-hold (toque longo) sobre ele.



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" contendo a posio do elemento, passando-a como "extra" para outra activity.

Montagem de uma lista

Abra o projeto "Layouts" (http://code.google.com/p/layout-exercise/) para ver a
implementao bsica de uma view. Para comear, temos o arquivo de Layout:
view plainprint?
1. <LinearLayout
2. 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. <ListView 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. lv_arr[2] = res.getString(R.string.lista3);
22. adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_ite
m_1, lv_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. Intent i = new Intent(this.getApplicationContext(),
2. GrafBio.class);
3. i.putExtra("nome", dados[0]);
4. i.putExtra("data", dados[1]);
5. 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 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).

Lio 10: Context menu e instalao de aplicaes
Context Menu



um menu "popup", exibido pela ao touch-and-hold (pressionar e segurar) sobre
um 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 pasta "res/menu", da
mesma maneira que o Options menu. Abra o projeto BioMago e veja o arquivo de menu
"menu_contexto.xml":
view plainprint?
1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
3.
4. <item android:id="@+id/mnuCntExibir"
5. android:title="@string/mnu_exibir_grafico" />
6.
7. <item android:id="@+id/mnuCntExcluir"
8. android:title="@string/mnu_excluir" />
9. </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. @Override
2. public void onCreateContextMenu(ContextMenu menu, View v,
3. ContextMenuInfo menuInfo) {
4. super.onCreateContextMenu(menu, v, menuInfo);
5. Resources res = getResources();
6. menu.setHeaderTitle(res.getString(R.string.mnu_titulo_menu));
7. MenuInflater inflater = getMenuInflater();
8. inflater.inflate(R.menu.menu_contexto, menu);
9. }

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.getDateInstan
ce();
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-basico-
thecodebakers/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-basico-
thecodebakers/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. Intent retorno = new Intent();
4. retorno.putExtra("valor", txt.getText().toString());
5. setResult(RESULT_OK, retorno);
6. finish();
7. }

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


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-basico-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.