Upload
felicianosantos2394
View
232
Download
0
Embed Size (px)
Citation preview
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
1/61
por tila Camura
2a Edio
27 de outubro de 2012
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
2/61
ii
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
3/61
Sumrio
1 Preparando o Ambiente de Desenvolvimento 1
1.1 Introduo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1 Java JDK 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2.2 Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2.3 Android 2.2 API 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2.4 Android Virtual Device (AVD) . . . . . . . . . . . . . . . . . . . . . 41.2.5 Eclipse Juno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.6 Plugin ADT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.7 Sqlite3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.8 Sqliteman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.9 Inkscape. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 Exemplo prtico 9
2.1 Primeira aplicao - Contatos . . . . . . . . . . . . . . . . . . . . . . . . . . 92.1.1 AndroidManifest.xml. . . . . . . . . . . . . . . . . . . . . . . . . . . 92.1.2 Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1.3 Formulrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.1.4 Construindo o Model da aplicao . . . . . . . . . . . . . . . . . . . 142.1.5 Mostrando os dados na View . . . . . . . . . . . . . . . . . . . . . . 162.1.6 Editando dados existentes . . . . . . . . . . . . . . . . . . . . . . . . 20
3 Livro de Receitas 23
3.1 Mostrando Dilogos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.1.1 Editar/Excluir ao clicar e segurar na ListView . . . . . . . . . . . . 23
3.1.2 Dilogo de confirmao . . . . . . . . . . . . . . . . . . . . . . . . . 253.1.3 Entrada de diferentes tipos de dados . . . . . . . . . . . . . . . . . . 273.1.4 Validao de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.1.5 Fazendo uma ligao . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.1.6 Enviando e-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2 Internacionalizao (i18n) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.2.1 Forando regio para teste. . . . . . . . . . . . . . . . . . . . . . . . 323.2.2 Forando regio pelo emulador . . . . . . . . . . . . . . . . . . . . . 33
3.3 Utilizando as Preferncias do Android . . . . . . . . . . . . . . . . . . . . . 333.3.1 Atualizando colunas de uma tabela . . . . . . . . . . . . . . . . . . . 343.3.2 Array de Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.3 Spinner, dilogo de seleo . . . . . . . . . . . . . . . . . . . . . . . 36
iii
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
4/61
iv SUMRIO
3.3.4 A classe PreferenceActivity . . . . . . . . . . . . . . . . . . . . . . . 373.4 Grupo de Contatos usando Grid . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.1 Layout usando GridView . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.2 Activity para visualizar os Grupos . . . . . . . . . . . . . . . . . . . 423.4.3 Implementando o Adapter . . . . . . . . . . . . . . . . . . . . . . . . 453.4.4 Selecionando contatos de um determinado grupo . . . . . . . . . . . 46
A Sobre o Autor 49
Glossrio 51
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
5/61
Lista de Cdigos-fonte
1 Exemplo de banco de dados [exemplo-bd.sql] . . . . . . . . . . . . . . . . . 72 Exemplo de querycom subquery [exemplo-bd.sql] . . . . . . . . . . . . . . . 73 Projeto inicial [AndroidManifest.xml]. . . . . . . . . . . . . . . . . . . . . . 94 Layout principal [res/layout/main.xml]. . . . . . . . . . . . . . . . . . . . . 10
5 Menu principal [res/menu/main menu.xml] . . . . . . . . . . . . . . . . . . 106 Definir layout [MainActivity.java] . . . . . . . . . . . . . . . . . . . . . . . . 117 Criando o menu [MainActivity.java]. . . . . . . . . . . . . . . . . . . . . . . 128 Formulrio principal [res/layout/salvar.xml] . . . . . . . . . . . . . . . . . . 139 Mudando de Activity [MainActivity.java]. . . . . . . . . . . . . . . . . . . . 1410 Utilizando EditTexts [SalvarActivity.java] . . . . . . . . . . . . . . . . . . . 1411 Mapear SalvarActivity [AndroidManifest.xml] . . . . . . . . . . . . . . . . . 1412 Helper da aplicao [ContatoHelper.java]. . . . . . . . . . . . . . . . . . . . 1513 Criar novo contato [ContatoHelper.java] . . . . . . . . . . . . . . . . . . . . 1514 Fim da iterao criar contato [SalvarActivity.java] . . . . . . . . . . . . . . 1615 Layout para cada linha da lista [res/layout/linha.xml] . . . . . . . . . . . . 17
16 Listar contatos existentes [ContatoHelper.java] . . . . . . . . . . . . . . . . 1817 Classe Holder [MainActivity.java] . . . . . . . . . . . . . . . . . . . . . . . . 1818 Classe Adapter [MainActivity.java] . . . . . . . . . . . . . . . . . . . . . . . 1919 Popular ListView [MainActivity.java] . . . . . . . . . . . . . . . . . . . . . . 2020 Passagem de parmetros [MainActivity.java]. . . . . . . . . . . . . . . . . . 2121 Ler e atualizar dados existentes [ContatoHelper.java] . . . . . . . . . . . . . 2122 Usando Activity para criar ou atualizar [SalvarActivity.java] . . . . . . . . . 2223 Deletar dados existentes [ContatoHelper.java] . . . . . . . . . . . . . . . . . 2324 Adicionar Listener para click longo [MainActivity.java] . . . . . . . . . . . . 2425 Dilogo de confirmao ao deletar contato [MainActivity.java] . . . . . . . . 2626 Distino de dados [res/layout/salvar.xml] . . . . . . . . . . . . . . . . . . . 2827 Validao dos dados [SalvarActivity.java]. . . . . . . . . . . . . . . . . . . . 2928 Permisso de realizar chamadas [AndroidManifest.xml] . . . . . . . . . . . . 3029 Item chamar no dilogo [MainActivity.java] . . . . . . . . . . . . . . . . . . 3130 Item enviar e-mail no dilogo [MainActivity.java] . . . . . . . . . . . . . . . 3231 Forando regio [SalvarActivity.java] . . . . . . . . . . . . . . . . . . . . . . 3332 Nova coluna grupo na base de dados [ContatoHelper.java] . . . . . . . . . . 3433 Modificao nas queries [ContatoHelper.java] . . . . . . . . . . . . . . . . . 3534 Array de Strings [strings.xml] . . . . . . . . . . . . . . . . . . . . . . . . . . 3635 Adicionando elemento Spinner [res/layout/salvar.xml] . . . . . . . . . . . . 3636 Utilizao de Spinner [SalvarActivity.java] . . . . . . . . . . . . . . . . . . . 37
37 XML descrevendo layout de preferncias [res/xml/preferencias.xml]. . . . . 38
v
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
6/61
vi LISTA DE CDIGOS-FONTE
38 Activity para mostrar preferncias [EditarPreferencias.java] . . . . . . . . . 3839 Mapeando Activity EditarPreferencias [AndroidManifest.xml] . . . . . . . . 3840 Adicionar item Preferncias ao menu principal [res/menu/main
menu.xml] . 39
41 Ir para Preferncias pelo menu principal [MainActivity.java] . . . . . . . . . 3942 Mudana em mtodo irParaSalvar [MainActivity.java] . . . . . . . . . . . . 4043 Obtem o valor padro definido nas Preferncias [SalvarActivity.java] . . . . 4044 Item do Layout de Grupos [res/layout/grupos
item.xml] . . . . . . . . . . . 41
45 Layout de Grupos [res/layout/grupos.xml] . . . . . . . . . . . . . . . . . . . 4246 Activity para visualizar Grupos [GruposActivity.java]. . . . . . . . . . . . . 4247 Adapter responsvel por cada item do Grid [GruposActivity.java] . . . . . . 4348 implementao do Adapter [GruposActivity.java] . . . . . . . . . . . . . . . 4549 Mtodo listar com parmetro grupo [ContatoHelper.java] . . . . . . . . . . 4650 Evento de clique em um item dogrid [GruposActivity.java] . . . . . . . . . 4751 Captura de parmetro vindo de GruposActivity[MainActivity.java] . . . . 47
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
7/61
Lista de Tabelas
1.1 Tipos de dados do Sqlite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1 Conveno para nome dos cones . . . . . . . . . . . . . . . . . . . . . . . . 11
3.1 Paleta de cores do Android . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.2 Localizao e tamanho dos cones . . . . . . . . . . . . . . . . . . . . . . . . 44
vii
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
8/61
viii LISTA DE TABELAS
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
9/61
Lista de Figuras
2.1 Layout linha da Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1 Tela de Grupos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
ix
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
10/61
x LISTA DE FIGURAS
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
11/61
Captulo 1
Preparando o Ambiente deDesenvolvimento
1.1 Introduo
O desenvolvimento de aplicativos para a plataforma Android feito na linguagem Java.Para esta apostila sero utilizados os seguintes aplicativos e bibliotecas:
Ubuntu 10.04 ou 12.04
Java JDK 6 ou 7
Android SDK
Android 2.2 API 8
Eclipse Juno
ADT Plugin
Sqlite3
Sqliteman
Inkscape
Voc pode estar se perguntando: Por que utilizar essa configurao?. Bom, paracomear um ambiente de desenvolvimento precisa ser estvel, e para isso nada melhor queo http://releases.ubuntu.com/lucid/(Ubuntu 10.04) ou ainda o http://releases.ubuntu.com/precise/ (Ubuntu 12.04) por seremLTS.
AIDE Eclipse funciona independente do sistema operacional, ento podemos utilizara verso mais recente. O mesmo para o plugin ADT.
Usaremos especificamente para os exemplos a seguir a verso 2.2 do Android. EssaAPI uma tima escolha inicial, pois a mais utilizada pelos aparelhos mais simples querodam Android. claro que voc poder instalar outras verses e compilar seus aplicativos
para tablets, etc.
1
http://releases.ubuntu.com/lucid/http://releases.ubuntu.com/precise/http://releases.ubuntu.com/precise/http://releases.ubuntu.com/precise/http://releases.ubuntu.com/precise/http://releases.ubuntu.com/lucid/7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
12/61
2 CAPTULO 1. PREPARANDO O AMBIENTE DE DESENVOLVIMENTO
1.2 Instalao
A instalao do Java JDK 6 no Ubuntu 10.04 no a mesma que no Ubuntu 12.04. Isso
porque na poca de lanamento do lucid, em 2010, a empresa que desenvolvia o Javaera a Sun Microsystems, que tinha um canal nos repositrios do Ubuntu como parceira(partner). Ainda em 2010 a empresa Oracle comprou a Sun junto com seu software ehardware. Nesse ponto o canal de parceria foi desligado.
Discusses a parte, vamos ver as duas maneiras de instalar o Java.
1.2.1 Java JDK 6
A instalao do Java no Ubuntu 10.04 bastante simples. Voc apenas ir precisar habili-tar repositrio de terceiros, ouPartner. Isso pode ser feito atravs do aplicativoSynaptic.No menu principal do Ubuntu clique em Sistema Administrao Gerenciadorde pacotes Synaptic.
No menu do Synaptic clique em Configurao Repositrios. Na aba OutroSoftwaretemos vrios itens que representam repositrios. Marque os dois repositrios queterminam com partner. Feche e depois clique em Editar Recarregar informaesdos pacotesou simplesmente Ctrl + R.
Aps a atualizao dos pacotes existentes nos repositrios j possvel encontrar oJava JDK 6. No campo de Pesquisa rpida digite: sun-java6. Clique com botodireito no pacote sun-java6-jdke selecione a opo Marcar para instalao. Depoisbasta Aplicar as mudanas. Para isso clique em Editar Aplicar as alteraesmarcadas ou Ctrl + P.
Para a instalao no Ubuntu 12.04 temos que habilitar um repositrio de terceiros,tambm conhecido comoPPA(Personal Package Archives). Abra um terminal e executeos passos a seguir para adicionar um repositrio e instalar o Java:
$ sudo su
# apt-add-repository ppa:flexiondotorg/java
# apt-get update
# apt-get install sun-java6-jdk
Um pouco de Linux
Para quem no est familiarizado com o ambiente Linux vamos a uma pequena explica-
o. Nos comandos acima aparecem dois caracteres que no devem ser escritos mas querepresentam algo importante no mbito dos comandos, so eles $ e #. Estes caracteresindicam qual o nvel do usurio; $ significa usurio comum, # representa super usurio(root). No comando sudo su onde trocamos de usurio comum para super usurio.Neste momento voc ter que entrar com sua senha de login.
Java JDK 7
Segundo a pgina de Requerimentos do Sistema (http://developer.android.com/sdk/requirements.html) do site oficial do Android, necessrio uso do Java 6. Caso vocqueira utilizar o Java 7, voc ter que configurar seu projeto Android para ser compilado
com suporte a verso 6.
http://developer.android.com/sdk/requirements.htmlhttp://developer.android.com/sdk/requirements.htmlhttp://developer.android.com/sdk/requirements.htmlhttp://developer.android.com/sdk/requirements.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
13/61
1.2. INSTALAO 3
A instalao do Java 7 no Ubuntu 12.04 pode ser feita da seguinte maneira:
$ sudo su
# add-apt-repository ppa:webupd8team/java# apt-get update
# apt-get install oracle-jdk7-installer
Aps criar o projeto clique com boto direito do mouseem seu projeto e selecioneProperties. Na lista de itens do lado esquerdo selecione Java Compiler. Da basta clicaremEnable project specific settingse logo abaixo escolher o nvel de compilao emCompiler compliance level, escolha 1.6.
1.2.2 Android SDK
Para o AndroidSDKcomece pelodownload http://developer.android.com/sdk/index.html.
A instalao feita apenas colocando o SDK em um diretrio do sistema. Existem 2bons locais para abrigar bibliotecas no Linux, so elas: /opt e /usr/local/lib. Nesseexemplo vamos utilizar este ltimo. Abra um terminal e vamos aos comandos.
Se voc baixou o SDK para seu diretrio Downloads, proceda da seguinte maneira:
$ cd /home/usuario/Downloads
$ tar -xf android-sdk
r18-linux.tgz
$ sudo su
# mv android-sdk-linux /usr/local/lib
# cd /usr/local/lib# ln -s android-sdk-linux android-sdk
# cd android-sdk/tools
# ln -s android /usr/local/bin/android
Obs.: troque usuariona primeira linha pelo seu logindo sistema.
O poder do Linux
D ateno ao uso do comando ln. Ele responsvel por criar links simblicos. Isso muito til quando se instala um aplicativo ou biblioteca, pois proporciona atualizao sem
que outros ajustes sejam feitos. Neste caso basta linkaroutra vez e pronto.Note que no ltimo comando temos um link simblico para o diretrio /usr/local/bin. nele que colocamos os executveis globais, ou seja, que so vistos a partir de qualqueroutro diretrio. Agora saindo do modo roote usando seu prprio usurio instalaremos aAPI.
1.2.3 Android 2.2 API 8
Ainda no terminal, agora como usurio comum, vamos abrir o aplicativo que instala qual-quer uma das API disponibilizadas pelo Android.
$ android
http://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/index.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
14/61
4 CAPTULO 1. PREPARANDO O AMBIENTE DE DESENVOLVIMENTO
O aplicativo Android SDK and AVD Manager ir aparecer. Clique em Avaliablepackages e procure pela verso 2.2 API 8 do Android. Selecione e clique em InstallSelected. Aps o download voc pode verificar a verso instalada emInstalled packages,
um dos itens algo como SDK Plataform Android 2.2, API 8, revision 2.Se voc quiser aproveite para baixar outras verses para utilizar em projetos futuros.
1.2.4 Android Virtual Device (AVD)
Vamos aproveitar e criar nossoAVDpara testar pela primeira vez nosso emulador. Aindano Android SDK and AVD Managerclique em Virtual devices, depois em New...
D um nome. Voc pode usar qualquer nomenclatura, mas interessante que tenhaalgo haver com a verso. Assim, caso voc tenha que testar seu cdigo em outras versesvoc poder saber qual emulador utilizar. Por exemplo use android-2.2. Em Targetescolha a verso, neste caso Android 2.2 - API Level 8. Pronto, apenas clique em
Create AVD.
Dicas
A opo Skinindica qual a resoluo da tela do aparelho. Como no possvel redimen-sionar a janela, em alguns monitores a janela fica maior que a tela do seu monitor.
A opo Snapshotquando habilitada, serve para salvar o estado do emulador. Isso fazcom que da segunda inicializao em diante se torne mais rpida.
A opo SD Card ideal caso sua aplicao necessite guardar dados como fotos, arqui-vos. O AVD ir reservar um espao em seu HD permitindo assim o acesso a dados peloemulador.
1.2.5 Eclipse Juno
O IDE Eclipse pode ser encontrada em http://www.eclipse.org/downloads/. Para o de-senvolvimento de aplicativos para o Android a versoEclipse IDE for Java Developers ideal. Mas se voc tiver interesse em aplicativos Java para Web a opo baixar a versoEclipse IDE for Java EE Developers.
Em todo caso as duas vo servir para o desenvolvimento, pois ambas vem com suportea Java.
O Eclipse no possui instalador, no caso ele j vem pr-compilado. Basta apenasdescompactar e executar o arquivo eclipse.
Para sua comodidade voc pode adicionar o Eclipse no menu do Ubuntu. Isso podeser feito apenas clicando com o boto direiro do mouseno menu principal e escolhendo aopo Editar menus. Ou voc pode usar a dica do blog MAD3 Linux(http://www.mad3linux.org) - http://va.mu/VSgR. Essa dica ir lhe mostrar comoadicionar um item ao menu visvel a todos os usurios.
1.2.6 Plugin ADT
Para a instalao do plugin ADT vamos abrir o Eclipse, e em seu menu selecione Help Eclipse Marketplace...
Busque por adte escolha o Android Development Tools for Eclipseda Google,
Inc., Apache 2.0e clique em Install. O Eclipse ir pedir confirmao sobre os itens
http://www.eclipse.org/downloads/http://www.mad3linux.org/http://va.mu/VSgRhttp://va.mu/VSgRhttp://va.mu/VSgRhttp://www.mad3linux.org/http://www.eclipse.org/downloads/7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
15/61
1.2. INSTALAO 5
a serem instalados, clique em Next. Agora basta aceitar os termos de uso e clicar emFinish. Aps o download e a instalao, reinicie o Eclipse.
NoEclipse Marketplacevoc pode encontrar outras ferramentas bastante teis para
um bom desenvolvimento. Clique na aba Popular e veja as ferramentas mais baixadas,talvez exista uma que voc no conhea mas que sempre precisou.
Configurando o ADT
Agora que o plugin foi instalado temos que dizer ao Eclipse onde ns instalamos o AndroidSDK. Isso pode ser feito clicando no menu Window Preferences. Selecione Androidno painel lateral esquerdo. Em SDK Locationclique em Browse... e indique o diretriodo SDK, caso no lembre, ele est em /usr/local/lib/android-sdk. Clique em Applyna parte inferior direita para atualizar a lista de APIs disponveis.
Caso voc tenha mais dvidas d uma olhada na pgina oficial de instalao do pluginADT localizada em http://developer.android.com/sdk/eclipse-adt.html.
Testando o ADT
Para testar o Android Development Toolsou ADT crie um projeto Android. No menudo Eclipse selecione File New Project...
Selecione Android Application Projecte clique em Next. D um nome qualquerao seu aplicativo, por exemplo hello.android. Note que o ADT tenta dar um nomeao seu pacote e ao diretrio de arquivos a partir do nome que voc digitou. Deixe comoest. Em Build SDK preciso escolher qual API vamos utilizar, em nosso caso escolhaa Android 2.2 (API 8). Em Minimum Required SDKescolha a API 8: Android 2.2(Froyo) indicando que a verso mnima a API 8. Clique em Next.
Na verso do ADT para o Eclipse Juno, uma novidade apareceu. possvel criar ocone lanador logo ao criar o aplicativo. Selecione da maneira que achar melhor e cliqueem Next. Depois clique em Finish.
Aps isso clique com boto direito do mouseno projeto recm criado, e Run As Android Application. Se tudo tiver dado certo possvel ver no emulador sua primeiraaplicao rodando.
Dicas
Uma vez que voc abriu o emulador no o feche. Voc ir notar que ao abrir pela primeiravez ele leva um tempo para isso. Neste caso ao atualizar o cdigo-fonte apenas rode
o aplicativo novamente. O plugin ADT far com que o aplicativo seja reinstalado noemulador.Faa o teste com alguns atalhos bsicos:
Alt + Enter Maximiza o emulador. Ideal para demostraes.
Ctrl + F11 Muda a orientao do emulador, retrato ou paisagem.
F8 Liga/desliga a rede.
Outro elemento essencial o LogCat. Ele faz parte do ADT e responsvel por mostraras mensagens delogdo emulador. Caso voc encontre problemas com seu cdigo o LogCatser seu melhor aliado. Para acess-lo no Eclipse clique no menu Window Show View
Other..., clique em Android
LogCat.
http://developer.android.com/sdk/eclipse-adt.htmlhttp://developer.android.com/sdk/eclipse-adt.htmlhttp://developer.android.com/sdk/eclipse-adt.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
16/61
6 CAPTULO 1. PREPARANDO O AMBIENTE DE DESENVOLVIMENTO
1.2.7 Sqlite3
Sendo o Sqlite o banco de dados embutido na plataforma Android, nada melhor do queaprendermos um pouco sobre ele.
O Sqlite um banco de dados relacional bastante utilizado por dispositivos e sistemasembarcados por ser leve, robusto, de fcil configurao e, acima de tudo, livre. Para ainstalao, abra um terminal como roote:
$ sudo su
# apt-get install sqlite3
Aps a instalao possvel utilizar o Sqlite via linha de comando. Faa logoff dousurio roote faa os seguintes testes:
# exit$ sqlite
SQLite version 2.8.17
Enter ".help"for instructions
sqlite>
Voc dever ver algo parecido. Para sair utilize o comando .exit. Veja outros detalhesna pgina oficial do projeto: http://www.sqlite.org/.
Tipos de dados
Utilize a tabela abaixo para criar suas tabelas futuramente.
Nome Descrio
INTEGER valores inteiros, positivos ou negativos. Podem variar de 1 a 8 bytes.
REAL valores reais ou decimais.
TEXT usado para armazenar valores, no-limitado. Suporta vrias codifica-es, por exemplo UTF-8.
BLOB objetos binrios tais como imagens, arquivos de texto, etc. Tambmpossui tamanho no-limitado.
NULL representa falta de informao.
Tabela 1.1: Tipos de dados do Sqlite
1.2.8 Sqliteman
Para uma gerncia mais produtiva usaremos o Sqliteman para acessar e modificar bancosde dados. A instalao feita via linha de comando. Abra um terminal e:
$ sudo su
# apt-get install sqliteman
http://www.sqlite.org/http://www.sqlite.org/7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
17/61
1.2. INSTALAO 7
Depois de instalado, acesse o aplicativo do menu principal do Ubuntu em Aplicativos Escritrio Sqliteman. Faa alguns testes criando bancos de dados, depois criealgumas tabelas. Ele possui assistentes que iro auxiliar nos primeiros momentos.
Por exemplo, crie uma base de dados e depois clique com o boto direito do mouseemTables. Utilize o assistente e veja como simples criar tabelas no sqlite.
1 -- Distribuies Linux
2
3 CREATE TABLE distros (
4 _id INTEGER PRIMARY KEY,
5 nome TEXT NOT NULL,
6 interface TEXT NOT NULL DEFAULT Gnome3,
7 deriva_de INTEGER REFERENCES distros(_id)
8 );
9
10 INSERT INTO distros VALUES (1, Debian, Gnome3, NULL);
11 INSERT INTO distros VALUES (2, Ubuntu, Unity, 1);
12 INSERT INTO distros VALUES (3, Linux Mint, Mate, 2);
13 INSERT INTO distros VALUES (4, Fedora, KDE, NULL);
14 INSERT INTO distros VALUES (5, Slackware, KDE, NULL);
15 INSERT INTO distros VALUES (6, Slax, KDE, 5);
16 INSERT INTO distros VALUES (7, Ubuntu Studio, XFCE, 2);
17 INSERT INTO distros VALUES (8, kUbuntu, KDE, 2);
18 INSERT INTO distros VALUES (9, xUbuntu, XFCE, 2);
Cdigo-fonte 1: Exemplo de banco de dados [exemplo-bd.sql]
Observe que podemos fazer auto-relacionamento na tabela. Assim somos capazes deexecutar a seguinte SQL, contando o nmero de distros que derivam de uma outra original.Veja:
1 SELECT d._id, d.nome, d.interface,
2 (
3 SELECT SUM( CASE WHEN aux.deriva_de = d._id THEN 1 ELSE 0 END )
4 FROM distros aux
5 ) AS num_derivadas
6 FROM distros d
Cdigo-fonte 2: Exemplo de querycom subquery [exemplo-bd.sql]
Mais informaes em: http://sqliteman.com/
1.2.9 Inkscape
Uma tima ferramenta de desenho vetorial o Inkscape. Ela ser bastante til pois odesenvolvimento de aplicativos hoje em dia baseado muito em figuras para facilitar a
navegao, identidade visual, entre outras coisas.
http://sqliteman.com/http://sqliteman.com/7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
18/61
8 CAPTULO 1. PREPARANDO O AMBIENTE DE DESENVOLVIMENTO
A instalao feita de forma simples. Num terminal:
$ sudo su
# apt-get install inkscape
Para dicas de como criar cones para os diversos elementos do Android veja a pginahttp://developer.android.com/design/style/iconography.html .
http://developer.android.com/design/style/iconography.htmlhttp://developer.android.com/design/style/iconography.htmlhttp://developer.android.com/design/style/iconography.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
19/61
Captulo 2
Exemplo prtico
2.1 Primeira aplicao - Contatos
Baseado em 1.2.6 Testando o ADT, crie um novo aplicativo chamado Contatos. Usecontatos.appcomo o nome do pacote. Crie umaActivityinicial chamadaMainActivitye um layoutinicial chamado main. Depois clique em Finish.
Este exemplo bastante til para aprendermos como funciona o Android. Voc spoder criar algo se voc souber utilizar bem as ferramentas.
2.1.1 AndroidManifest.xml
Este o arquivo que define nossa aplicao, mapeia asActivitys, entre outras configura-es. Ao finalizar a criao do projeto, inicialmente este arquivo dever conter o seguintecontedo:
1
2
6
7
8
9
10
11
12
13
14
15
Cdigo-fonte 3: Projeto inicial [AndroidManifest.xml]
9
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
20/61
10 CAPTULO 2. EXEMPLO PRTICO
2.1.2 Activity
No existe mtodo main visvel ao programador no Android. Ao invs disso temos
Activitys. Para que o Android saiba qual ele deve iniciar primeiro utilizamos umintent-filter como visto no trecho de cdigo acima da linha 09 a 12 . Para nossaprimeira Activitycriaremos uma lista de contatos e um menu para criao de um novocontato.
Para construir olayoutinicial de nossa aplicao precisamos editar o arquivomain.xmllocalizado em res/layout.
1
2
6
10
Cdigo-fonte 4: Layout principal [res/layout/main.xml]
Deste momento em diante tenha em mente que os arquivos xml aqui descritos soapenas para voc poder comparar e ver se no esqueceu de nada. Todos os layouts devemser criados usando a ferramenta ADT. Voc ir notar que ao abrir o xml uma janela delayout aparecer. Para visualizar o xml ou o layoutgrfico basta utilizar a aba inferioresquerda.
Por fim, temos o menu. Clique com o boto direito domouseem seu projeto e New Other... ou Ctrl + N. Procure por Android XML File. Em Resource Typeescolha aopo Menu. Chame-o de main
menu.xml.
1
2 3
7
Cdigo-fonte 5: Menu principal [res/menu/mainmenu.xml]
Pronto, j temos nosso layout. Compile o projeto e vamos a prxima iterao.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
21/61
2.1. PRIMEIRA APLICAO - CONTATOS 11
Conveno de nomes para cones
Observe que o cone utilizado no menu vem junto com o SDK do Android. Voc pode
visualizar os cones em SDKINSTALL/plataforms/android-8/data/res/drawable-hdpi(substitua SDK
INSTALL pelo diretrio de instalao do SDK do Android, no nosso casousr/local/lib/android-sdk ,1.2.2). Note que h namespacesou prefixos em cada umdos cones. O Android recomenda a seguinte conveno:
Tipo de Recurso Prefixo Exemplo
cones ic
ic
adicionar.png
Launcher icons ic
launcher
ic
launcher
calendario.png
Menu e Action Bar icmenu
ic
menu
ajuda.png
Status bar icons ic
stat
notify
ic
stat
notifymsg.png
Tab icons ic
tab
ic
tab
recente.png
Dialog icons ic
dialog
ic
dialog
info.png
Tabela 2.1: Conveno para nome dos cones
Note que voc no obrigado a utilizar os prefixos citados acima, isto apenas umaconveno. Veja mais detalhes em http://developer.android.com/guide/practices/ui_guidelines/icon_design.html .
Abra o arquivo MainActivity.javae v ao mtodo onCreate. Defina o layoutcomosendo nosso main.xml. Para isso adicione o layout mainao final do mtodo:
1 @Override
2 public void onCreate(Bundle icicle) {
3 super.onCreate(icicle);
4 setContentView(R.layout.main);
5 }
Cdigo-fonte 6: Definir layout [MainActivity.java]
Cuidado: no ambiente Android temos uma classe chamadaR. Ela existe tanto na biblio-teca do Android como em cada projeto. Nesse caso faa oimportda classecontatos.app.R.A classe android.R utilizada em outras situaes, onde cdigos pr-prontos foram dis-ponibilizados pela equipe do Android.
Agora precisamos sobrescrever os mtodos onCreateOptionsMenue onOptionsItemSelected.Eles iro criar o menu a partir de nosso layoute notificar quando os itens do menu forem
pressionados, respectivamente. Vamos ao cdigo:
http://developer.android.com/guide/practices/ui_guidelines/icon_design.htmlhttp://developer.android.com/guide/practices/ui_guidelines/icon_design.htmlhttp://developer.android.com/guide/practices/ui_guidelines/icon_design.htmlhttp://developer.android.com/guide/practices/ui_guidelines/icon_design.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
22/61
12 CAPTULO 2. EXEMPLO PRTICO
1 @Override
2 public boolean onCreateOptionsMenu(Menu menu) {
3 new MenuInflater(this).inflate(R.menu.main_menu, menu);
4
return super.onCreateOptionsMenu(menu);5 }
6
7 @Override
8 public boolean onOptionsItemSelected(MenuItem item) {
9 if (item.getItemId() == R.id.menu_add) {
10 irParaSalvar();
11 return true;
12 }
13 return super.onOptionsItemSelected(item);
14 }
15
16 private void irParaSalvar() {
17 // no implementado ainda ...
18 }
Cdigo-fonte 7: Criando o menu [MainActivity.java]
2.1.3 Formulrios
Agora vamos criar nosso formulrio para criao e edio de contatos. Comearemos pelolayout. Crie um arquivo xmlem res/layoutchamado salvar.xml.
Existem alguns pontos importantes para este trecho de cdigo. Comeando pelo layoutinicial, onde usaremos TableLayout. Esse layout ideal para telas com estilo tabela.
Um detalhe importante para observarmos neste layout que ele possui o atributostretchColumns com valor 1. Isso quer dizer que a coluna 1 da tabela ter o maiortamanho possvel, respeitando o tamanho mnimo das outras clulas. Para visualizar asmudanas voc pode tentar usar outros valores como 0tornando a primeira coluna maior
que as demais, ou ainda *que far com que todas as clulas tenham o mesmo tamanho.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
23/61
2.1. PRIMEIRA APLICAO - CONTATOS 13
1
2
7
13
18
23
27
28
29
34
35
Cdigo-fonte 8: Formulrio principal [res/layout/salvar.xml]
Crie uma nova Activity chamada SalvarActivity dentro de contatos.app.view.Para irmos de uma Activitypara outra precisamos de um Intent. Um de seus constru-tores recebe como parmetros a instncia da classe em que estamos, sendo que ela deveimplementar a interface Contexte o nome da classe a qual deve ser mostrada. Veja como
implementar o mtodo irParaSalvarda classe MainActivity:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
24/61
14 CAPTULO 2. EXEMPLO PRTICO
1 private void irParaSalvar() {
2 Intent intent = new Intent(MainActivity.this, SaveActivity.class);
3 startActivity(intent);
4
}
Cdigo-fonte 9: Mudando de Activity [MainActivity.java]
Veremos agora como manipular EditTexts, que representam os campos de entradade dados. Abra o SalvarActivitye adicione o mtodo carregare crie atributos paraguardar os EditTexts:
1 private EditText etNome, etFone, etEmail;
2 /* ... */
3
4 @Override5 public void onCreate(Bundle icicle) {
6 super.onCreate(icicle);
7 setContentView(R.layout.salvar);
8 carregar();
9 }
10
11 private void carregar() {
12 etNome = (EditText) findViewById(R.id.et_nome);
13 etTefone = (EditText) findViewById(R.id.et_telefone);
14 etEmail = (EditText) findViewById(R.id.et_email);
15 }
Cdigo-fonte 10: Utilizando EditTexts [SalvarActivity.java]
Para que a Activityfuncione precisamos mape-la no arquivo AndroidManifest.xml.Adicione o contedo abaixo entre as tags application:
1
Cdigo-fonte 11: Mapear SalvarActivity [AndroidManifest.xml]
Utilize sempre o ADT e apenas confira se o arquivo est da maneira correta.
2.1.4 Construindo o Model da aplicao
Precisamos de umhelperpara fazer acesso ao banco de dados. O Android prov suporte abancos de dados Sqlite por padro. Qualquer banco de dados que voc criar ser acessvelpelo nome por qualquer classe na sua aplicao, mas no fora dela.
Crie uma classe chamada ContatoHelper em contatos.app.model que extende deSQLiteOpenHelper. Essa classe ser capaz de ler e escrever no banco de dados graas aos
mtodos getReadableDatabase()e getWritableDatabase(), respectivamente.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
25/61
2.1. PRIMEIRA APLICAO - CONTATOS 15
A princpio temos que criar um construtor passando como parmetros o nome do bancode dados e a verso da DDL(Data Definition Language). Logo em seguida precisamosimplementar os mtodos onCreate, no qual iremos criar as tabelas e onUpdate, caso
tenhamos que alterar alguma tabela.1 package contatos.app.model;
2
3 import android.content.Context;
4 import android.database.sqlite.SQLiteDatabase;
5 import android.database.sqlite.SQLiteOpenHelper;
6
7 public class ContatoHelper extends SQLiteOpenHelper {
8
9 private static final String DATABASE_NAME = "contatos.db";
10 private static final int VERSION = 1;
11
12 public ContatoHelper(Context context) {
13 super(context, DATABASE_NAME, null, VERSION);
14 }
15
16 @Override
17 public void onCreate(SQLiteDatabase db) {
18 db.execSQL("CREATE TABLE contato (_id INTEGER PRIMARY KEY AUTOINCREMENT,"
19 + " nome TEXT, fone TEXT, email TEXT);");
20 }
21
22 @Override
23 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
24 // nada a fazer por enquanto ...
25 }
26 }
Cdigo-fonte 12: Helper da aplicao [ContatoHelper.java]
Para a iterao de criao de um novo contato, ainda em ContatoHelpervamos adi-cionar um mtodo criar. Faa:
1 public void criar(ContentValues values) {
2 getWritableDatabase().insert("contato", "telefone", values);
3 }
Cdigo-fonte 13: Criar novo contato [ContatoHelper.java]
Agora temos que fazer a chamada do mtodo criar da classe ContatoHelper emSalvarActivity. Para isso temos que criar uma instncia de ContatoHelper, adicionaro boto salvar e adicionar um Listenerde click(faa o importda classe
android.view.View.OnClickListener ). Vamos ao cdigo:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
26/61
16 CAPTULO 2. EXEMPLO PRTICO
1 /* ... */
2 private ContatoHelper helper;
3 private Button btSalvar;
4
5 @Override
6 public void onCreate(Bundle icicle) {
7 /* ... */
8 helper = new ContatoHelper(this);
9 carregar();
10 ir();
11 /* ... */
12 }
13
14 private void carregar() {
15
/* ... */16 btSalvar = (Button) findViewById(R.id.bt_salvar);
17 }
18
19 private void ir() {
20 btSalvar.setOnClickListener(new OnClickListener() {
21
22 public void onClick(View view) {
23 ContentValues values = new ContentValues();
24 values.put("nome", etNome.getText().toString());
25 values.put("telefone" , etTefone.getText().toString());
26
values.put("email" , etEmail.getText().toString());27 helper.criar(values);
28 finish();
29 }
30 });
31 }
32
33 @Override
34 protected void onDestroy() {
35 super.onDestroy();
36 helper.close();
37 }
Cdigo-fonte 14: Fim da iterao criar contato [SalvarActivity.java]
Com essa implementao j possvel salvar contatos na base de dados.
2.1.5 Mostrando os dados na View
Aps salvar os dados no banco, devemos ser capazes de obter tais informaes e coloc-las em forma de Lista. Para isso criaremos um novo layout que ser responsvel por
representar uma linha de nossa Lista. Essa linha deve ser semelhante a figura abaixo:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
27/61
2.1. PRIMEIRA APLICAO - CONTATOS 17
Figura 2.1: Layout linha da Lista
Para isso crie um arquivo chamado linha.xml em res/layout com o seguinte con-tedo.
1
2
5
8
9
12
16
19
22
23
Cdigo-fonte 15: Layout para cada linha da lista [res/layout/linha.xml]
Note a possibilidade de aninhar o LinearLayout. Fazendo isso possvel criar olayoutdesejado fazendo com que alguns elementos sejam inseridos na horizontal, outrosna vertical.
Outro ponto interessante o uso de negrito no TextViewcorrespondente ao nome, na li-nha 14 , e o uso de reticncias caso o nome seja maior que a tela usando android:ellipsize="end"
na linha 15 .
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
28/61
18 CAPTULO 2. EXEMPLO PRTICO
Agora vamos at ContatoHelpere adicionar o mtodo listar. E tambm adiciona-remos mtodos para facilitar a obteno dos valores de cada atributo.
1 public Cursor listar() {
2 return getReadableDatabase()
3 .rawQuery("SELECT _id, nome, fone, email FROM contato ORDER BY nome",
4 null);
5 }
6
7 public String getNome(Cursor c) {
8 return c.getString(1);
9 }
10
11 public String getFone(Cursor c) {
12 return c.getString(2);
13 }
14
15 public String getEmail(Cursor c) {
16 return c.getString(3);
17 }
Cdigo-fonte 16: Listar contatos existentes [ContatoHelper.java]
Os elementos de um Cursorso numerados iniciando de 0 (zero). Neste caso o 0 acoluna
id. Note que ela no ser usada pelo programador e sim pelo Android. Isto ser
visto com mais detalhes em2.1.6Editando dados existentes.Para popular cada linha de nossa Lista vamos criar uma classe interna (inner class)
em MainActivity. Assim podemos fazer cachedos objetos aumentando a performance.Use o sufixo Holderpara esse tipo de classe.
1 private static class ContatoHolder {
2 private TextView nome, fone, email = null;
3
4 public ContatoHolder(View linha) {
5 nome = (TextView) linha.findViewById(R.id.linha_nome);
6 fone = (TextView) linha.findViewById(R.id.linha_fone);
7 email = (TextView) linha.findViewById(R.id.linha_email);8 }
9
10 public void popularForm(Cursor c, ContatoHelper helper) {
11 nome.setText(helper.getNome(c));
12 fone.setText(helper.getFone(c));
13 email.setText(helper.getEmail(c));
14 }
15 }
Cdigo-fonte 17: Classe Holder [MainActivity.java]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
29/61
2.1. PRIMEIRA APLICAO - CONTATOS 19
Levando em conta que estamos usando a interface Cursor em nosso Helper temosque criar uma classe que extenda de CursorAdapter que ser responsvel por definir olayoutde cada linha da Lista. Crie uma classe interna chamada ContatoAdapter. Iremos
sobrescrever dois mtodos, newView() e bindView(), que so responsveis por inflar(inflate) uma nova linha e reciclar uma linha existente, respectivamente.
1 private ContatoHelper helper;
2 /* ... */
3
4 private class ContatoAdapter extends CursorAdapter {
5
6 public ContatoAdapter(Cursor c) {
7 super(MainActivity.this, c);
8 }
9
10 @Override
11 public View newView(Context cntxt, Cursor cursor, ViewGroup vg) {
12 LayoutInflater inflater = getLayoutInflater();
13 View linha = inflater.inflate(R.layout.linha, vg, false);
14 ContatoHolder holder = new ContatoHolder(linha);
15 linha.setTag(holder);
16 return linha;
17 }
18
19 @Override
20 public void bindView(View view, Context cntxt, Cursor cursor) {
21 ContatoHolder holder = (ContatoHolder) view.getTag();
22 holder.popularForm(cursor, helper);
23 }
24 }
Cdigo-fonte 18: Classe Adapter [MainActivity.java]
Com a introduo do Helperteremos que criar uma instncia da classe Cursorpara
popular nossa ListView. Vamos ao cdigo-fonte:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
30/61
20 CAPTULO 2. EXEMPLO PRTICO
1 /* ... */
2 private Cursor model = null;
3 private ContatoAdapter adapter = null;
4
private ListView listView = null;5
6 @Override
7 public void onCreate(Bundle icicle) {
8 /* ... */
9 helper = new ContatoHelper(this);
10 carregar();
11 }
12
13 private void carregar() {
14 listView = (ListView) findViewById(R.id.lv_contatos);
15
model = helper.listar();16 startManagingCursor(model);
17 adapter = new ContatoAdapter(model);
18 listView.setAdapter(adapter);
19 }
20
21 @Override
22 protected void onDestroy() {
23 super.onDestroy();
24 model.close();
25 helper.close();
26
}
Cdigo-fonte 19: Popular ListView [MainActivity.java]
Nunca esquecendo de fechar o helper ao sair, pois assim garantimos que a conexocom o banco ser fechada.
2.1.6 Editando dados existentes
Para a edio de informaes usaremos o mesmo Activitydo criar, ou seja,SalvarActivity.Para isso precisamos passar um parmetro para o Activity. Usaremos ento um mtododo Intentque responsvel por isso, putExtra(chave, valor).
Para uma passagem de parmetros segura devemos usar um namespacepara que nocolida com nenhum nome j utilizado pelo Android. Assim, vamos criar uma varivelesttica do tipo String. Isso acontecer quando o usurio pressionar a linha que eledeseja editar. Podemos fazer isso utilizando a interface OnItemClickListener.
Vamos incrementar tambm o mtodo irParaSalvarpassando o parmetro caso haja
um. Vamos ao cdigo:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
31/61
2.1. PRIMEIRA APLICAO - CONTATOS 21
1 /* ... */
2 public static final String _ID = "contatos.app._ID";
3
4
@Override5 public void onCreate(Bundle icicle) {
6 /* ... */
7 configurar();
8 }
9
10 private void irParaSalvar() {
11 irParaSalvar(null);
12 }
13
14 private void irParaSalvar(String id) {
15
Intent intent = new Intent(MainActivity.this, SalvarActivity.class);16 if (id != null) {
17 intent.putExtra(_ID, id);
18 }
19 startActivity(intent);
20 }
21
22 private void configurar() {
23 listView.setOnItemClickListener (new OnItemClickListener() {
24 public void onItemClick(AdapterView parent, View view,
25 int position, long id) {
26
irParaSalvar(String.valueOf(id));27 }
28 });
29 }
Cdigo-fonte 20: Passagem de parmetros [MainActivity.java]
Agora hora de tratar nosso parmetro no SalvarActivity. Caso haja um parmetroprecisamos obter os dados existentes no banco de dados para ento edit-lo. Neste casoprecisaremos de mais dois mtodos em ContatoHelper, que so lere atualizar.
1 public Cursor ler(String id) {
2 return getReadableDatabase().rawQuery("SELECT _id, nome, telefone, " +
3 "email FROM contato WHERE _id = ?", new String[]{id});
4 }
5
6 public void atualizar(String id, ContentValues values) {
7 getWritableDatabase().update("contato", values, "_id = ?", new String[]{id});
8 }
Cdigo-fonte 21: Ler e atualizar dados existentes [ContatoHelper.java]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
32/61
22 CAPTULO 2. EXEMPLO PRTICO
O prximo passo tratar no SalvarActivity caso o parmetro tenha sido enviadoou no. Caso positivo devemos carregar os dados existentes no banco de dados e depoisatualiz-los.
1 /* ... */
2 private String contatoId = null;
3
4 private void carregar() {
5 /* ... */
6 contatoId = getIntent().getStringExtra(MainActivity._ID);
7 if (contatoId != null) {
8 carregarContato();
9 }
10 }
11
12 private void carregarContato() {
13 Cursor cursor = helper.ler(contatoId);
14 cursor.moveToFirst();
15 etNome.setText(helper.getNome(cursor));
16 etFone.setText(helper.getFone(cursor));
17 etEmail.setText(helper.getEmail(cursor));
18 cursor.close();
19 }
20
21 private void ir() {
22 btSalvar.setOnClickListener(new OnClickListener() {
23 public void onClick(View view) {
24 ContentValues values = new ContentValues();
25 values.put("nome", etNome.getText().toString());
26 values.put("telefone" , etTefone.getText().toString());
27 values.put("email" , etEmail.getText().toString());
28 if (contatoId == null) {
29 helper.criar(values);
30 } else {
31 helper.atualizar(contatoId, values);
32 }
33 finish();
34 }
35 });
36 }
Cdigo-fonte 22: Usando Activity para criar ou atualizar [SalvarActivity.java]
Com isso encerramos um CRUDbsico, mas completo. A seguir temos implementa-es mais especficas que iro tornar nossa aplicao mais profissional.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
33/61
Captulo 3
Livro de Receitas
3.1 Mostrando Dilogos
No Android, podemos criar dilogos no Activitymostrando opes ao usurio, como porexemplo, escolher itens de uma lista, ou responder sim ou no a uma ao, etc.
Vamos incrementar algumas partes de nosso cdigo e tentar encaixar algumas funcio-nalidades relacionadas.
3.1.1 Editar/Excluir ao clicar e segurar na ListView
Vamos implementar uma ao comum no mundo Android, que a seguinte: ao clicar esegurar num item daListView, ele mostra opes editar e excluir, por exemplo. Isto podeser feito facilmente usando AlertDialog.Builder, uma classe com mtodos pr-prontospara serem usados por voc.
Neste exemplo, precisaremos editar ContatoHelpere adicionar um mtodo para de-letar um contato, editar nosso MainActivity no mtodo configurar e adicionar um
Listenerque ao clicar e segurar num item da ListViewum mtodo acionado. Vamos aimplementao:
1 public int deletar(String id) {
2 String whereClause = "_id = ?";
3 String[] whereArgs = {id};
4 return getWritableDatabase().delete("contato", whereClause, whereArgs);
5 }
Cdigo-fonte 23: Deletar dados existentes [ContatoHelper.java]
23
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
34/61
24 CAPTULO 3. LIVRO DE RECEITAS
1 /* ... */
2 private void configurar() {
3 /* ... */
4
listView.setOnItemLongClickListener (new OnItemLongClickListener() {5 public boolean onItemLongClick(AdapterView parent, View view,
6 int position, final long id) {
7 final String[] itens = {"Editar", "Deletar"};
8 AlertDialog.Builder dialogo =
9 new AlertDialog.Builder(MainActivity.this);
10 dialogo.setTitle("Opes");
11 dialogo.setItems(itens, new OnClickListener() {
12 public void onClick(DialogInterface dialog, int which) {
13 switch (which) {
14 case 0: // editar
15
irParaSalvar(String.valueOf(id));16 break;
17 case 1: // deletar
18 int linhasAfetadas = helper.deletar(String.valueOf(id));
19 if (linhasAfetadas > 0) {
20 exibirMensagem("Contatos deletado com sucesso.");
21 carregar();
22 } else {
23 exibirMensagem("Falha ao deletar contato.");
24 }
25 break;
26
}27 }
28 });
29 dialogo.show();
30 return true;
31 }
32 });
33 }
34
35 private void exibirMensagem(String mensagem) {
36 Toast.makeText(this, mensagem, Toast.LENGTH_LONG).show();
37 }
Cdigo-fonte 24: Adicionar Listener para click longo [MainActivity.java]
Note a necessidade de um novo mtodo em MainActivity, o exibirMensagem. Ele bastante til quando se quer exibir uma mensagem rapidamente e depois ela suma. Para
isso usamos a classe Toast.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
35/61
3.1. MOSTRANDO DILOGOS 25
Interface como parmetro de um mtodo
Voc j deve ter notado o uso de interfaces como parmetro dos mtodos, por exemplona linha 4 e 11 do cdigo acima. Essa prtica obriga ao programador implementar aclasse na passagem dos parmetros.
Essa ideia vem de algumas linguagens de programao que possuem funes comoparmetros para outras funes. Como o Java no suporta essa caracterstica, a soluoveio em forma de uma interface, a qual o programador obrigado a implementar seusmtodos. Com isso o mtodo que recebe a interfacecomo parmetro sabe exatamente oque ela tem disponvel.
A partir dessa observao, podemos justificar o uso da palavra reservada final emalguns parmetros dos mtodos acima. Isso acontece porque alguns parmetros so utili-zados dentro da implementao das interfaces.
Caso haja a necessidade de utilizar uma implementao em outra classe voc pode criaruma classe que implementa umainterface, por exemplo ainterface OnItemLongClickListener.Da para a passagem do parmetro apenas crie uma instncia da classe. Por exemplo, supo-nha que voc tenha uma classe chamadaOpcoesContatoque implementa OnItemLongClickListener,nesse caso a linha 4 se tornaria:
listView.setOnItemLongClickListener(new OpcoesContato());
3.1.2 Dilogo de confirmao
Deletar dados uma ao que deve ser feita com cuidado, ento sempre bom confirmarcom o usurio se ele deseja realmente deletar, no nosso caso, um contato. Para issousaremos o AlertDialog.Buildermais uma vez, agora apenas com uma mensagem e osbotes Simou No.
Ainda em MainActivitycriaremos um outro AlertDialog.Builderno momento que
o usurio clicar em Deletar. Segue o trecho:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
36/61
26 CAPTULO 3. LIVRO DE RECEITAS
1 /* ... */
2 private void configurar() {
3 /* ... */
4
listView.setOnItemLongClickListener (new OnItemLongClickListener() {5 public boolean onItemLongClick(AdapterView parent, View view,
6 int position, final long id) {
7 /* ... */
8 dialogo.setItems(itens, new OnClickListener() {
9 public void onClick(DialogInterface dialog, int which) {
10 switch (which) {
11 case 0: // editar
12 irParaSalvar(String.valueOf(id));
13 break;
14 case 1: // deletar
15
AlertDialog.Builder confirmacao =16 new AlertDialog.Builder(MainActivity.this);
17 confirmacao.setTitle("Deletar");
18 confirmacao.setMessage("Deseja realmente deletar este contato?");
19 confirmacao.setPositiveButton("Sim", new OnClickListener() {
20 public void onClick(DialogInterface dialog, int which) {
21 int linhasAfetadas = helper.deletar(String.valueOf(id));
22 if (linhasAfetadas > 0) {
23 exibirMensagem("Contatos deletado com sucesso.");
24 carregar();
25 } else {
26 exibirMensagem("Falha ao deletar contato.");27 }
28 }
29 });
30 confirmacao.setNegativeButton("No", null);
31 confirmacao.show();
32 break;
33 }
34 }
35 });
36 dialogo.show();
37 return true;38 }
39 });
40 }
Cdigo-fonte 25: Dilogo de confirmao ao deletar contato [MainActivity.java]
Pronto, agora o trecho que deleta o contato foi movido para dentro do Listener doboto Sim. No boto No passamos null no Listener, pois caso seja a opo escolhidaapenas fazemos nada. Voc pode se quiser criar um Listenere mostrar uma mensagem
do tipo, Cancelado pelo usurio, para isso usando o mtodo exibirMensagem.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
37/61
3.1. MOSTRANDO DILOGOS 27
3.1.3 Entrada de diferentes tipos de dados
O Android foi desenvolvido com muitos recursos pr-prontos para facilitar o desenvolvi-
mento de aplicaes. Um recurso bastante til a distino dos dados que iro ser inseridosnos TextViews. Com isso o teclado virtual do cliente se adapta ao tipo de dado que serinserido. No nosso caso faremos distino do campo telefone, onde apenas nmeros ehfens (-) podem ser inseridos, e o campo e-mailonde a presena do arroba (@) e pontos(.) so elementos essenciais.
Vejamos alguns valores aceitos pelo inputType:
Para textos:
text
textCapCharacters
textMultiLine
textUri
textEmailAddress
textPersonName
textPassword
textVisiblePassword
Para nmeros:
number
numberSigned
numberDecimal
phone
datetime
date
time
Precisaremos alterar apenas o salvar.xml localizado em res/layout. Localize o
atributoinputTypedos campostelefoneee-maile altere os valores da seguinte maneira:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
38/61
28 CAPTULO 3. LIVRO DE RECEITAS
1
2 5
9
13
14
17
21
25
26
Cdigo-fonte 26: Distino de dados [res/layout/salvar.xml]
3.1.4 Validao de dados
Mesmo configurando um inputType para seu TextView pode no ser o bastante paraque os dados inseridos estejam corretos. Para isso usaremos a classe Patternsdo pacoteandroid.util. Nela podemos encontrar alguns objetos bastante teis na hora de validardados. Entre eles esto os objetos Patterns.EMAIL
ADDRESSe Patterns.PHONE. Com
eles podemos validar de forma simples os dados inseridos em nosso formulrio.Em nosso SalvarActivity adicionaremos um mtodo validar passando como pa-
rmetro um ContentValues. Copie o mtodo exibirMensagemda classe MainActivitypara mostrar uma mensagem caso alguma validao seja falsa.
OBS: Para um melhor reuso crie uma classe abstrata que implementa o mtodo exibirMensageme que extenda de Activitye faa com que seus Activitys herdem dela. uma boa pr-tica.
Vamos ao trecho de cdigo:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
39/61
3.1. MOSTRANDO DILOGOS 29
1 /* ... */
2 private void ir() {
3 btSalvar.setOnClickListener(new OnClickListener() {
4
5 public void onClick(View view) {
6 ContentValues values = new ContentValues();
7 values.put("nome", etNome.getText().toString());
8 values.put("telefone" , etTefone.getText().toString());
9 values.put("email" , etEmail.getText().toString());
10 if (validar(values)) {
11 if (contatoId == null) {
12 helper.criar(values);
13 } else {
14 helper.atualizar(contatoId, values);
15
}16 finish();
17 }
18 }
19 });
20 }
21
22 private boolean validar(ContentValues values) {
23 if (!Patterns.PHONE.matcher(values.getAsString("telefone")).matches()) {
24 exibirMensagem( "Telefone no vlido.");
25 return false;
26
}27
28 if (!Patterns.EMAIL_ADDRESS.matcher(values.getAsString("email")).matches()) {
29 exibirMensagem("E-mail no vlido.");
30 return false;
31 }
32 return true;
33 }
34
35 private void exibirMensagem(String mensagem) {
36 Toast.makeText(this, mensagem, Toast.LENGTH_LONG).show();
37 }38 /* ... */
Cdigo-fonte 27: Validao dos dados [SalvarActivity.java]
3.1.5 Fazendo uma ligao
J que estamos fazendo uma lista de contatos nada melhor que usar o nmero do telefonedos contatos inseridos para realizar chamadas. Para isso vamos aprender um pouco sobrePermisses.
Permisses no Android so definidas no AndroidManifest.xml. Ao instalar seu aplica-
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
40/61
30 CAPTULO 3. LIVRO DE RECEITAS
tivo, o usurio saber quais as permisses que o seu aplicativo necessita para ser executado.
Por padro, o Android traz uma srie de permisses que auxiliam seu aplicativo a secomunicar com o aparelho. Abaixo alguns exemplos:
Verificao
ACCESS
NETWORK
STATE
ACCESS
WIFI
STATE
BATTERY
STATS
Comunicao
BLUETOOTH
CALL
PHONE
INTERNET
SEND
SMS
A lista completa pode ser vista em http://developer.android.com/reference/android/Manifest.permission.html .
Edite o AndroidManifest.xmle adicione a permissao CALL
PHONE.
1
2
6 7
8
9
Cdigo-fonte 28: Permisso de realizar chamadas [AndroidManifest.xml]
Agora vamos adicionar um item ao dilogo que aparece ao clicar e segurar um itemda ListView. Ele servir para implementarmos o trecho que realiza a chamada. Vamos a
ele:
http://developer.android.com/reference/android/Manifest.permission.htmlhttp://developer.android.com/reference/android/Manifest.permission.htmlhttp://developer.android.com/reference/android/Manifest.permission.htmlhttp://developer.android.com/reference/android/Manifest.permission.htmlhttp://developer.android.com/reference/android/Manifest.permission.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
41/61
3.1. MOSTRANDO DILOGOS 31
1 /* ... */
2 private void configurar() {
3 listView.setOnItemLongClickListener (new OnItemLongClickListener() {
4
public boolean onItemLongClick(AdapterView parent, View view,5 final int position, final long id) {
6 final String[] itens = {"Editar", "Deletar", "Chamar"};
7 /* ... */
8 dialogo.setItems(itens, new OnClickListener() {
9 public void onClick(DialogInterface dialog, int which) {
10 switch (which) {
11 /* ... */
12 case 2: // chamar
13 model.moveToPosition(position);
14 startActivity(new Intent(Intent.ACTION_CALL,
15
Uri.parse("tel:" + helper.getTelefone(model))16 )
17 );
18 break;
19 }
20 }
21 });
22 dialogo.show();
23 return true;
24 }
25 });
26
}
Cdigo-fonte 29: Item chamar no dilogo [MainActivity.java]
Nesse trecho de cdigo podemos ver o uso de Intents do prrpio Android, nessecaso o Intent.ACTION
CALL (veja linha 14 ). Ele serve para chamar uma Activity
que realize ligaes. Atente apenas para um detalhe - esse Intent faz a chamada semconfirmao. Caso voc queira que o usurio possa visualizar o nmero no discador use oIntent Intent.ACTION
DIAL. Faa esse teste e veja a diferena entre os Intents.
Veja mais detalhes em http://developer.android.com/reference/android/content/Intent.html.
http://developer.android.com/reference/android/content/Intent.htmlhttp://developer.android.com/reference/android/content/Intent.htmlhttp://developer.android.com/reference/android/content/Intent.htmlhttp://developer.android.com/reference/android/content/Intent.htmlhttp://developer.android.com/reference/android/content/Intent.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
42/61
32 CAPTULO 3. LIVRO DE RECEITAS
3.1.6 Enviando e-mail
Para envio de e-mail voc pode simplesmente usar a aplicao de e-mail padro do apare-lho. Seguindo o mesmo princpio do exemplo anterior vamos apenas inserir um trecho decdigo no mtodo configurarda classe MainActivity:
1 /* ... */
2 private void configurar() {
3 listView.setOnItemLongClickListener (new OnItemLongClickListener() {
4 public boolean onItemLongClick(AdapterView parent, View view,
5 final int position, final long id) {
6 final String[] itens = {"Editar", "Deletar", "Chamar",
7 "Enviar e-mail"};
8 /* ... */
9 dialogo.setItems(itens, new OnClickListener() {
10 public void onClick(DialogInterface dialog, int which) {11 switch (which) {
12 /* ... */
13 case 3: // enviar e-mail
14 model.moveToPosition(position);
15 Intent email = new Intent(Intent.ACTION_SEND);
16 email.setType("plain/text");
17 email.putExtra(Intent.EXTRA_EMAIL,
18 new String[]{ helper.getEmail(model) });
19 startActivity(Intent.createChooser(email,
20 "Enviar e-mail..."));
21 break;22 }
23 }
24 });
25 dialogo.show();
26 return true;
27 }
28 });
29 }
Cdigo-fonte 30: Item enviar e-mail no dilogo [MainActivity.java]
Ao testar no emulador voc receber a mensagem: No applications can performthis action. Traduzindo quer dizer que: Nenhuma aplicao pode executar esta ao.Em outras palavras, nenhum cliente de e-mail foi encontrado.
3.2 Internacionalizao (i18n)
3.2.1 Forando regio para teste
Para podermos testar as strings de i18n podemos forar o Activity a utilizar uma
determinada linguagem. Isso se d por meio da classe Locale. Faamos um teste com o
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
43/61
3.3. UTILIZANDO AS PREFERNCIAS DO ANDROID 33
SalvarActivity inserindo o trecho de cdigo abaixo no mtodo onCreate. Vamos a ele:
1 /* ... */
2 @Override3 protected void onCreate(Bundle savedInstanceState) {
4 /* ... */
5 forceLocale("pt", "BR");
6 carregar();
7 ir();
8 }
9
10 private void forceLocale(String language, String country) {
11 Locale locale = new Locale(language, country);
12 Locale.setDefault(locale);
13 Configuration configuration = new Configuration();14 configuration.locale = locale;
15 getBaseContext().getResources()
16 .updateConfiguration(configuration,
17 getBaseContext().getResources().getDisplayMetrics());
18 }
Cdigo-fonte 31: Forando regio [SalvarActivity.java]
Para visualizar a mudana crie strings no seu arquivo strings.xml. Substitua as
stringsNome, Telefone,E-maile Salvarpelos respectivos valores em ingls Name,Phone,E-maileSave. Agora crie outro arquivostrings.xmldentro do diretrio/res/values-pt-rBRe insira as mesmas stringscitadas anteriormente, traduzindo cada valor.
Faa testes comentando a chamada para a funo forceLocalee veja as mudanas.
3.2.2 Forando regio pelo emulador
A maneira mais rpida e prtica de forar a regio pelo prprio emulador. V at alista de aplicativos e procure por Custom Locale. Depois pesquise por pt
BRe caso no
encontre clique em Add New Locale. Digite pt
BRe clique em Add and Select.
3.3 Utilizando as Preferncias do Android
O Android j disponibiliza uma maneira de criar preferncias de forma fcil. Para demons-trar implementaremos um exemplo bem amplo, que ir nos ajudar a entender ainda maisde Android. Para comear adicionaremos um nova coluna a nossa tabela contato cha-mada grupo. Depois adicionaremos um arrayde strings ao nosso arquivo strings.xmle ainda vamos aprender a utilizar um Spinner, tambm conhecido como combo box. Porltimo, e no menos importante, usaremos as preferncias para tornar padro um valor
de nosso Spinner.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
44/61
34 CAPTULO 3. LIVRO DE RECEITAS
3.3.1 Atualizando colunas de uma tabela
Como visto em2.1.4, a classe SQLiteOpenHelper obriga-nos a implementar os mtodosonCreate e onUpgrade. Neste ponto ser necessrio o uso do mtodo onUpgrade. Eleserve, como o nome sugere, para atualizar aDDLdo banco de dados. Isso til quandoseu cliente j possui uma verso do seu aplicativo instalada e ele quer apenas atualizarpara uma nova verso. Tambm ser necessrio adicionar a coluna grupo nas queries.Abra a classe ContatoHelperem contatos.app.modele faa as modificaes:
1 public class ContatoHelper extends SQLiteOpenHelper {
2 /* ... */
3 private static final int VERSION = 2;
4 private static final String TAG = "ContatoHelper";
5
6 @Override
7 public void onCreate(SQLiteDatabase db) {
8 db.execSQL("CREATE TABLE contato ( _id INTEGER PRIMARY KEY AUTOINCREMENT," +
9 "nome TEXT, telefone TEXT, email TEXT," +
10 // versao 2
11 "grupo INTEGER NOT NULL DEFAULT 0 );");
12 }
13
14 @Override
15 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
16 Log.w(TAG, "Atualizando banco de dados da verso "17 + oldVersion + " para " + newVersion + ".");
18 if (newVersion > oldVersion) {
19 switch (oldVersion) {
20 case 2:
21 try {
22 db.execSQL("ALTER TABLE contato " +
23 "ADD COLUMN grupo INTEGER NOT NULL DEFAULT 0");
24 } catch (SQLException e) {
25 Log.e(TAG, "Erro ao executar SQL: " , e);
26 }
27 default:28 Log.w(TAG, "Verso desconhecida: " + oldVersion +
29 ". Criando novo banco de dados.");
30 db.execSQL("DROP TABLE IF EXISTS contato");
31 onCreate(db);
32 }
33 }
34 }
35 }
Cdigo-fonte 32: Nova coluna grupo na base de dados [ContatoHelper.java]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
45/61
3.3. UTILIZANDO AS PREFERNCIAS DO ANDROID 35
Vemos neste exemplo o uso da classe Logdo pacote android.util. Ela possui apenasmtodos estticos, assim no precisamos instanciar, apenas faa a chamada dos mtodos.Temos:
Log.w() para mostrar warnings, ou seja, avisos.
Log.e() para mensagens de erro.
Log.d() para mensagens debug.
Log.i() para mensagens informativas.
Log.v() para outras mensagens.
1 public class ContatoHelper extends SQLiteOpenHelper {
2 /* ... */
3 public Cursor listar() {
4 return getReadableDatabase()
5 .rawQuery("SELECT _id, nome, telefone, email, grupo " +
6 "FROM contato ORDER BY nome", null);
7 }
8
9 public int getGrupo(Cursor c) {
10 return c.getInt(4);
11 }12
13 public Cursor ler(String id) {
14 String[] params = {id};
15 return getReadableDatabase()
16 .rawQuery("SELECT _id, nome, telefone, email, grupo " +
17 "FROM contato WHERE _id = ?" , params);
18 }
19 }
Cdigo-fonte 33: Modificao nas queries [ContatoHelper.java]
3.3.2 Array de Strings
No arquivo de strings do Android possvel criar vrios recursos. Dentre eles temosCor, Dimenso, Estilo/Tema. Usando a ferramenta ADT, crie um String Array emstrings.xml dentro de res/valuese adicione alguns itens para representar os valores dacoluna grupo, e outro String Arraypara representar os ndices:
Dica: voc pode tentar implementar o trecho usando uma tabela do banco de dados. A
ideia a mesma, neste caso no seria necessrio o uso de String Arrays.
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
46/61
36 CAPTULO 3. LIVRO DE RECEITAS
1
2
3
4
5 amigos
6 trabalho
7 conhecidos
8 famlia
9
10
11 01
12 23
13
14
Cdigo-fonte 34: Array de Strings [strings.xml]
3.3.3 Spinner, dilogo de seleo
O Spinner ideal quando temos que escolher entre valores fixos, sejam eles estticosou dinmicos. Nosso exemplo ir utilizar valores estticos para popular o mesmo. Paraisso utilizaremos o array
grupos que criamos em res/values/strings.xml. Tambm
veremos um exemplo de uso da classe android.Rcomo visto em2.1.2em que explicadoa diferena entre as classes de recursos. Mas antes temos que atualizar nosso layoutsalvar.xml. Adicione o Spinnerlogo abaixo do e-mail, como mostra o trecho abaixo:
1
2
6
7
12
13
17
18
Cdigo-fonte 35: Adicionando elemento Spinner [res/layout/salvar.xml]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
47/61
3.3. UTILIZANDO AS PREFERNCIAS DO ANDROID 37
Agora j podemos carregar e popular o Spinnerna classe SalvarActivity.
1 public class SalvarActivity extends Activity {
2
/* ... */3 private Spinner spGrupo = null;
4
5 private void carregar() {
6 /* ... */
7 spGrupo = (Spinner) findViewById(R.id.sp_grupo);
8 ArrayAdapter adapter =
9 ArrayAdapter.createFromResource(this,
10 R.array.array_grupos, android.R.layout.simple_spinner_item);
11 adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item );
12 spGrupo.setAdapter(adapter);
13
/* antes de verificar o parmetro contatoId */14 }
15
16 private void carregarContato() {
17 spGrupo.setSelection(helper.getGrupo(c));
18 c.close();
19 }
20
21 private void ir() {
22 btSalvar.setOnClickListener(new View.OnClickListener() {
23 /* ... */
24 contato.setGrupo(spGrupo.getSelectedItemPosition ());25 /* antes de validar e salvar */
26 }
27 }
28 }
Cdigo-fonte 36: Utilizao de Spinner [SalvarActivity.java]
Note a utilizao da classe android.Rnas linhas 10 e 11 . Eles servem para definiro layout do Spinner. Isso quer dizer que voc pode implementar como seu Spinner ir
aparecer na tela da mesma maneira que implementamos a linha da ListViewem2.1.5.
3.3.4 A classe PreferenceActivity
Afinal vamos utilizar as preferncias do Android. Neste exemplo a usaremos para decidirqual grupo doarray
gruposaparecer selecionado por padro. A princpio um exemplo
bem simples, mas que pode ser ajustado para outras finalidades, o que importa realmente a ideia.
Para comear criaremos um layoutem res/layoutchamado preferencias.xml. Noprojeto clique com boto direito do mouse e selecione New Other..., pesquise porAndroid XML FileeNext. EmResource TypeescolhaPreferencee escrevapreferencias
em File. Logo abaixo em Root Element escolha a opo PreferenceScreen, ento
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
48/61
38 CAPTULO 3. LIVRO DE RECEITAS
Finish.Utilizando a ferramenta ADT adicione um elementoListPreferenceaPreferenceScreen.
Defina os parmetros necessrios como mostra o cdigo abaixo:
1
2
3
10
Cdigo-fonte 37: XML descrevendo layout de preferncias [res/xml/preferencias.xml]
Crie uma nova classe chamada EditarPreferencias em contatos.app.view her-dando de PreferenceActivity. Agora de uma maneira bem simples implementaremosessa classe. Veja:
1 package app.contatos.view;
2
3 import android.os.Bundle;4 import android.preference.PreferenceActivity;
5 import app.contatos.R;
6
7 public class EditarPreferencias extends PreferenceActivity {
8
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 addPreferencesFromResource(R.xml.preferencias);
13 }
14 }
Cdigo-fonte 38: Activity para mostrar preferncias [EditarPreferencias.java]
Para chamar a nova Activitytemos ainda que mape-la no AndroidManifeste criarum item no menu.
1
Cdigo-fonte 39: Mapeando Activity EditarPreferencias [AndroidManifest.xml]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
49/61
3.3. UTILIZANDO AS PREFERNCIAS DO ANDROID 39
1
2
3
4
8
9
Cdigo-fonte 40: Adicionar item Preferncias ao menu principal[res/menu/main
menu.xml]
Agora que adicionamos um item ao menu, temos que capturar o evento quando ousurio o selecionar e direcion-lo s Preferncias. Isso deve ser feito em MainActivity.
1 /* ... */
2 @Override
3 public boolean onOptionsItemSelected(MenuItem item) {
4 if (item.getItemId() == R.id.menu_add) {
5 irPara(SalvarActivity.class);
6 return true;
7 } else if (item.getItemId() == R.id.menu_pref) {
8 irPara(EditarPreferencias.class);
9 return true;10 }
11 return super.onOptionsItemSelected(item);
12 }
13
14 private void irPara(Class clazz) {
15 irPara(clazz, null);
16 }
17
18 private void irPara(Class clazz, String id) {
19 Intent intent = new Intent(MainActivity.this, clazz);
20 if (id != null) {21 intent.putExtra(_ID, id);
22 }
23 startActivity(intent);
24 }
Cdigo-fonte 41: Ir para Preferncias pelo menu principal [MainActivity.java]
Note que para ter um cdigo mais eficiente e otimizado tivemos que mudar o mtodoirParaSalvar para irPara passando como parmetro a classe que desejamos ir. Essa
mudana boa mais causa um impacto em outros trechos do cdigo. Conserte-os da
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
50/61
40 CAPTULO 3. LIVRO DE RECEITAS
seguinte maneira:
1 /* ... */
2 private void configurar() {
3 listView.setOnItemClickListener (new OnItemClickListener() {
4 public void onItemClick(AdapterView parent, View view,
5 int position, long id) {
6 irPara(SalvarActivity.class, String.valueOf(id));
7 }
8 });
9
10 listView.setOnItemLongClickListener (new OnItemLongClickListener() {
11 public boolean onItemLongClick(AdapterView parent, View view,
12 final int position, final long id) {
13 /* ... */
14 public void onClick(DialogInterface dialog, int which) {
15 switch (which) {
16 case 0: // editar
17 irPara(SalvarActivity.class, String.valueOf(id));
18 break;
19 /* ... */
20
21 }
22 }
23 }
24
}25 }
Cdigo-fonte 42: Mudana em mtodo irParaSalvar [MainActivity.java]
Por fim temos que selecionar o item que o usurio quer que esteja selecionado porpadro ao inserir um novo contato. Assim, em SalvarActivityadicione o trecho:
1 private void carregar() {
2 /* ... */
3 contatoId = getIntent().getStringExtra(MainActivity._ID);
4 if (contatoId != null) {5 carregarContato();
6 } else {
7 SharedPreferences preferencias =
8 PreferenceManager.getDefaultSharedPreferences (this);
9 spGrupo.setSelection(
10 Integer.parseInt(preferencias.getString( "lista_grupos", "0")));
11 }
12 }
Cdigo-fonte 43: Obtem o valor padro definido nas Preferncias [SalvarActivity.java]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
51/61
3.4. GRUPO DE CONTATOS USANDO GRID 41
3.4 Grupo de Contatos usando Grid
Uma das coisas mais legais quando falamos de aparelhos mveis a ideia da viso da lista
de aplicativos usada comumente com o cone e o texto logo abaixo. Essa ideia pode serfacilmente implementada em um aplicativo Android usando GridView.
Nessa implementao vamos criar uma tela que mostra os grupos de contatos em formade Gride ao clicar levaremos o usurio a lista de contatos mostrando apenas aquelescontatos de um determinado grupo.
3.4.1 Layout usando GridView
Para comear criaremos um layout em res/layoutchamado grupos
item.xml. Ele irconter a imagem e o texto que sero exibidos no GridView. Faa como mostra o trechoabaixo:
1
2
7
8
13
14
23
Cdigo-fonte 44: Item do Layout de Grupos [res/layout/grupositem.xml]
Hora de criar o GridView. Para isso crie um novo layout em res/layout chamado
grupos.xml. Adicione apenas um GridViewcomo mostra o trecho de cdigo abaixo:
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
52/61
42 CAPTULO 3. LIVRO DE RECEITAS
1
2
6
7
12
13
14
15
Cdigo-fonte 45: Layout de Grupos [res/layout/grupos.xml]
Dica: a ferramenta ADT prov uma forma de pr-visualizar seu layout. Note que nalinha 12 temos um comentrio e nele temos a referncia ao layout grupos
item. Para
isso apenas clique com boto direito do mousena GridView e na opo Preview GridContent Choose Layout... selecione grupos
item.
3.4.2 Activity para visualizar os Grupos
Como de se imaginar temos que criar uma Activitypara visualizar os Grupos.
1 public class GruposActivity extends Activity {
2
3 private GridView grid = null;
4
5 @Override
6 protected void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8
9 setContentView(R.layout.grupos);
10 carregar();
11 }
12
13 private void carregar() {
14 grid = (GridView) findViewById(R.id.gv_grupos);
15 }
16 }
Cdigo-fonte 46: Activity para visualizar Grupos [GruposActivity.java]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
53/61
3.4. GRUPO DE CONTATOS USANDO GRID 43
Temos que criar duas classes internas para nos ajudar a criar cada item do grupo decontatos. Para isso usaremos a classe abstrata BaseAdapter.
1
/* ... */2 static class IconeAdapter extends BaseAdapter {
3
4 private Context context;
5
6 public IconeAdapter(Context context) {
7 super();
8 this.context = context;
9 }
10
11 static class GruposHolder {
12 public ImageView icone;13 public TextView texto;
14 }
15
16 public int getCount() {
17 return 0;
18 }
19
20 public Object getItem(int position) {
21 return null;
22 }
23
24 public long getItemId(int position) {
25 return 0;
26 }
27
28 public View getView(int position, View convertView, ViewGroup parent) {
29 return null;
30 }
31 }
Cdigo-fonte 47: Adapter responsvel por cada item do Grid [GruposActivity.java]
Nesse momento precisamos usar a ferramenta Inkscape e criar alguns cones. Para osexemplos a seguir voc deve criar um cone para cada item do grupo, sendo eles:
amigos
trabalho
conhecidos
famlia
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
54/61
44 CAPTULO 3. LIVRO DE RECEITAS
Para ttulo de exemplo crie apenas cones simples e depois tente fazer itens mais sofis-ticados. Em http://developer.android.com/design/style/iconography.html vocpode ver como devem ser criados os cones para seu aplicativo.
Criando cones com Inkscape
Use o Inkscape para criar um novo cone. No menuArquivo Propriedades do Desenho...ou apenas Shift + Ctrl + D e altere a largura e altura para 512px.
Aperte 5 para centralizar a folha e crie um quadrado (F4) um pouco menor que apgina. Utilize Ctrl para criar um quadrado perfeito. Altere a borda usando o crculobranco no canto superior direito do quadrado. Selecione uma cor legal.
O Android possui uma paleta de cores que pode lhe ajudar inicialmente. Veja a tabelaabaixo:
Cor Tom claro Tom escuro
Azul #33B5E5 TTT #0099CC TTT
Roxo #AA66CC TTT #9933CC TTT
Verde #99CC00 TTT #669900 TTT
Laranja #FFBB33 TTT #FF8800 TTT
Vermelho #FF4444 TTT #CC0000 TTT
Tabela 3.1: Paleta de cores do Android
Mais detalhes em http://developer.android.com/design/style/color.html.
Para alterar a cor clique com boto direito do mouseno quadrado e selecione Preenchimentoe contorno. Observe a entrada de texto onde aparece RGBA. Altere com os valores acimamantendo os dois ltimos, pois eles so referentes a transparncia.
Chegou a hora de exportar seu cone para os tamanhos sugeridos pelo Android. Bastair no menuArquivo Exportar Bitmap...ou ainda Shift + Ctrl + E. Os tamanhosesto definidos na tabela abaixo:
Local Tamanho
res/drawable-xhdpi 96px
res/drawable-hdpi 72px
res/drawable-mdpi 48px
res/drawable-ldpi 36px
Tabela 3.2: Localizao e tamanho dos cones
Exporte o cone para cada um desses diretrios, crie-os caso no existam. Como temosquatro grupos crie quatro cones usando cores diferentes. Siga a nomenclatura sugerida
em2.1.2Conveno de nomes para cones, exemplo: iclaunchergrupoamigos.png.
http://developer.android.com/design/style/iconography.htmlhttp://developer.android.com/design/style/color.htmlhttp://developer.android.com/design/style/color.htmlhttp://developer.android.com/design/style/color.htmlhttp://developer.android.com/design/style/iconography.html7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
55/61
3.4. GRUPO DE CONTATOS USANDO GRID 45
3.4.3 Implementando o Adapter
1 public class GruposActivity extends Activity {2 /* ... */
3 static final int[] icones = {
4 R.drawable.ic_launcher_grupo_amigos ,
5 R.drawable.ic_launcher_grupo_trabalho ,
6 R.drawable.ic_launcher_grupo_conhecidos ,
7 R.drawable.ic_launcher_grupo_familia
8 };
9
10 private void carregar() {
11 /* ... */
12 grid.setAdapter(new IconeAdapter(getBaseContext()));13 }
14
15 static class IconeAdapter extends BaseAdapter {
16
17 public int getCount() {
18 return icones.length;
19 }
20
21 /* ... */
22 public View getView(int position, View convertView, ViewGroup parent) {
23 GruposHolder holder = null;24 View v = convertView;
25 if (v == null) {
26 LayoutInflater inflater = (LayoutInflater) context
27 .getSystemService(Context.LAYOUT_INFLATER_SERVICE );
28 v = inflater.inflate(R.layout.grupos_item, null);
29 holder = new GruposHolder();
30 holder.texto = (TextView) v.findViewById(R.id.tv_texto);
31 holder.icone = (ImageView) v.findViewById(R.id.iv_icone);
32 v.setTag(holder);
33 } else {
34 holder = (GruposHolder) v.getTag();35 }
36 holder.icone.setImageResource(icones[position]);
37 holder.texto.setText(context.getResources()
38 .getStringArray(R.array.array_grupos)[position]);
39 return v;
40 }
41 }
42 }
Cdigo-fonte 48: implementao do Adapter [GruposActivity.java]
7/25/2019 Guia Aberto Android Ed2 121029164007 Phpapp02
56/61
46 CAPTULO 3. LIVRO DE RECEITAS
Como visto em2.1.5Mostrando os dados na View, no Adapterpodemos fazer cachedos objetos e otimizar o cdigo. Isso pode ser observado a partir da linha 25 at a linha
35 , onde um teste realizado para ver se a linha est em cache.
Observao: na linha 37 existe um trecho de cdigo que no est nada otimizado. Noentanto usando string-array a nica maneira de dar certo. Isso poderia ser evitado seos grupos de contatos fossem retirados do banco de dados. Seguindo as instrues antesabordadas tente voc mesmo implementar usando banco de dados. uma tima maneirade aprender melhor como funciona um aplicativo Android.
Finalize adicionando o Activity no AndroidManifest.xml. Clique na aba inferior
em Applicatione em Application Nodesclique em Add. Escolha Activityna lista deopes e no atributo Nameclique em Browsere busque por GruposActivity.
Para visualizar a nova Activity preciso adicionar um novo item no menu principal.Reveja2.1.2Activity, e implemente essa parte. No esquea de adicionar uma condiono mtodo onOptionsItemSelectedda classe MainActivity.
3.4.4 Selecionando contatos de um determinado grupo
Para no deixar dvidas quanto a implementao deste trecho vamos fazer com que ao
clicar em um determinado grupo, somente contatos daquele grupo apaream na lista que