guia aberto android ed2 121029164007 phpapp02

Upload: felicianosantos2394

Post on 01-Mar-2018

233 views

Category:

Documents


0 download

TRANSCRIPT

  • 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.html
  • 7/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.html
  • 7/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.html
  • 7/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.html
  • 7/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.html
  • 7/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.html
  • 7/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.html
  • 7/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.html
  • 7/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