android
Upcoming SlideShare
Loading in...5
×
 

android

on

  • 13,742 views

Arquivo em pdf com o básico da aprendizagem de programação Android.

Arquivo em pdf com o básico da aprendizagem de programação Android.

Statistics

Views

Total Views
13,742
Views on SlideShare
13,742
Embed Views
0

Actions

Likes
2
Downloads
754
Comments
1

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

android android Document Transcript

  • Luciano Alves da SilvaApresentaçãoO Android é uma plataforma aberta voltada para dispositivos móveis desenvolvida pela Google e atualmente é mantida pela Open Handset Alliance(OHA). Todas as aplicações desenvolvidas para essa plataformautilizam a linguagem Java, o que facilita muitos programadorescom conhecimentos em Java a desenvolver aplicações para essaplataforma.Este livro tem por objetivo mostrar de modo fácil comoprogramar na plataforma para dispositivos móveis da Google(Android) usando a IDE Eclipse.Para quem dedico este livro?Este livro é dedicado aos usuários experientes ou iniciantes emprogramação (tanto para Desktop, Móbile e etc.), que já tenhaalgum contato com a linguagem Java ou de suas derivadas (C,C++ ou C#).
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresÍndice analítico1) Visão geral sobre o Google Android ................................... 6 1.1) Introdução...................................................................... 6 1.2) Estrutura Geral da plataforma Google Android ............ 9 1.2.1) A arquitetura do Android.......................................... 10 1.2.2) Aplicações ................................................................ 10 1.2.3) Android Runtime ...................................................... 12 1.2.4) Linux Kernel............................................................. 122) Instalando e Configurando o Android SDK no Eclipse .. 133) Começando a programar no Google Android ................. 314) Conhecendo as widgets do Android.................................. 52 4.1) A widget TextView ..................................................... 52 4.2) A widget EditText ....................................................... 52 4.3) A widget Button .......................................................... 52 4.4) Desenvolvendo uma aplicação que soma números ..... 52 4.5) A widget AutoCompleteTextView.............................. 69 4.6) A widget CheckBox .................................................... 74 4.7) Desenvolvendo uma aplicação simples de compras.... 74 4.8) A widget RadioButton ................................................. 80 4.9) Desenvolvendo uma aplicação de cálculo de salário(Com RadioButton)................................................................... 80 4.10) A widget Spinner ....................................................... 90 4.11) Desenvolvendo uma aplicação de cálculo de salário(Com Spinner)........................................................................... 91 4.12) A widget ListView .................................................... 97 4.13) Desenvolvendo uma aplicação de lista telefônica ..... 97 4.14) A widget Imageview................................................ 1032
  • Luciano Alves da Silva 4.15) Desenvolvendo uma aplicação que visualiza imagens(Com ImageView) .................................................................. 103 4.16) A widget Gallery ..................................................... 114 4.17) Desenvolvendo uma aplicação que visualiza imagens(Com Gallery) ......................................................................... 114 4.18) A widget ProgressBar.............................................. 125 4.19) Desenvolvendo uma aplicação que simula umdownload................................................................................. 126 4.20) A widget SeekBar.................................................... 133 4.21) Desenvolvendo uma aplicação que demonstre osistema RGB Color. ................................................................ 133 4.22) A widget DatePicker................................................ 141 4.23) Desenvolvendo uma aplicação de calendário.......... 141 4.24) A widget TimePicker............................................... 145 4.25) Desenvolvendo uma aplicação que faz uso doTimePicker.............................................................................. 145 4.26) A widget ToogleButton ........................................... 149 4.27) Desenvolvendo uma aplicação que faz uso doToogleButton .......................................................................... 149 4.28) A widget Chronometer ............................................ 152 4.29) Desenvolvendo um cronômetro digital ................... 152 4.30) A widget DigitalClock............................................. 161 4.31) Desenvolvendo uma aplicação que mostra a horacorrente do sistema. ................................................................ 161 4.32) A widget ZoomControls .......................................... 163 4.33) Desenvolvendo um programa que aplica zoom emImagens ................................................................................... 1635) Mudando de layouts ......................................................... 170 5.1) Desenvolvendo uma aplicação de cadastro ............... 1776) Trabalhando com mais de uma Activity (Atividade) .... 203 3
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores7) Trabalhando com o componente TabWidget................. 2108) Trabalhando com menus em uma aplicação.................. 2199 ) Conhecendo as caixas de diálogo do Android............... 229 9.1) A classe AlertDialog.................................................. 229 9.2) A classe DatePickerDialog ........................................ 237 9.3) A classe TimePickerDialog ....................................... 239 9.4) A classe ProgressDialog ............................................ 241 9.5) Criando uma caixa de diálogo personalizada ........... 24510) Programação com internet em Android....................... 248 10.1) Trabalhando com sockets em Android .................... 248 10.2) Desenvolvendo uma aplicação cliente em Android eum servidor Java. .................................................................... 249 10.3) Obtendo conteúdo de uma URL .............................. 263 10.4) Enviando informações para uma página Web via URL................................................................................................ 269 10.5) Enviando informações para uma página Web viaPOST (Usando a classe HttpPost) .......................................... 275 10.6) Fazendo download de um arquivo........................... 285 10.7) O componente WebView ........................................ 289 10.8) Desenvolvendo uma aplicação que visita páginas Web................................................................................................ 29211) Programação com multimídia ....................................... 29612) Programação com banco de dados................................ 330 12.1) A linguagem SQL.................................................... 330 12.1.1) O comando CREATE TABLE ............................. 331 12.1.2) O comando INSERT............................................. 332 12.1.3) O comando UPDATE........................................... 3324
  • Luciano Alves da Silva 12.1.4) O comando DELETE ........................................... 333 12.1.5) O comando SELECT............................................ 333 12.2) Exemplos de SQL usando as funções do Android .. 338 12.3) Desenvolvendo uma aplicação de cadastro (segundaversão)..................................................................................... 34713) Propriedades e eventos dos componentes trabalhados 361 Widget TextView.............................................................. 361 Widget EditText / AutoCompleteTextView ..................... 363 Widget Button................................................................... 367 Widget ToogleButton ....................................................... 369 Widget CheckBox/RadioButton ....................................... 372 Widget Spinner / ListView ............................................... 374 Widget ImageView ........................................................... 376 Widget Gallery.................................................................. 377 Widget ProgressBar .......................................................... 378 Widget SeekBar ................................................................ 380 Widget DatePicker ............................................................ 381 Widget TimePicker ........................................................... 383 Widget Chronometer......................................................... 384 Widget ZoomControls ...................................................... 385 Componente MediaPlayer................................................. 386 Widget VideoView ........................................................... 387Apêndice – Links Úteis ......................................................... 391 5
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores1) Visão geral sobre o Google Android1.1) IntroduçãoC onforme mencionado na apresentação deste livro, o Android é uma plataforma desenvolvida pela Google voltada para dispositivos móveis, totalmente aberta élivre (Open Source), que foi divulgada em 5 de novembro de2007. Ela foi desenvolvida na plataforma Java com sistemaoperacional Linux e atualmente essa plataforma é mantida pelaOHA (Open Handset Alliance), um grupo constituído poraproximadamente 80 empresas as quais se uniram para inovare acelerar o desenvolvimento de aplicações e serviços, com oobjetivo e trazer aos consumidores uma experiência mais ricaem termos de recursos, menos dispendiosa em ternos financeirospara o mercado móvel.Um dos SmartPhones que ofereceu suporte a esse sistemaoperacional foi o G1 da empresa T-Mobile. Confira na imagemseguinte:6
  • Luciano Alves da Silva G1 - T-MobileNão demorou muito para que o Android chegasse aqui noBrasil. Hoje já contamos com operadoras como a Claro, TIM eVivo que já oferecem suporte a essa plataforma.Os SmartPhones disponíveis aqui no Brasil oferecidos poralgumas dessas operadoras, que suportam o sistema Android éo Samgung Galaxy e o Motorola Milestone. Confira essesSmartPhones nas imagens seguintes: 7
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Samsung Galaxy Motorola Milestone8
  • Luciano Alves da Silva1.2) Estrutura Geral da plataforma Google AndroidO Android SDK é uma ferramenta de desenvolvimento quedisponibiliza um conjunto de APIs necessárias para desenvolveraplicações para a plataforma Android, utilizando a linguagemJava.Vamos conhecer os recursos encontrados nessa plataforma:- Application framework: Permite a reutilização e substituiçãode componentes ;- Dalvik virtual machine: É uma Máquina Virtual Java (JVM)voltada para dispositivos móveis ;- Browser Integrado baseado no webkit engine ;- Gráficos Otimizados O Android é cosntituído por bibliotecas2D e 3D baseada na especificação OpenGL ES 1.0 ;- SQLite: Sistema Gerenciador de Banco de Dados (SGBD) jáembutido no Android para guardar dados ;- Suporte multimídia: A plataforma já oferece para áudio,vídeo e formatos de imagem (MPEG4, H.264, MP3, AAC,AMR, JPG, PNG, GIF) ;- Telefonia GSM (dependente de hardware) ;- Bluetooth, EDGE, 3G, e WiFi (dependente de hardware) ; 9
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores- Câmera, GPS, compasso, e acelerômetro (dependente dehardware) ;- Rico ambiente de desenvolvimento , incluindo um emuladorde dispositivo, ferramentas de depuração, memória,performance e um plugin para o Eclipse (ADT) ;1.2.1) A arquitetura do Android Arquitetura geral da plataforma1.2.2) AplicaçõesO Android nos fornece um conjunto de aplicaçõesfundamentais, são elas:- um cliente de e-mail;- programa de SMS;10
  • Luciano Alves da Silva- agenda;- mapas;- navegador;- contatos entre outros.Todos os aplicativos acima presentes no Android foramdesenvolvidos na linguagem de programação Java.O Android nos fornece um conjunto de bibliotecas C/C++utilizadas por vários componentes do sistema. Veja algumas dasbibliotecas abaixo:- System C library: Consiste em uma implementação derivadada biblioteca C padrão baseado no sistema (libc) do BSDsintonizada para dispositivos rodando Linux.- Media Libraries: Baseado no PacketVideo’s OpenCORE; sãoas bibliotecas que suportam os mais diversos formatos de áudioe vídeo, incluindo também imagens.- Surface Manager: Responsável pelo acesso ao subsistema deexibição bem como as múltiplas camadas de aplicações 2D e3D;- LibWebCore: Consiste em um web browser engine utilizadotanto no Android Browser quanto para exibições web.- SGL – o engine de gráficos 2D- 3D libraries: Uma implementação baseada no OpenGL ES 1.0APIs; As bibliotecas utilizam aceleração 3D via hardware(quando disponível) ou o software de renderização 3D altamenteotimizado incluído no Android. 11
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores- FreeType – Biblioteca responsável pela renderização de fontesbitmap e vector;- SQLite – Conforme já mencionado, consiste no sistemagerenciador de banco de dados (SGBD) relacional disponívelpara todas as aplicações.1.2.3) Android RuntimeO Android é costituído por um conjunto de bibliotecas quefornece a maioria das funcionalidades disponíveis nas principaisbibliotecas da linguagem Java.Toda aplicação Android roda em seu próprio processo, com suaprópria instância da máquina virtual Dalvik. O Dalvik foi escritode forma a executar várias VMs eficientemente. Ele executaarquivos .dex, que é otimizado para consumo mínimo dememória. A VM é baseada em registros e roda classescompiladas pela linguagem Java que foram transformadas emarquivos .dex, através da ferramenta “dx” incluída no SDK.O Dalvik VM foi baseado no kernel do Linux parafuncionalidades subjacentes como o encadeamento e a gestão debaixo nível de memória.1.2.4) Linux KernelO Android foi projetado em cima da versão 2,6 do kernel doLinux para os serviços centrais do sistema, tais como segurança,gestão de memória, gestão de processos, etc. O kernel tambématua como uma camada de abstração entre o hardware e o restodo software.12
  • Luciano Alves da Silva2) Instalando e Configurando o Android SDK no EclipseP ara a elaboração desse livro eu fiz o uso do Eclipse Galileo (Eclipse 3.5.1 para Windows), o SDK do Android Revisão 10 e o plugin do Android para o EclipseADT-10.0.1. Qualquer versão (de preferência superior) dosprogramas citados acima serve. Para que toda essa aplicaçãofuncione é necessário que você tenha instalado, antes de tudo, aMáquina Virtual Java (de preferência a versão 5 ou posterior).Bom, mãos a obra.Para saber se você possui uma Maquina virtual Java entre noprompt de comando de digite a seguinte linha: java –versionSe mostrar algo parecido como mostra o código abaixo: java version "1.6.0_07"Java(TM) SE Runtime Environment (build 1.6.0_07-b06)Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode,sharing)Significa você possui uma máquina virtual Java instalada no seucomputador, caso contrário, instale o JDK. Você pode fazer odownload do JDK pelo link abaixo:http://www.oracle.com/technetwork/java/javase/downloads/index.html 13
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSe você já possui a máquina virtual Java instalada em seucomputador, basta agora você fazer o download do Eclipse, quepode ser feita pelo link abaixo:http://www.eclipse.org/downloads/Para fazer o download do Android SDK e do seu plugin , façapelo link abaixo:http://developer.android.com/sdk/index.htmlDepois de obter os programas e plugins citados acima, vamosfazer agora as devidas configurações. Primeiramente, você irádescompactar o arquivo “android-sdk_r10-windows.zip”, depreferência no diretório raiz “C:”. Depois de descompactar,execute o utilitário “SDK Manager”, que se encontra dentro dapasta descompactada, conforme é mostrado na figura abaixo: Conteúdo do arquivo descompactado14
  • Luciano Alves da SilvaAo executá-lo ele irá atualizar as suas fontes , conformedemonstra a figura seguinte: Processo de atualização das informaçõesAo terminar o processamento acima, ele ira mostrar uma lista depacotes disponíveis e necessários para download, comopodemos conferir a figura abaixo: Lista de pacotes disponíveis para download 15
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresVamos cancelar a instalação dos pacotes acima clicando nobotão “Cancel”, pois, não iremos instalar tudo. Feito isso vocêirá visualizar a seguinte caixa de diálogo abaixo: Caixa de diálogo – Installed packagesPrecisamos agora instalar a plataforma Android através destacaixa de diálogo. Clique na seção “Avaiable packages” paravisualizar todos os recursos disponíveis para instalação. Feitoisso expanda a opção “Android Repository” e automaticamentevocê verá os recursos disponíveis para download como vocêpode conferir na figura abaixo:16
  • Luciano Alves da Silva Caixa de diálogo - Available PackagesNós iremos trabalhar aqui neste livro com a plataforma Android2.1 API 7, revision 2. Então vamos marcar a opção “SDKPlatform Android 2.1, API 7, revision 2” e em seguida vamosclicar no botão “Install Selected”, você verá a seguinte caixa dediálogo abaixo: Preparando para Instalar o Android 17
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresVamos proceder com a instalação clicando no botão “Install”.Feito isso a plataforma Android 2.1 será instalada, conformedemonstra a figura abaixo Instalação do Android em processoDepois de concluída a instalação do Android será mostrada umamensagem pedindo que o ADB seja reiniciado, como demonstraa figura abaixo: Mensagem solicitando para reiniciar do adbClique em “Yes” para reiniciar a ADB, e o resultado você podeconferir na figura abaixo.18
  • Luciano Alves da Silva Instalação do Android concluídaUma etapa concluída. Agora vamos instalar o Eclipse com oplugin do Android. Para instalar o Eclipse simplesmentedescompacte-o em um local apropriado, de preferência no drive“C:”. Depois disso copie para o drive “C:” o plugin do Android“ADT-10.0.1.zip”. Feito isso vamos executar o Eclipse. Com oEclipse aberto na no menu “Help” / “Install New Software”,como mostra a figura abaixo: Install New Software 19
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAo fazer esse procedimento será aberta uma tela conformemostra a figura abaixo: Caixa de diálogo - InstallPara instalarmos o plugin do Android clique no botão “Add”, eserá exibida uma caixa de diálogo conforme mostra a figuraabaixo:20
  • Luciano Alves da Silva Caixa de diálogo - Add SiteAgora vamos clicar no botão “Archive” e iremos procurar eselecionar o plugin do Android “A.D.T-10.0.1.zip”. Preencha ocampo “Name” como mostra a figura abaixo: Caixa de diálogo - Add SiteAo clicar em “OK” será mostrada uma tela, conforme demonstraa figura seguinte: 21
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Caixa de Dialogo - InstallAgora expanda o item “Developer Tools” e marque todas asopções, conforme mostra a figura seguinte:22
  • Luciano Alves da Silva Caixa de Dialogo - InstallApós fazer isso clique no botão “Next”, e em seguida serámostrada a próxima tela, conforme demonstra a figura abaixo: 23
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Caixa de Dialogo - InstallAgora, clique no botão “Finish”. Após isso ocorrerá algunsprocessos, como demonstra a figura abaixo, aguarde atéterminar. Instalando do Android no Eclipse24
  • Luciano Alves da SilvaSe em algum momento durante o processo for exibida a figuraabaixo: Caixa de mensagemPode clicar em “OK” sem problemas, e o processo secompletará. Após o termino do processo você deve reiniciar oEclipse, clicando em “Yes”, na mensagem abaixo: Caixa de mensagemApós o Eclipse ter reiniciado, vamos fazer agora asconfigurações para fazer conexão com o emulador do Android.Vamos no menu “Window” / “Preferences”. Aberta a caixa dediálogo, selecione o item “Android” e será mostrada uma tela,conforme demonstra a figura seguinte: 25
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Caixa de diálogo - PreferencesAgora você vai selecionar o diretório onde se encontra oAndroid, que aqui no meu computador, o Android se encontrainstalado em “C:android-sdk-windows”, logo, terei queselecionar essa pasta. Feito isso basta clicar em “OK”.Para finalizar vamos definir um dispositivo virtual, conhecidocomo AVD (Android Virtual Device), onde nossas aplicaçõesdaqui para frente serão executadas. Para isso, vá no menu“Windows” / “Android SDK and AVD Manager”, conformemostra a figura abaixo:26
  • Luciano Alves da Silva Android SDK and AVD ManagerFeito o procedimento acima, será aberta uma tela conformemostra a figura abaixo: Caixa de diálogo - Virtual Settings 27
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresPara criarmos um dispositivo virtual clique no botão “New”, eserá aberta uma tela conforme mostra a figura abaixo: Caixa de diálogo - Crete new AVDDe inicio, vamos configurar o básico pra executarmos a nossaaplicação. Em “Name” você define o nome do AVD, vamoschamá-lo de “Emulador”.Em “Target” definirmos a plataforma-alvo a ser executada,neste caso só temos uma o “Android 2.1-update1 - API Level7”. Vamos selecioná-la.Em Skin na opção “Built-in” a opção padrão é “Default(WVGA800)”. Vamos mudar essa opção para “HVGA”.28
  • Luciano Alves da SilvaDepois de preencher todos os campos, a tela de criação do AVDdeve estar de acordo com a figura abaixo: Caixa de diálogo - Create new AVDPara criarmos nosso AVD, clique no botão “Create AVD” epronto. O resultado você confere na figura seguinte: 29
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores AVD Criado com sucessoAté aqui aprendemos a instalar e configurar a plataformaAndroid no Eclipse. Agora vamos dar nossos primeiros passosdesenvolvendo uma aplicação básica no Android.30
  • Luciano Alves da Silva3) Começando a programar no Google AndroidD epois de tudo configurado e instalado, vamos começar a desenvolver nossas aplicações no Android. Para isso, vamos criar um novo projeto Android indo no menu“File” / “New” / “Other”. Selecione o projeto Android conformefigura abaixo. Depois de selecionar, clique em “Next”: Criando um novo projeto Android no EclipseApós clicar em “Next” na figura acima, será exibida uma telaconforme figura abaixo: 31
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Criando um novo projeto Android no EclipseVamos preencher os campos citados abaixo:Project name : HelloWorldAndroidApplication name : Hello World AndroidPackage name: br.com.apphelloCreate Activity : AppHelloMin SDK Version : 732
  • Luciano Alves da SilvaOs campos preenchidos acima devem estar de acordo com afigura abaixo: Criando um novo projeto Android no EclipseDepois de tudo preenchido basta clicar no botão “Finish” epronto, nosso projeto foi criado. Em “Package Explorer”, vamosdar uma olhada na estrutura do projeto, simplesmente clicandono botão “+”, é só seguir a figura abaixo. Aproveite e abra oarquivo “AppHello.java” como também demonstra a figura: 33
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Visão geral de uma aplicação AndroidIrei descrever a estrutura de um projeto Android. Observem quedentro da pasta de projeto “HelloWorldAndroid” existe umapasta chamada “src”, e dentro dela é que ficam os códigos fontesdas aplicações. Observem que o arquivo “AppHello.java” seencontra dentro do pacote “br.com.apphello” (Esse pacotetambém é uma pasta). Esse arquivo é a nossa aplicação Android.Vou descrever em detalhes o arquivo “AppHello.java” (Veja ocódigo abaixo):package br.com.apphello;import android.app.Activity;import android.os.Bundle;public class AppHello extends Activity { /** Called when the activity is first created.*/34
  • Luciano Alves da Silva @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } }Diferentemente das aplicações comuns em Java (J2SE), todaclasse para aplicação Android deve ser derivada da classeActivity (Atividade), e possui como método principal oonCreate. Dentro desse método ele invoca o método onCreateda super classe passando mesmo parâmetro (osavedInstanceState), logo após esse método, vem o métodosetContentView, responsável por exibir a tela da minhaaplicação baseado nos layouts “xml". Por padrão ele chama oarquivo “main.xml”.Dentro da pasta “HelloWorldAndroid” existe um diretóriochamado “res”, onde ficam armazenados todos os recursosutilizados pela aplicação. Dentro do diretório “res” existemcinco diretórios, cada um deles com uma finalidade quedescreverei agora:Os diretórios “drawable-hdpi”,”drawable-mdpi” e “drawable-ldpi”.A partir da versão 1.6 da plataforma Android foram adicionadostrês diretórios responsáveis pelo gerenciamento de imagens:“drawable-hdpi”, “drawable-ldpi”, “drawable-mdpi”. Qual adiferença de um para outro ? Cada um desses diretórios só seráutilizado de acordo com a resolução do Android em uso, ou seja,qual modelo de emulador de você estiver usando. Por exemplo,quando você usa uma resolução de 480x800 no seu emulador, é 35
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresutilizado o diretório “drawable-hdpi” para buscar a imagem quevai representar o ícone da sua aplicação Android. Se você forusar uma resolução 320x480 (que normalmente é a resoluçãopadrão do emulador Android), é utilizado o diretório “drawable-mdpi”. Se você usar uma resolução 240x400, é utilizado odiretório “drawable-ldpi”. O diretório “layout” armazena todos os layouts da aplicaçãoAndroid, que normalmente são arquivos “.xml”. Para quemconhece a combinação HTML + JavaScript, no Android ésimilar, é a combinação de XML + Java, logo, todos os nossoscomponentes vão ser adicionados usando tags XML. Por padrãoo arquivo de layout é o “main.xml”.Uma coisa interessante que existe nessa versão (e alguma dasanteriores do SDK) é a capacidade de você ter um “preview” decomo ficara a sua aplicação antes mesmo de você rodar oemulador Android, para confirmarmos isso, simplesmente vá nodiretório “res/layout” e de um duplo clique no arquivo“main.xml”, e você verá o seu preview conforme demonstra afigura seguinte:36
  • Luciano Alves da Silva Preview da aplicação AndroidPara visualizarmos o código do arquivo “main.xml”simplesmente clique na guia “main.xml”, que se encontra abaixoda seção “Views” como demonstra a figura seguinte: 37
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Preview da aplicação AndroidVeja o seu código abaixo:<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /></LinearLayout>38
  • Luciano Alves da SilvaObserve que após a primeira linha (prólogo xml), existe umatag chamada LinearLayout, responsável por organizar oscomponentes exibidos na tela, por padrão os componentes sãodistribuídos na vertical pelo atributoandroid:orientation="vertical".Dentro desta tag existe um componente chamado TextView,que representa um texto a ser exibido na tela que por padrão, jávem escrito a frase “Hello World, AppHello”, através doatributo android:text="@string/hello”, onde o valor“@string/hello” equivale a uma constante que está definida noarquivo “strings.xml”, que se encontra no diretório “values”,que iremos descrevê-lo agora. O diretório “values” armazena valores estáticos (constantes)que podem ser utilizados por um arquivo “.xml”. Normalmenteesses valores estáticos devem ser armazenados no arquivo“strings.xml”. Vá no diretório “res/values” e de um duplo cliqueno arquivo “strings.xml”, e será mostra o gerenciador dessearquivo conforme mostra a figura seguinte: 39
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Propriedades do arquivo “strings.xml”Observe que nas propriedades do atributo “hello” está atribuídoum valor a ela, que é o valor “Hello World, AppHello!”. Issoquer dizer que lá no arquivo XML no componente TextView,tem uma propriedade chama android:text, com o valor“@string/hello” , que equivale a na verdade a string “HelloWorld, AppHello!”. Para ver a sua estrutura , clique na guia“strings.xml”. O código desse arquivo é igual ao que demonstrao código abaixo:<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Hello World,AppHello!</string> <string name="app_name">Hello WorldAndroid</string></resources>40
  • Luciano Alves da SilvaObservem que dentro desse arquivo eu declaro um valor estáticochamado “app_name”, cujo valor é “Hello World Android”.Dentro da pasta “HelloWorldAndroid” existe um arquivochamado “AndroidManifest.xml” Esse arquivo é o sistemanervoso de uma aplicação Android. É nele que ficam asdefinições referentes à aplicação. De um duplo clique nessearquivo para abri-lo, feito isso será mostrado o seu gerenciador,conforme mostra a figura abaixo: Propriedades do arquivo “AndroidManifest.xml”Bom, o que nos interessa aqui é o código. Para visualizarmosseu código clique na seção “AndroidManifest.xml”. Veja seucódigo abaixo: 41
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android" package="br.com.android" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon"android:label="@string/app_name"> <activity android:name=".AppHello" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>Observem algumas tags interessantes. A tag <application>possui o atributo android:icon, no qual especifico o ícone daaplicação. Como havia citado anteriormente, todas as imagensficam no diretório “drawable” e nesse diretório existe umarquivo de chamado “icon.png” que será o ícone da minhaaplicação. Logo, para usar esse ícone neste atributo, deve-sepassar o valor “@drawable/icon” .Observem que quandoinformamos o ícone, ele deve ser informado sem a extensão(nesse caso, PNG).42
  • Luciano Alves da SilvaObservem agora a tag <activity>, ela define uma atividade(Activity). Dentro desta tag, eu possuo o atributo chamadoandroid:label que define o título da minha aplicação. O títuloque será exibido é o valor que está armazenado no valor estáticoapp_name. Isso é obtido pela atribuiçãoandroid:label="@string/app_name".Como havia falado a aplicação Android nada mais é do que acombinação Java + XML. Agora, como um código Java vaiacessar um componente que está escrito em XML ? Ah, essa é afinalidade do arquivo “R.java” (que fica dentro do pacote “gen”, situado no projeto), ele funciona como uma “interface” entre ocódigo Java e o código XML, logo, se eu quiser manipular emtempo de execução um componente via Java, tenho que fazerinterface com esse arquivo. Em breve vamos ver como.OBS: O arquivo “R.java” não pode ser modificadomanualmente. Ele é modificado automaticamente de acordo comas mudanças feitas no projeto.Agora iremos executar nossa aplicação. Vamos no menu “Run /Run Configurations”, conforme mostra a figura abaixo: “Run Configurations” 43
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Feito isso, será aberta uma caixa de diálogo com vários itens.Clique com o botão direito do mouse no item “AndroidApplication” e selecione a opção New, conforme a figuraabaixo: Criando um novo “Android Application”Feito isso, na propriedade “Name” ao lado digite “AppHello”.Em Project selecione o projeto que criamos em clicando nobotão “Browse”, com o nome de “HelloWorldAndroid”. E porúltimo, em “Launch Action”, deixe marcada a opção “LauchDefault Activity”. Qualquer dúvida siga a figura abaixo: Propriedades do “Android Application”44
  • Luciano Alves da SilvaAgora é só clicar em “Run” e rodar a aplicação. Quando oemulador Android é executado, possivelmente, poderá abrirjunto com ele uma caixa de dialogo, conforme a figura abaixo.Normalmente eu desmarco a opção “Send usage statistics toGoogle” e clico em “Proceed”. Caixa de diálogo do Android SDKPra você que está executando pela primeira vez o emulador doAndroid, vê que o emulador é uma espécie de SmartPhone.Lado esquerdo nós temos a tela do dispositivo e no lado direitotemos o teclado com suas funções, conforme mostra a figuraseguinte: 45
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Emulador do Android em ExecuçãoNo início da execução do emulador mostra o título Android,conforme você vê na figura acima. Depois vem um outro títuloescrito “Android”, com um titulo cinza em animação. Issodemora em torno de 2 a 10 minutos (dependendo da suamáquina. É recomendável que você tenha no mínimo 512 MBde memória e um processador bem rápido para um bomdesempenho da execução) para a aplicação ser exibida, mesmosendo essa aplicação algo muito simples.Passado o tempo que citei acima, será mostrada a nossaaplicação e também algumas mensagens, é só cancelá-las.Quando o emulador chegar nessa tela abaixo:46
  • Luciano Alves da Silva Emulador do Android em ExecuçãoClique no botão redondo com o titulo “MENU” paradesbloquear a tela e a aplicação continuará a processar até sercarregada com sucesso, conforme mostra a figura abaixo: 47
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Emulador do Android em ExecuçãoEsse emulador já vem com uma série de recursos comoNavegador, Aplicações de demonstração, Mapas, Lista decontatos e etc.Se você neste exato momento fechou o emulador após aexecução da aplicação, vou te dizer uma coisa: “Não era paravocê ter feito isso”. Se você esperou muito tempo para ver essaaplicação em execução, ao executar novamente a aplicação,você vai esperar o mesmo tempo. Ao executar pela primeira vezo emulador, e caso vá executar outros programas, minimize oemulador ao invés de fechar, pois se você esperou muito tempopara executar esse programa, com ele minimizado, ao executaroutro programa, o Eclipse vai fazer uso do emulador já aberto48
  • Luciano Alves da Silvaem vez de abrir outro, com isso a aplicação levará em torno de7 a 12 segundos em média para ser executada. Nunca esqueçaisso!Vamos modificar essa aplicação. Minimize o emulador e vamosabrir o arquivo “main.xml”. Na tag TextView que já haviaexplicado a vocês, possui um atributo chamado android:text,onde nele defino o título que será exibido, modifique agora essapropriedade com o seguinte valor (título), conforme o códigoabaixo: android:text="Fala cara, beleza ???"Feito isso, salve a aplicação e veja seu “preview”, clicando naseção “Graphical Layout”. Veja na figura abaixo: Preview da aplicação 49
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresVamos fazer mais uma outra modificação na nossa aplicação.Abra novamente o arquivo “main.xml”, observe que ele possuium TextView certo ? Vamos colocar mais dois componentesTextView, a primeira TextView, no atributo android:text teráo título “Primeira frase”, o segundo TextView terá o título“Segunda Frase” e assim sucessivamente. Veja como ficará ocódigo do arquivo “main.xml” :<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Primeira Frase." /><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Segunda Frase" /><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Terceira Frase???" /></LinearLayout>Feito isso, salve o arquivo e veja seu “preview”, comodemonstra a figura abaixo:50
  • Luciano Alves da Silva Preview da aplicaçãoE ai, está entendo aos poucos como se faz aplicações Android ?Com certeza que sim!Como podemos ver nessa versão do Android, ele já oferece umutilitário que permite a criação de aplicações de forma rápida,simplesmente arrastando e soltando os componentes. Issoacelera o processo de desenvolvimento de aplicações.Neste livro, vamos trabalhar no Android usando esse utilitárioque acelera o processo de desenvolvimento de aplicações, mas,em algumas ocasiões, faremos do modo tradicional, ou seja,digitar o código. Agora vamos aprofundar um pouco e fazer aplicações maisinteressantes com o uso dos Widgets (componentes) existentesna plataforma Android. 51
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores4) Conhecendo as widgets do AndroidT oda aplicação Android é constituída por widgets, que são componentes gráficos que constituem uma aplicação Android. A partir de agora iremos conhecer os widgetsbásicos que constituem a plataforma Android, para odesenvolvimento das aplicações. De acordo com alguns widgetsque fomos conhecendo, vamos desenvolver aplicações quedemonstrem o uso deles.4.1) A widget TextViewA widget TextView funciona como se fosse uma Label(“rotulo”), onde nele podemos mostrar alguma informação,mensagem e etc. Na nossa primeira aplicação tivemos aoportunidade de usarmos esse componente.4.2) A widget EditTextA widget EditText funciona como se fosse caixa onde podemosdigitar nela dados do teclado.4.3) A widget ButtonA widget Button nada mais é do que um Botão de comando ,que quando clicado, dispara uma ação, um evento.4.4) Desenvolvendo uma aplicação que soma númerosCom os componentes até agora vistos, já é possíveldesenvolvermos uma aplicação. Vamos criar agora uma52
  • Luciano Alves da Silvaaplicação que faça uso de um desses widgets. Crie um novoprojeto Android com os seguintes dados:Project Name: SomaNumerosPackage Name: br.com.appsomaCreate Activity: AppSomaApplication Name: Soma NúmerosMin SDK Version: 7Criado o projeto vamos no arquivo “main.xml” desse projeto ecomo havia mencionado, vamos agora fazer uso do utilitário queira nos ajudar a construir a nossa aplicação da forma rápida.Pelo nome do projeto, podemos ver que essa aplicação é umaaplicação de calculo. Essa aplicação vai ler dois númerosinteiros e no final, irá mostrar a soma deles, simples.Vamos no arquivo “main.xml” desse projeto e será carregado o“layout” dessa arquivo, como mostra a figura abaixo: 53
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Tela de layout da aplicação Primeiramente, antes de qualquer modificação noprograma, vamos mudar a resolução da visualização do layoutda nossa aplicação, para que esteja de acordo com a resoluçãodo emulador Android. Na opção onde está selecionada comopadrão “2.7in QVGA” , e vamos selecionar a opção “3.2inHVGA slider (ADP1)” (Essa será a resolução que passaremos atrabalhar daqui pra frente). Você verá que a resolução mudará ,como demonstra a figura abaixo:54
  • Luciano Alves da Silva Tela de layout da aplicaçãoAgora vamos fazer as modificações iniciais no programa.Observe que logo de início, ele mostra a frase “HelloWorld,AppSoma!” na widget TextView. Vamos carregar aspropriedades (Properties) dessa widget clicando com o botãodireito sobre ele e em seguida selecione o menu “Show in /Properties”, como você confere na figura seguinte: 55
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Tela de layout da aplicaçãoEm seguida as propriedades do componente se carregarão,conforme você pode conferir na figura abaixo:56
  • Luciano Alves da Silva Tela de layout da aplicação Agora vamos na guia “Properties” encontrar umapropriedade chamada “Text”, que indica o conteúdo assumidopelo componente TextView, que no caso é a frase “HelloWorld,AppHello!”. Depois de encontrar a propriedade Text,substitua o valor corrente pela frase “Digite o primeiro número”e depois disso, de ENTER. O resultado você confere na figuraabaixo: 57
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Tela de layout da aplicaçãoÓtimo, agora vamos inserir a widget EditText, que funcionacomo um campo para preenchermos com valores numéricos oualfanuméricos. Como vamos adicionar esse componente? Sevocê observar na figura acima, existe uma seção chamada“Form Widgets”, é nela onde ficam os componentes básicos queconstituem uma aplicação Android.Primeiramente, encontre o componente (widget) EditText,depois de encontrá-lo, simplesmente você vai clicar sobre ele earrastar até a tela do dispositivo, para adicioná-lo. O resultadovocê confere na figura abaixo:58
  • Luciano Alves da Silva Tela de layout da aplicaçãoBom, agora vamos modificar duas propriedades dessecomponente.Encontre a propriedade “id” do componente EditText e nelavocê vai inserir o valor “@+id/numero1”. Essa propriedadeserve para darmos um nome ao componente, caso ele sejatrabalhado no código Java. O nome de um widget deve estar nesse formato: “@+<nome>/<nome>” 59
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSe observamos, o valor desse atributo é : “@+id/numero1”. Écomo se “id” representasse um grupo e “numero1” representasseo nome do componente. Você irá entender essa notação mais afrente.Depois disso, vamos na propriedade “Layout width”, que definea largura de um componente e iremos definir o valor“fill_parent”, que indica que o componente irá ocupar toda alargura do dispositivo.Para finalizar, vamos agora modificar a propriedade “Text“,deixando seu conteúdo em branco. O resultado você confere nafigura abaixo: Tela de layout da aplicação60
  • Luciano Alves da SilvaAgora você vai inserir, NA SEQUÊNCIA, os componentesTextView e EditText.Na segunda TextView, vamos inserir na propriedade “Text” afrase “Digite o segundo número”.Já na segunda EditText, vamos repetir os mesmosprocedimentos que fizemos na primeira EditText, sabendo-seque a diferença vai estar na propriedade “id” que assumirá ovalor “@+id/numero2”. Somente essa é a diferença, o resto étudo igual.Agora vamos inserir um componente chamado Button na nossaaplicação. Depois de inserido, modifique as propriedades abaixocom os seus respectivos valores:Button Propriedade Valor Layout width fill_parent Id @+id/btsomar Text SomarDepois de feito todas as alterações, o layout da aplicação deveestar de acordo com a figura abaixo: 61
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Tela de layout da aplicaçãoBom, agora vamos analisar o código produzido. Paravisualizarmos o código produzido, basta clicar na guia“main.xml” . O código produzido você confere abaixo:<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent"62
  • Luciano Alves da Silva android:layout_height="wrap_content"android:text="Digite o primeiro número"/><EditText android:layout_height="wrap_content"android:id="@+id/numero1"android:layout_width="fill_parent"></EditText><TextView android:id="@+id/TextView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Digite o segundo número"></TextView><EditText android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/numero2"></EditText><Button android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/btsomar"android:text="Somar"></Button> </LinearLayout>Vamos analisar o código:Dentro da estrutura LinearLayout temos um componenteTextView, identificado pela tag <TextView......></TextView>.Dentro desse componente possuímos as propriedadesandroid:layout_width (Layout Width), que possui o valor“fill_parent” ; android:layout_height (Layout Height), quepossui o valor “wrap_content” ; android:text (Text) que possuio valor “Digite o primeiro número”.Em seguida temos o componente EditText, identificado pela tag<EditText......></EditText>. Dentro desse componentepossuímos as propriedades android:layout_width ,android:layout_height e android:id (Id) que possui o valor“@+id/ednumero1” (que equivale ao nome do componente). 63
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresA descrição acima da estrutura dos componentes e daspropriedades segue também para os componentes seguintes.Beleza, agora vamos abrir o código do arquivo“AppSoma.java”, para acessar via código Java os componentesque adicionamos via XML. Siga os passos aqui descritos paravocê ver como esse processo é feito. Após a linhaimport android.os.Bundle;Digite:import android.widget.*;import android.view.*;import android.app.*;Antes da linha:@OverrideDigite:EditText ednumero1,ednumero2;Agora vamos à explicação do código acima. Como você podever , os widgets também podem ser usados no nosso códigoJava. Se no código XML eu possuir um widget do tipo EditTextpara acessar esse componente pelo Java, é preciso fazer uso daclasse EditText. Cada widget no XML possui o seu respectivoem classe Java, logo, se possui um widget Button, para acessá-lo devo fazer uso da classe Button e assim vai.64
  • Luciano Alves da SilvaAgora, após a linha:setContentView(R.layout.main);Digite as seguintes linhas de código:ednumero1 = (EditText) findViewById(R.id.numero1);ednumero2 = (EditText) findViewById(R.id.numero2);Button btsomar = (Button)findViewById(R.id.btsomar);Agora vou explicar as linhas acima. A linha:ednumero1 = (EditText) findViewById(R.id.numero1);Faz referência ao primeiro EditText, através do métodofindViewById com o parâmetro “R.id.numero1”.Se lembra o nome da primeira EditText que está no códigoXML? Ela se chama “@+id/numero1”.Vamos entender. Observe que para fazer referência ao EditTextpelo método findViewById eu passei o parâmetro“R.id.numero1”. 65
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresJá na segunda linha, para fazer a referência à segunda EditText,cujo nome é “@+id/numero2”, pelo método findViewById,passei o parâmetro “R.id.numero2”.Como você pode ver, estou fazendo uso da classe R quefunciona como interface entre o código Java e o arquivo XML.O procedimento é o mesmo para o componente Button.Agora iremos adicionar um evento “Click”, no nosso Button,pois quando eu clicar no botão, ele deverá mostrar a soma dosnúmeros. Então, logo após a linha:Button btsomar = (Button)findViewById(R.id.btsomar);Insira o código abaixo: btsomar.setOnClickListener(newView.OnClickListener(){public void onClick(View arg0) {double num1 =Double.parseDouble(ednumero1.getText().toString());double num2 =Double.parseDouble(ednumero2.getText().toString()); double res = num1 + num2;AlertDialog.Builder dialogo = newAlertDialog.Builder(AppSoma.this);dialogo.setTitle("Aviso");dialogo.setMessage("Soma:" + res);dialogo.setNeutralButton("OK", null);dialogo.show();66
  • Luciano Alves da Silva } });Toda vez que eu clicar no botão ele irá mostrar o resultado dasoma na tela através de uma caixa de mensagem. Ótimo! Vamosexecutar a nossa aplicação? Para executar faça os mesmosprocedimentos que já mostrei. O resultado da execução dessaaplicação você vê na figura abaixo: Aplicação que soma números em execuçãoOBS: Provavelmente durante a execução da aplicação ao entrarcom um número, deve ter surgido no dispositivo um teclado 67
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresvirtual (como mostra a figura acima), para ocultar ele é sópressionar ESC.Irei descrever o código do evento “Click”. O métodosetOnClickLisneter serve para definir um evento de “Click” aum componente. Como parâmetro, criamos uma instância deOnClickListener e dentro dessa instância existe o métodochamado onClick, que será disparado toda vez que o botão forclicado.A linha:double num1 = Double.parseDouble(ednumero1.getText().toString());Cria uma variável chamada num1 e atribui a ela o valor que estácontido em num1. Eu faço uso do método parseDouble daclasse Double pois o conteúdo é uma String. Observem quechamo o método getText de ednumero1 para retornar oconteúdo. Diferente de muitos métodos de retorno String, essemétodo getText não retorna uma String, mais sim um tipochamado Editable. Por isso, chamei o método toString degetText para que me retornasse uma string. A descrição dapróxima linha e a mesma.O código abaixo:AlertDialog.Builder dialogo = newAlertDialog.Builder(AppSoma.this);dialogo.setTitle("Aviso");dialogo.setMessage("Soma:" + res);dialogo.setNeutralButton("OK",null);dialogo.show();68
  • Luciano Alves da SilvaÉ responsável por mostrar a soma na tela através da classeAlertDialog.Builder, responsável por criar caixas de diálogo eexibi-las.Muito bem, com esse conhecimento adquirido até agora, você játem capacidade para fazer uma aplicação básica em Android.4.5) A widget AutoCompleteTextViewA widget AutoCompleteTextView é uma widget baseada noEditText que possui um mecanismo “auto complete” , quefunciona como um mecanismo de busca de certas palavras deacordo com o que está sendo digitado no componente. Vamosdemonstrar o uso desse componente.Project Name: ExemploAutoCompleteTextViewPackage Name : br.com.appautocompleteCreate Activity: AppAutoCompleteApplication Name: Exemplo com AutoCompleteTextViewMin SDK Version: 7Depois de criar o projeto, carregue o layout do arquivo“main.xml” e em seguida selecione o componente TextView evamos na propriedade Text para alterar o texto dele com aseguinte frase “Digite o nome de um país”.Agora precisamos inserir o componente (widget)AutoCompleteTextView. Ele também se encontra na seção 69
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores“Form Widgets”. Muito provável que você não esteja vendoesse componente, então, como faço para visualizá-lo ? Observeque onde se encontra a guia “Properties” (Propriedades doscomponentes), existem outras guias como “Problems”,“Javadoc” e etc. Precisamos “minimizar essas guias parapodermos ver todas as widgets da seção “Form Widgets”. Paraminimizar essas guias , clique no botão localizado à direita bemdepois da guia “Properties”, no local indicado pela a figuraabaixo: Botão minimizarFeito isso você verá todos os componentes da seção “FormWidgets” inclusive o componente “AutoCompleteTextView”.Vamos inserir esse componente e em seguida mude suaspropriedades como demonstra a figura abaixo: Propriedade Valor Text Id @+id/ednomepais Layout_width fill_parentA tela da nossa aplicação terá que estar de acordo com a figuraabaixo:70
  • Luciano Alves da Silva Layout da aplicaçãoFeito isso vamos no arquivo “AppAutoComplete.java” e vamosadicionar o seguinte código abaixo:package br.com.appautocomplete;import android.app.Activity;import android.os.Bundle;import android.widget.*;public class AppAutoComplete extends Activity { /** Called when the activity is first created.*/ AutoCompleteTextView ednomepais; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); 71
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores ArrayAdapter<String> adapter = newArrayAdapter<String>(this,android.R.layout.simple_list_item_1, paises); ednomepais = (AutoCompleteTextView)findViewById(R.id.ednomepais); ednomepais.setAdapter(adapter); }private final String[] paises = new String[]{ "Afeganistão", "África do Sul", "Albânia","Alemanha", "Andorra","Angola", "Anguila","Antárctida" "Azerbaijão", "Baamas", "Bangladeche","Brasil", "Canadá", "Catar", "Cazaquistão", "Chade", "Chile","China","Chipre", "Clipperton Island", "Dhekelia", "Dinamarca", "Domínica", "Egipto", "Equador", "Eritreia", "Eslováquia", "Eslovénia", "Espanha", "Estados Unidos", "Grécia", "Gronelândia", "Ilhas Salomão", "Ilhas Turcas e Caicos", "Indonésia", "Irão", "Iraque"};} Vamos analisar alguns trechos de código abaixo. A linha : ArrayAdapter<String> adapter = newArrayAdapter<String>(this,android.R.layout.simple_list_item_1, paises);72
  • Luciano Alves da SilvaCria um objeto do tipo Array através da classe ArrayAdapter ecarregamos em seus parâmetros um vetor (array de Strings) pré-definido com o nome dos países chamado paises.A linha abaixo:ednomepais.setAdapter(adapter);Carrega o vetor no componente através do método “setAdapter”.E na linha seguinte:private final String[] paises = new String[]{....}Havíamos definido o array de Strings paises onde nele estãodefinidos os países onde alguns deles serão exibidos durante oprocesso de sugestão do componente.Bom, agora vamos rodar a nossa aplicação. Veja como ficou nafigura seguinte: Demonstração do uso AutoCompleteTextView 73
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores4.6) A widget CheckBoxA widget CheckBox funciona como um componente que podeser marcado e desmarcado, e que possui também um rótulo.4.7) Desenvolvendo uma aplicação simples de comprasVamos fazer uma outra aplicação Android que vai fazer uso dawidget CheckBox, que acabamos de conhecer acima. Nossaaplicação consiste em um simples sistemas de compras ondepossuo cinco produtos, Arroz (R$ 2,69) , Leite (R$ 5,00) , Carne(R$ 10,00), Feijão (R$ 2,30) e Refrigerante coca-cola (R$ 2,00).Nessa aplicação eu marco os itens que quero comprar e no finalo sistema mostra o valor total das compras.Bom, vamos criar um novo projeto chamadoSistemaDeCompras. Siga os dados do projeto abaixo:Project Name: SistemaDeComprasPackage Name : br.com.appcompraCreate Activity: AppCompraApplication Name: Sistema de ComprasMin SDK Version: 7Vamos no arquivo “main.xml” desse projeto para carregarmosseu layout. Depois de carregado, modifique o valor da74
  • Luciano Alves da Silvapropriedade Text da TextView com a frase “Escolha seuproduto”. Feito isso, adicione os seguintes componentes, nasequência:CheckBox Propriedade Valor Text Arroz (R$ 2,69) Id @+id/chkarrozCheckBox Propriedade Valor Text Leite (R$ 5,00) Id @+id/chkleiteCheckBox Propriedade Valor Text Carne (R$ 9,70) Id @+id/chkcarneCheckBox Propriedade Valor Text Feijão (R$ 2,30) Id @+id/chkfeijao 75
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresButton Propriedade Valor Text Total das compras Id @+id/btotal Layout_width fill_parentAo final, o layout da nossa aplicação deve estar de acordo com afigura seguinte: Layout da tela da aplicaçãoAgora vamos modificar o arquivo “AppCompra.java“. O códigodesse arquivo será como o código que é exibido abaixo:76
  • Luciano Alves da Silvapackage br.com.appcompra;import android.app.AlertDialog;import android.os.Bundle;import android.widget.*;import android.view.*;import android.app.*;public class AppCompra extends Activity { CheckBox chkarroz,chkleite,chkcarne,chkfeijao; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); chkarroz = (CheckBox) findViewById(R.id.chkarroz); chkleite = (CheckBox) findViewById(R.id.chkleite); chkcarne = (CheckBox) findViewById(R.id.chkcarne); chkfeijao = (CheckBox) findViewById(R.id.chkfeijao); Button bttotal = (Button)findViewById(R.id.bttotal); bttotal.setOnClickListener(newView.OnClickListener(){public void onClick(View arg0) { 77
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores double total =0; if(chkarroz.isChecked()) total += 2.69; if(chkleite.isChecked()) total += 5.00; if(chkcarne.isChecked()) total += 9.7; if(chkfeijao.isChecked()) total += 2.30;AlertDialog.Builder dialogo = newAlertDialog.Builder(AppCompra.this);dialogo.setTitle("Aviso"); //Defino o títulodialogo.setMessage("Valor total da compra :" +String.valueOf(total)); //colocando a mensagem quevai ter dentro do Dialogdialogo.setNeutralButton("OK", null); //adicionandoo botão de OKdialogo.show(); //mostrando o Dialog } }); }}Descrevendo o código do método onClick : Dentro do métodoeu crio uma variável chamada total que armazena o valor totalda compra. Observe que eu tenho quatro estruturas if’s onde78
  • Luciano Alves da Silvacada uma verifica se um determinado item foi marcado, se foi,incrementa o valor do item com o valor da variável total. Nofinal mostro valor total das compras na tela.Vamos roda nossa aplicação? O resultado você confere na figuraseguinte: Aplicação simples de compras em execução 79
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores4.8) A widget RadioButtonA widget RadioButton é um componente muito utilizado emopções de múltipla escolha, onde somente uma única opçãopode ser selecionada.4.9) Desenvolvendo uma aplicação de cálculo de salário(Com RadioButton)Bom, agora vamos fazer uma outra aplicação. Essa aplicaçãoque vamos desenvolver agora consiste em um sistema que vailer o salário de um funcionário e vai permitir que você escolha oseu percentual de aumento que pode ser de 40% , 45% e 50% eno final o sistema irá mostrar o salário reajustado com o novoaumento.Bom, vamos lá! Crie um novo projeto Android com os seguintesdados:Project Name: CalculoDeSalarioPackage Name : br.com.appsalarioCreate Activity: AppSalarioApplication Name: Cálculo do salárioMin SDK Version: 780
  • Luciano Alves da SilvaNessa primeira versão da aplicação, como havia falado, vamosfazer uso da widget RadioButton.Carregado o arquivo “main.xml”, modifique a propriedade Textda TextView com a frase “Digite seu salário (R$)”. Em seguidaadicione os seguintes componentes, na sequência :EditText Propriedade Valor Text Id @+id/edsalario Layout_width fill_parentTextView Propriedade Valor Text Qual é o seu percentual ?Seguindo os passos acima ate aqui, a aplicação deve estar deacordo com o dá figura abaixo: 81
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Tela de layout da aplicação Cálculo de salárioBom, agora vamos adicionar um componente ou melhor, umaestrutura que será responsável por agrupar as RadioButtonsdentro dela, que se chama RadioGroup. Nesta versão doAndroid o RadioGroup já oferece por padrão trêsRadioButtons, que é quantidade necessária para a nossaaplicação. Essa estrutura também se encontra dentro da seção“Form Widgets” e para adicionar este componente nodispositivo, simplesmente clique e arraste ele até a tela dodispositivo. O resultado você confere na figura abaixo:82
  • Luciano Alves da Silva Estrutura RadioGroup inseridaCom o RadioGroup selecionado, modifique as propriedadesabaixo: Propriedade Valor Layout Width fill_parent Id @+id/rgopcoesObserve que dentro do RadioGroup existem três RadioButtons,cada uma telas identificada por um nome. Se você observar noEclipse, à direita da tela da aplicação, existe uma seção chamada“Outline” onde nela posso visualizar toda a estrutura dos 83
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorescomponentes que estão na minha aplicação. Confira na figuraabaixo: Guia “Outline”Agora modifique as propriedades das RadioButons de acordocom as indicações abaixo:radio0 Propriedade Valor Text 40% Id @+id/rb40radio184
  • Luciano Alves da Silva Propriedade Valor Text 45% Id @+id/rb45radio2 Propriedade Valor Text 50% Id @+id/rb50Agora, vamos adicionar uma Button, simplesmente clicando earrastando o componente na tela. Agora um detalhe, é paracolocar esse componente na tela do dispositivo mas FORA daárea do RadioGroup.Depois de colocar o Button, modifique as propriedades abaixo: Propriedade Valor Text Calcular novo salário Id @+id/btcalcular Layout_width fill_parentDepois de inserir todos os componentes citados, o layout daaplicação deve ficar de acordo com a figura abaixo: 85
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da tela da aplicaçãoVamos analisar agora parte de um trecho de código produzido.Como havia falado acima, as RadioButtons precisam ficardentro de uma estrutura chamada RadioGroup certo ? Vamosver como isso é estruturado dentro de um código XML, comovocê confere abaixo:<RadioGroup android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:id="@+id/rgopcoes"><RadioButton android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="40%"android:checked="true"android:id="@+id/rb40"></RadioButton><RadioButton android:layout_width="wrap_content"android:layout_height="wrap_content"86
  • Luciano Alves da Silvaandroid:text="45%"android:id="@+id/rb45"></RadioButton><RadioButton android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="50%"android:id="@+id/rb50"></RadioButton></RadioGroup>Observe acima que logo após a definição da estruturaRadioGroup, existe dentro dela as RadioButtons, que serãoutilizadas na aplicação.No arquivo “AppSalario.java”, coloque o código abaixo:package br.com.appsalario;import android.app.Activity;import android.os.Bundle;import android.widget.*;import android.view.*;import android.app.*;public class AppSalario extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btcalcular = (Button) 87
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores findViewById(R.id.btcalcular); btcalcular.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0) { double salario, novo_sal; EditText edsalario = (EditText) findViewById(R.id.edsalario); salario = Double.parseDouble (edsalario.getText().toString()); RadioGroup rg = (RadioGroup) findViewById(R.id.rgopcoes); int op = rg.getCheckedRadioButtonId(); if(op==R.id.rb40) novo_sal = salario + (salario * 0.4); else if(op==R.id.rb45) novo_sal = salario + (salario * 0.45); else novo_sal = salario + (salario * 0.5); AlertDialog.Builder dialog = new AlertDialog.Builder(AppSalario.this); dialog.setTitle("Novo salário");88
  • Luciano Alves da Silva dialog.setMessage("Seu novo salário é : R$" + String.valueOf(novo_sal)); dialog.setNeutralButton("OK", null); dialog.show(); } }); } }Vamos à explicação de alguns códigos interessantes. Dentro dométodo onClick, eu realizo o cálculo do novo salário dofuncionário. Os primeiros códigos do evento são similares deprogramas anteriores que já foram devidamente explicados. Alinha:int op = rg.getCheckedRadioButtonId();Cria uma variável op e retorna para ela o Id da opçãoselecionada, ou seja, qual RadioButton foi selecionada.Agora na condição:if(op==R.id.rb40)Verifico se a opção de 40% foi selecionada, se estiver, realiza ocálculo do salário com o reajuste de 40%. A mesma explicação e 89
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresválida para o cálculo dos outros reajustes. Agora vamos executara nossa aplicação. O resultado você vê na figura abaixo: Aplicação de cálculo de salário em execução4.10) A widget SpinnerA widget Spinner é um componente do tipo caixa decombinação (“ComboBox”) onde nele é armazenado váriositens a serem selecionados. Para que um componente possa serselecionado, é preciso clicarmos na seta , para que os itenspossam ser mostrados e , por consequência, serem selecionados.90
  • Luciano Alves da Silva4.11) Desenvolvendo uma aplicação de cálculo de salário(Com Spinner)Bom, agora vamos criar a nossa segunda versão do aplicativoacima, usando agora o componente Spinner. Crie um novoprojeto Android com os seguintes dados:Project Name: CalculoDeSalarioSpinnerPackage Name : br.com.appsalariospinnerCreate Activity: AppSalarioApplication Name: Cálculo do salárioMin SDK Version: 7Nessa segunda versão da aplicação, vamos fazer uso da widgetSpinner. Carregue o arquivo “main.xml” e faça os mesmosprocedimentos do programa anterior, só que ao invés deadicionar a RadioGroup com os RadioButtons, você vai inserirsomente um componente Spinner. Segue abaixo aspropriedades do Spinner que você precisa modificar: Propriedade Valor Id @+id/spnopcoes Layout_width fill_parentSeguindo os passos, a aplicação deve estar de acordo com afigura abaixo: 91
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Tela de layout da aplicaçãoAgora no arquivo “AppSalario.java”, coloque o seguinte código:package br.com.appsalariospinner;import android.app.Activity;import android.os.Bundle;import android.widget.*;import android.view.*;import android.app.*;public class AppSalario extends Activity { private static final String[] percentual ={"De 40%","De 45%","De 50%"}; ArrayAdapter<String> aPercentual; Spinner spnsal;92
  • Luciano Alves da Silva @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btmostrar = (Button) findViewById(R.id.btcalcular); aPercentual = newArrayAdapter<String>(this,android.R.layout.simple_spinner_item, percentual); spnsal = (Spinner)findViewById(R.id.spnopcoes); spnsal.setAdapter(aPercentual); btmostrar.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0) { double salario=0, novo_sal = 0; EditText edsalario = (EditText)findViewById(R.id.edsalario); salario =Double.parseDouble(edsalario.getText().toString()); switch(spnsal.getSelectedItemPosition()) { case 0: novo_sal = salario + (salario *0.4); break; 93
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores case 1: novo_sal = salario + (salario *0.45); break; case 2: novo_sal = salario + (salario *0.5); break; } AlertDialog.Builder dialogo = newAlertDialog.Builder(AppSalario.this); dialogo.setTitle("Novo salário"); dialogo.setMessage("Seu novo salário é : R$"+ String.valueOf(novo_sal)); dialogo.setNeutralButton("OK", null); dialogo.show(); } }); } }Observando o código do programa acima, podemos ver que eleé similar o da primeira versão do aplicativo, porém, querocomentar alguns códigos interessantes desta aplicação. Observeque foi necessário declarar um “array” de “String” chamadopercentual, conforme mostra o código abaixo: private static final String[] percentual ={"De 40%","De 45%","De 50%"};Este “array” possui três elementos, correspondentes aopercentual do aumento do salário. Também foi necessário94
  • Luciano Alves da Silvadeclarar um objeto do tipo ArrayAdapter chamadoaPercentual. Esse objeto serve para fazer referencia ao “array”percentual. Dentro do método OnCreate, existe uma linha decódigo abaixo: aPercentual = newArrayAdapter<String>(this,android.R.layout.simple_spinner_item, percentual);Que cria uma instância da classe ArrayAdapter e atribuo essainstância ao objeto aPercentual, onde carrego nele o “array” deStrings percentual. Logo depois, vem a instrução: spnsal.setAdapter(aPercentual);Onde carrego no objeto do tipo Spinner uma lista de opções depercentual.Vamos agora dentro do evento OnClick do objeto Button.Dentro existe o código mostrado abaixo: switch(spnsal.getSelectedItemPosition()) { case 0: novo_sal = salario + (salario *0.4); break; case 1: novo_sal = salario + (salario *0.45); break; case 2: novo_sal = salario + (salario *0.5); break; }Que verifica qual será o novo salário , de acordo com a opçãoselecionada no objeto Spinner. Vamos entender esse código.Observe que o objeto spnsal, possui um método chamadogetSelectedItemPosition, que é responsável por retornar o 95
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresíndice do item selecionado, sabendo se que o primeiro itempossui índice zero, o segundo possui índice um e assim pordiante. Observe que dentro dessa estrutura eu verifico a opçãoselecionada, se for a primeira, o novo salário terá aumento de40%, se for a segunda , o aumento será de 45% senão, oaumento será de 50%.Logo após o cálculo do novo salário, é exibido na tela o novosalário.Vamos executar a nossa aplicação. O resultado da execuçãovocê confere na figura abaixo:Aplicação de cálculo de salário usando Spinner em execução96
  • Luciano Alves da Silva4.12) A widget ListViewA widget ListView é um componente que possui vários itens aserem selecionados, similar ao componente Spinner. A únicadiferença entre o ListView e o Spinner é que no componenteListView os itens já são mostrados sem nenhuma necessidadede se clicar em alguma parte dele para que os mesmos possamser mostrados.4.13) Desenvolvendo uma aplicação de lista telefônicaAgora vamos fazer uma nova aplicação em Android. Essaaplicação consiste em uma lista telefônica já pronta comcontatos. Quando selecionamos um contato, ele mostra na telauma mensagem com o nome selecionado. A nossa aplicação vaifazer uso do widget chamado ListView, que exiba uma listacontendo valores que podem ser selecionados.Bom, vamos criar um novo projeto. Siga os dados abaixo:Project Name: ListaTelefonicaPackage Name : br.com.applistaCreate Activity: AppListaApplication Name: Lista de contatosMin SDK Version: 7Vamos no layout do nosso arquivo “main.xml” e vamosmodificar o conteúdo na TextView, com a frase : “Escolha um 97
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorescontato”. Depois disso, vamos inserir um ListView (que seencontra na guia “Composite”) e depois iremos modificar suaspropriedades, conforme abaixo: Propriedade Valor Id @+id/lstcontatos Layout_width fill_parentA aplicação depois de feito todos os passos acima, deve estar deacordo com a figura abaixo: Layout da tela da aplicaçãoNo arquivo AppList.java, coloque o seguinte código:package br.com.applista;import android.app.Activity;98
  • Luciano Alves da Silvaimport android.app.AlertDialog;import android.os.Bundle;import android.widget.*;importandroid.widget.AdapterView.OnItemClickListener;import android.view.*;public class AppLista extends Activity { public ListView lista; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); ArrayAdapter<String> adapter = newArrayAdapter<String>(this,android.R.layout.simple_list_item_1, contatos); lista = (ListView)findViewById(R.id.lstcontatos); lista.setAdapter(adapter); lista.setOnItemClickListener(newOnItemClickListener(){ public voidonItemClick(AdapterView parent, View view, intposition, long id) { AlertDialog.Builder dialogo = newAlertDialog.Builder(AppLista.this); dialogo.setTitle("Contato selecionado"); dialogo.setMessage(((TextView)view).getText().toString()); dialogo.setNeutralButton("OK", null); 99
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores dialogo.show(); } }); } static final String[] contatos = new String[] {"Alline","Lucas","Rafael","Gabriela","Silvana" };}Vamos analisar alguns códigos acima. A linha: static final String[] contatos = new String[] {"Alline","Lucas","Rafael","Gabriela","Silvana" };Cria uma constante chamada contatos, onde nela coloco algunsnomes. Essa constante vai ser utilizada pela nossa lista. Para queeu possa carregar dos dados em uma ListView, preciso fazeruso da classe ArrayAdapter, como mostra a instrução abaixo:100
  • Luciano Alves da SilvaArrayAdapter<String> adapter = newArrayAdapter<String>(this,android.R.layout.simple_list_item_1, contatos);A instrução mostrada acima cria uma instância da classeArrayAdapter chamada adapter onde carrego nela o vetor deStrings da constante contatos. A instrução: lista.setAdapter(adapter);Carrega os valores para a ListView, que está contido o objetoadapter.Como havia falado, quando se clica em um item, o sistemamostraria uma mensagem do item selecionado. Isso éconseguido fazendo uso da interface OnItemClickListener,como mostra a instrução abaixo: lista.setOnItemClickListener(newOnItemClickListener(){ public void onItemClick(AdapterView parent,View view, int position,long id) { AlertDialog.Builder dialogo = newAlertDialog.Builder(AppLista.this); dialogo.setTitle("Contato selecionado"); dialogo.setMessage(((TextView) view).getText().toString()); dialogo.setNeutralButton("OK", null); dialogo.show(); 101
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores });Toda vez que clicarmos em um item da lista, o métodoonItemClick será disparado e será executado o comandoabaixo: AlertDialog.Builder dialogo = newAlertDialog.Builder(AppLista.this); dialogo.setTitle("Contato selecionado"); dialogo.setMessage(((TextView) view).getText().toString()); dialogo.setNeutralButton("OK", null); dialogo.show();Que exibe o nome do item selecionado. O item selecionado estáem um objeto View, que precisa ser convertido para um objetodo tipo TextView, para que o método getText possa serinvocado retornando em uma String o item selecionado .Vamos executar a aplicação. O resultado você vê na figuraabaixo:102
  • Luciano Alves da Silva Aplicação de lista de contatos em execução4.14) A widget ImageviewA widget ImageView é um componente que permite quevisualizemos imagens dentro dele. As imagens suportadas poresse componente são imagens no formato JPEG, GIF e PNG.4.15) Desenvolvendo uma aplicação que visualiza imagens(Com ImageView)Agora vamos desenvolver uma aplicação que visualiza imagens,usando o componente ImageView. 103
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAgora crie um novo projeto conforme os dados abaixo:Project Name: VisualizadorDeImagensPackage Name : br.com.appimagemCreate Activity Name: AppImagemApplication Name: Visualizador de ImagensMin SDK Version: 7Antes de iniciarmos a codificação do programa, quero que vocêcoloque duas imagens JPEG (com a extensão .jpg), dentro dapasta “res/drawable-mdpi” (para esse projeto usei duas imagenschamadas “foto1.jpg” e “foto2.jpg”). Para importar um arquivo,clique com o botão direito do mouse sobre a pasta“res/drawable-mdpi” e selecione “Import”, depois selecione FileSystem (Que se encontra dentro da pasta “General”). Clique nobotão browser para selecionar o diretório onde se encontram asimagens, depois de selecionado, marque os dois arquivos(imagens) para que eles sejam importados para a pasta“res/drawable-mdpi” . Veja a figura abaixo:104
  • Luciano Alves da Silva Importando imagens para aplicaçãoDepois disso, é só clicar em “Finish”.Agora no layout do arquivo “main.xml” apague o componenteTextView que se encontra na tela do dispositivo. Feito isso, sigaos passos abaixo para construirmos a nossa aplicação.Vamos adicionar dentro da tela da nossa aplicação uma estruturaLinearLayout (que se encontra na guia “Layouts”)simplesmente arrastando o componente para a tela da aplicação.O resultado você confere na figura abaixo: 105
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Estrutura LinearLayout inseridaAgora nessa estrutura LinearLayout que inserimos, vamosmodificar a seguinte propriedade abaixo: Propriedade Valor Orientation horizontalLogo após a alteração da propriedade, a estrutura LinearLayoutque inserimos “perdeu foco”. Se você clicar novamente no localonde você inseriu estrutura é muito provável que você nãoconsiga selecioná-lo (isso normalmente acontece com essaestrutura) . Para solucionar esse problema simplesmenteselecione esta estrutura pela guia “Outline”, como demonstra afigura abaixo:106
  • Luciano Alves da Silva Selecionando a estrutura LinearLayoutAgora dentro da estrutura LinearLayout que configuramosacima, vamos inserir o componente ImageView (que seencontra na guia “Images & Media”), e em seguida mude asseguintes propriedades: ImageView Propriedade Valor Id @+id/imagem Src @drawable/foto1Bom antes de prosseguir, quero explicar a propriedade “Src”.Nessa propriedade definimos a imagem corrente que iráaparecer na tela que é especificada pela notação“@drawable/foto1” (lembre-se que uma das imagens queutilizei para o projeto chama-se “foto1.jpg”), irei explicar essanotação. 107
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSe você notou, quando importamos as duas imagens que seriamutilizadas pelo nosso programa, essas imagens ficaram dentro dodiretório “drawable-mdpi” certo ? Porém, quando especificamospela propriedade “Src” o nome do diretório das imagens sempreserá “@drawable”. Outro detalhe: Quando especificamos onome do arquivo de imagem, o nome do arquivo não pode ter aextensão dele, isso é regra.TextView Propriedade Valor Id @+id/txtinfo Text Foto 1Seguindo os passos acima, o resultado do layout deve ficar deacordo com a figura abaixo: Layout da aplicação108
  • Luciano Alves da SilvaAgora vamos colocar na sequência dois Buttons, só que essesdois componentes vão estar dentro da tela da aplicação , ou seja, da estrutura principal. Segue abaixo as propriedades queprecisam ser modificadas:Button1 Propriedade Valor Id @+id/btimagem1 Text Exibir foto 1 Layout_width fill_parentButton2 Propriedade Valor Id @+id/btimagem2 Text Exibir foto 2 Layout_width fill_parentDepois de seguir todos os passos descritos acima, a aplicaçãotem que estar de acordo com a figura abaixo: 109
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da aplicaçãoAgora no arquivo “AppImage.java” coloque o código abaixo:package br.com.appimagem;import android.app.Activity;import android.os.Bundle;import android.view.*;import android.widget.*;public class AppImagem extends Activity { ImageView imagem; TextView txt; @Override110
  • Luciano Alves da Silva public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btfoto1 = (Button) findViewById(R.id.btimagem1); Button btfoto2 = (Button) findViewById(R.id.btimagem2); imagem = (ImageView) findViewById(R.id.imagem); txt = (TextView) findViewById(R.id.txtinfo); btfoto1.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0) { imagem.setImageResource(R.drawable.foto1); txt.setText("Foto 1"); } }); btfoto2.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0) { imagem.setImageResource(R.drawable.foto2); txt.setText("Foto 2"); } }); }} 111
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAgora vamos analisar alguns trechos de códigos. Vamos noevento Click referente a abertura da primeira imagem. Ocódigo: imagem.setImageResource(R.drawable.foto1);É responsável por abrir a imagem “foto1.jpg” e exibi-la nocomponente. Observe que foi passado o parâmetro“R.drawable.foto1” onde “drawable” corresponde a pasta e“foto1” corresponde ao arquivo “foto1.jpg”. Logo após vem ocódigo: txt.setText("Foto 1");Cuja finalidade é mudar o título da TextView , de acordo com aString passada como parâmetro.O comentário acima é o mesmo para o segundo botão referenteà abertura da segunda imagem.Vamos executar a nossa aplicação. O resultado você vê nasimagens abaixo:112
  • Luciano Alves da SilvaAplicação de visualização de imagens em execução (mostrando a foto 1)Aplicação de visualização de imagens em execução (mostrando a foto 2) 113
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores4.16) A widget GalleryNa aplicação anterior, fizemos uso do widget ImageView. Noteque usamos a mesma widget para visualizar duas imagensdistintas. Agora nesta segunda aplicação vamos fazer uso dawidget Gallery, que funciona como um grupo do ImageViewsonde cada foto pode ser visualizada simplesmente arrastando omouse ou clicando nas setas direitas ou esquerda do SmartPhone. Veja na figura abaixo uma aplicação que faz uso dessaestrutura:4.17) Desenvolvendo uma aplicação que visualiza imagens(Com Gallery)Bom, vamos a nossa aplicação. Crie um novo projeto de acordocom os dados abaixo:Project Name: GaleriaDeImagensPackage Name : br.com.appgalleryCreate Activity: AppGalleryApplication Name: Galeria de ImagensMin SDK Version: 7114
  • Luciano Alves da SilvaDepois de criado o projeto coloque na pasta de imagens doandroid (res/drawable-mdpi) três imagens, que devem se chamarrespectivamente “imagem1.jpg”, ”imagem2.jpg” e“imagem3.jpg”.Feito o que se pediu acima vamos criar uma classe chamadaImageAdapter, que será uma classe iremos utilizar em nossaaplicação e essencial para o funcionamento do componenteGallery. Siga os passos abaixo:Vá no menu “File/New/Class”, conforme mostra a figuraabaixo: Criando uma nova classeSerá aberto um formulário no qual você deverá preencher osdados da classe a ser criada. Segue abaixo os dados a serempreenchidos:Source folder : GaleriaDeImagens/srcPackage: br.com.appgallery 115
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresName: ImageAdapterSeguindo os passos acima, os dados devem estar de acordo coma figura abaixo: Criando uma nova classeSe estiver tudo “OK” é só pressionar o botão “Finish” para que aclasse possa ser criada. Em seguida coloque o código seguinte:116
  • Luciano Alves da Silvapackage br.com.appgallery;import android.content.Context;import android.view.*;import android.widget.*;public class ImageAdapter extends BaseAdapter { private Context myContext; /* Neste array são colocadas as imagens a seremexidas no componente Gallery .*/ private int[] myImageIds = { R.drawable.imagem1, R.drawable.imagem2, R.drawable.imagem3, }; public ImageAdapter(Context c) { this.myContext= c; } public int getCount() { returnthis.myImageIds.length; } public Object getItem(int position) { returnposition; } public long getItemId(int position) { returnposition; } public View getView(int position, ViewconvertView, ViewGroup parent) { ImageView i = newImageView(this.myContext); 117
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresi.setImageResource(this.myImageIds[position]); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setLayoutParams(newGallery.LayoutParams(150, 150)); return i; } public float getScale(boolean focused, intoffset) { return Math.max(0, 1.0f /(float)Math.pow(2, Math.abs(offset))); }}Observem que dentro desta classe existe um array chamadomyImageIds, onde eu armazeno as imagens a serem visualizadasno componente.Agora , carregue o arquivo “main.xml” e modifique o conteúdoda TextView com a frase: “Visualização de Imagens”, e emseguida insira na tela o componente Gallery (que se encontra naguia “Images & Media”). Modifique as propriedades docomponente Gallery conforme é mostrado abaixo: Propriedade Valor Id @+id/gallery Layout_width fill_parent118
  • Luciano Alves da SilvaFeito isso, abra o arquivo “AppGallery.java” e vamos modificá-lo com o seguinte código abaixo:package br.com.appgallery;import android.app.Activity;import android.os.Bundle;import android.widget.*;public class AppGallery extends Activity { public void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Gallery)findViewById(R.id.gallery)) .setAdapter(newImageAdapter(this)); }}Agora vamos executar a nossa aplicação. O resultado daexecução você confere nas figuras abaixo: 119
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAplicação de galeria de imagens em execução (primeira foto em exibição)Aplicação de galeria de imagens em execução (segunda foto em exibição)120
  • Luciano Alves da SilvaAplicação de galeria de imagens em execução (terceira foto em exibição)Agora vamos tornar essa aplicação mais interessante. Vamoscolocar nessa aplicação um ImageView, que irá armazena aimagem seleciona no componente Gallery. Carregue novamenteo arquivo “main.xml” e em seguida coloque os seguintescomponentes, na sequência: TextView Propriedade Valor Text Imagem selecionada ImageView Propriedade Valor Id @+id/imagem Layout_width fill_parent 121
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAgora no arquivo “AppGallery.java” vamos substituir o códigorecente pelo novo código abaixo:package br.com.appgallery;import android.app.Activity;import android.os.Bundle;import android.view.*;import android.widget.*;public class AppGallery extends Activity { Gallery g; ImageView imagem; private int[] myImageIds = { R.drawable.imagem1, R.drawable.imagem2, R.drawable.imagem3, }; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); g = (Gallery) findViewById(R.id.gallery); g.setAdapter(new ImageAdapter(this)); imagem = (ImageView)findViewById(R.id.imagem);122
  • Luciano Alves da Silva g.setOnItemClickListener(newAdapterView.OnItemClickListener(){ public voidonItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {imagem.setImageResource(myImageIds[arg2]);Toast.makeText(getBaseContext(), "Figura " + (arg2 +1) + " selecionada",Toast.LENGTH_SHORT).show(); } }); }}Quais foram as modificações desse programa? Nesse programafoi adicionado um componente chamado ImageView, que fazreferência ao componente ImageView no arquivo XML, comomostra o código abaixo:ImageView imagem;Também na aplicação adicionamos o “array” que contém todasas referências das imagens contidas no projeto, conforme mostrao código seguinte: 123
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores private int[] myImageIds = { R.drawable.imagem1, R.drawable.imagem2, R.drawable.imagem3, };Dentro do método onCreate foi feito uma referência aocomponente ImageView contido no XML e definimos o eventoOnItemClickListener , do componente Gallery. Vamosanalisar seu código abaixo: imagem.setImageResource(myImageIds[arg2]); Toast.makeText(getBaseContext(),"Figura " + (arg2 + 1) + " selecionada", Toast.LENGTH_SHORT).show();A primeira instrução carrega a imagem selecionada nocomponente Gallery no ImageView, através do métodosetImageResource, cujo parâmetro é o valor do índice do vetor.A segunda instrução fazendo uso do método makeText, daclasse Toast, cuja finalidade é mostrar uma pequena mensagemna tela em um tempo curto.No primeiro parâmetro desse método sempre passamos o valorgetBaseContext(). No segundo parâmetro passamos o conteúdoa ser exibido na tela. No terceiro parâmetro, definimos o tempode exibição da mensagem na tela.Execute a aplicação. O resultado você vê na figura abaixo:124
  • Luciano Alves da Silva Aplicação de galeria de imagens em execução (versão otimizada)4.18) A widget ProgressBarAgora será mostrado uma widget do Android que consiste emuma barra de progresso, o ProgressBar. Ela é muito utilizadaquando queremos indicar algum andamento em processo comopor exemplo, quando ocorre a instalação de um programa ouquando se faz um download de um arquivo normalmente émostrado aquela barra de porcentagem que indica em 125
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresporcentagem, o andamento daquele processo. Aquilo é umabarra de progresso.4.19) Desenvolvendo uma aplicação que simula umdownloadPara demonstrar o uso do componente ProgressBar, criaremosuma aplicação que vai simular um download, onde o processodesse download será feito por esse componente. Vamos criar umnovo projeto em Android, com os seguintes dados:Project Name: ExemploProgressBarPackage Name : br.com.appprogressbarCreate Activity: AppProgressBarApplication Name: Exemplo com ProgressBarMin SDK Version: 7Agora no arquivo de layout modifique o conteúdo da TextViewcom a seguinte frase: “Status download”.Em seguida adicione o componente ProgressBar (que seencontra na guia “Form Widgets”) e mude suas propriedadesconforme é indicado abaixo: Propriedade Valor Id @+id/progresso Layout_width fill_parent126
  • Luciano Alves da Silva Style ?android:attr/progressBarStyleHorizontal Max 100Depois vamos adicionar o componente Button e mudar asseguintes propriedades, como segue :Button Propriedade Valor Id @+id/progresso Layout_width fill_parent Text Efetuar downloadSeguindo os passos acima, a aplicação deve estar de acordo coma aplicação da figura abaixo: 127
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da aplicaçãoVendo o layout acima talvez você dever estar se perguntando:Espere aí, nos não definimos uma barra de progresso horizontal?Sim, definimos sim. A razão pela qual de nós não estarmosvendo uma barra de progresso horizontal é porque em tempo deprojeto, a imagem PADRÃO do componente ProgressBar é umanel. Em tempo de projeto quando modificamos o estilo dela,ela não sofreu nenhuma mudança quanto ao desenho dela, isso énormal. Quando executarmos, você verá que o estilo daProgressBar estará de acordo com o estilo que selecionamos.128
  • Luciano Alves da SilvaAgora vá no arquivo “AppProgressBar.java” e coloque oseguinte código abaixo:package br.com.appprogressbar;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.*;public class AppProgressBar extends Activityimplements Runnable{ ProgressBar p; Button b; Thread t; Handler h; int i; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); p = (ProgressBar)findViewById(R.id.progresso); b = (Button) findViewById(R.id.btdownload); b.setOnClickListener(newView.OnClickListener(){ public void onClick(View v) { h = new Handler(); t = newThread(AppProgressBar.this); 129
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores t.start(); } }); } public void run() { i=1; try { while(i<=100) { Thread.sleep(100); h.post(new Runnable(){ public void run() { p.setProgress(i++); } }); } }catch(Exception e) {} }}Agora vou explicar o código desse programa. Observe adeclaração da classe abaixo:public class AppProgressBar extends Activityimplements Runnable{Além de derivar da classe Activity, eu implemento também ainterface Runnable. Essa interface possui um método abstrato130
  • Luciano Alves da Silvachamado run, que é bastante utilizado por “Threads”. UmaThread consiste em um processo que é executado em “paralelo”com o programa que o invocou, ou seja, quando uma Thread éexecutada ,não é preciso que a próxima instrução (ou instruções)após a Thread espere ela ser finalizada, elas podem serexecutadas em paralelo. Veja as declarações abaixo: Thread t; Handler h;Aqui é declarada uma variável do tipo Thread e outra do tipoHandler (que consiste também em uma Thread). A variável dotipo Handler é utilizada quando queremos manipular oswidgets em tempo de execução dentro de uma Thread.Vamos para o evento onClick do botão. Veja o código abaixo: public void onClick(View v) { h = new Handler(); t = newThread(AppProgressBar.this); t.start(); }No evento onClick, eu crio uma instância da classe Handler eatribuo essa instância à variável h. Logo após eu crio umainstância da classe Thread e atribuo essa instância à variável t,em seguida eu disparo a Thread pelo método start, executandoassim o método run. Vamos ao código do método run. 131
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores public void run() { i=1; try { while(i<=100) { Thread.sleep(100); h.post(new Runnable(){ public void run() { p.setProgress(i++); } }); }}catch(Exception e) {} }Vamos analisar o código dentro do “loop”. A instrução: Thread.sleep(100);Gera um atraso de 100 milissegundos. Logo após vem ainstrução: h.post(new Runnable(){ public void run() { p.setProgress(i++); } });A instrução acima é responsável por incrementar o valor deprogresso da widget ProgressBar. Quando usamos uma Threade queremos modificar o valor de algum componente (widget),precisamos disparar um método post e dentro dela, criar umainstância da interface Runnable com o método run onde nele é132
  • Luciano Alves da Silvaexecutado a instrução responsável por modificar o valor de umcomponente.Vamos executar a nossa aplicação . O resultado você vê nafigura abaixo: Aplicação que simula um download em execução4.20) A widget SeekBarA widget SeekBar nada mais é do que uma extensão da widgetProgressBar que funciona como uma barra de pesquisa e elapossui um “indicador”, onde podemos arrastá-lo tanto paraesquerda quanto para a direita.4.21) Desenvolvendo uma aplicação que demonstre o sistemaRGB Color.Vamos desenvolver uma aplicação que irá demonstrar o sistemaRGB Color , através do componente SeekBar. Crie um projetoAndroid com os seguintes dados abaixo: 133
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresProject Name: SistemaRGBColorPackage Name : br.com.apprgbcolorCreate Activity: AppRGBColorApplication Name: Sistema RGB ColorMin SDK Version : 7Depois de carregar o layout do arquivo “main.xml”, apague aTextView do layout da nossa aplicação.Agora vamos adicionar uma nova estrutura LinearLayoutdentro da tela da nossa aplicação. Após adicionar a estruturaLinearLayout (que vai estar nomeada de linearLayout01),modifique as seguintes propriedades abaixo: Propriedade Valor Orientation vertical Layout width fill_parent Layout height 250px Gravity centerSe você observar acima, o valor da propriedade “Layout height”não é nem “fill_parent” e nem “wrap_content” e sim ‘250px’(250 pixels de altura). Não necessáriamente, os valores“fill_parent” e “wrap_content” são obrigatórios nessapropriedade (incluindo também é propriedade “Layout width”),podemos também especificar valores números com uma escalade notação como foi demonstrado acima.134
  • Luciano Alves da SilvaBom, agora dentro da estrutura linearLayout1 vamos adicionar oseguintes componentes, na sequência:TextView Propriedade Valor Text RGB ColorTextView Propriedade Valor Id @+id/boxcolor Layout width 150px Layout height 150px TextAgora novamente dentro da tela principal vamos adicionar umanova estrutura LinearLayout abaixo da estrutura linearLayout1.E dentro dessa estrutura (que vai estar nomeada delinearLayout2), modifique as seguintes propriedades abaixo: Propriedade Valor Orientation vertical Layout width fill_parent Layout height fill_parentAgora dentro dessa estrutura linearLayout2, adicione osseguintes componentes, na sequência:TextView 135
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Propriedade Valor Text RedSeekBar (esse componente se encontra em “Form Widgets”) Propriedade Valor Id @+id/sbarred Layout width fill_parent Max 255TextView Propriedade Valor Text GreenSeekBar Propriedade Valor Id @+id/sbargreen Layout width fill_parent Max 255TextView Propriedade Valor Text BlueSeekBar136
  • Luciano Alves da Silva Propriedade Valor Id @+id/sbarblue Layout width fill_parent Max 255Seguindo os passos acima, a aplicação deve estar de acordo coma figura abaixo: Layout da tela da aplicaçãoAgora vamos na arquivo “AppRGBColor.java” e coloque oseguinte código abaixo:package br.com.apprgbcolor;import android.app.*;import android.graphics.Color;import android.os.Bundle; 137
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresimport android.widget.*;public class AppRGBColor extends Activityimplements SeekBar.OnSeekBarChangeListener { /** Called when the activity is first created.*/ TextView boxcolor; SeekBar sbarred,sbargreen,sbarblue; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); boxcolor = (TextView)findViewById(R.id.boxcolor); sbarred = (SeekBar)findViewById(R.id.sbarred); sbargreen = (SeekBar)findViewById(R.id.sbargreen); sbarblue = (SeekBar)findViewById(R.id.sbarblue); sbarred.setOnSeekBarChangeListener(this); sbargreen.setOnSeekBarChangeListener(this); sbarblue.setOnSeekBarChangeListener(this); } @Override public void onProgressChanged(SeekBar arg0,int arg1, boolean arg2) { boxcolor.setBackgroundColor(Color.rgb(sbarred.getProgress(), sbargreen.getProgress(), sbarblue.getProgress()));138
  • Luciano Alves da Silva } @Override public void onStartTrackingTouch(SeekBararg0) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar arg0){ // TODO Auto-generated method stub } }Agora vamos a explicação de alguns trechos de código acima.Observe a linha abaixo: public class AppRGBColor extends Activityimplements SeekBar.OnSeekBarChangeListenerObservem acima que na declaração da nossa classe, euimplemento a interface OnSeekChangeListener, pertencente aocomponente SeekBar, que na verdade é um evento que édisparado toda vez que o valor de progresso da nossa SeekBar éalterado. Porque eu implementei isso na declaração da classe aoinvés de definir isso para cada SeekBar ? A razão é muitosimples, seria gasto muito código e todas as três SeekBars vãodisparar, ou melhor, executar o mesmo trecho de código.A interface OnSeekBarChangeListener possui três métodos :onProgressChanged, onStartTrackingTouch eonStopTrackingTouch e todas elas precisam ser 139
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresimplementadas, como foi feita no código, porém, o únicométodo que será codificado será o onProgressChanged, quepossui o seguinte código abaixo:boxcolor.setBackgroundColor(Color.rgb(sbarred.getProgress(),sbargreen.getProgress(),sbarblue.getProgress()));Vamos entender o código acima. O objeto boxcolor (que naverdade é uma TextView com o texto EM BRANCO), possuium método chamado setBackgroundColor, onde podemosdefinir a cor de fundo de objeto. Dentro do seu parâmetroinvocamos o método rgb da classe Color, cuja finalidade éretornar um valor inteiro corresponde ao valor “rgb” passado noseu parâmetro. Observe que o método rbg possui trêsparâmetros onde cada um deles representa o valor de uma cor: acor vermelha (red), a cor verde (green) e outra, a cor azul(blue).Execute a aplicação. O resultado você confere na figura abaixo:140
  • Luciano Alves da Silva Aplicação de RGB em execução4.22) A widget DatePickerO componente DatePicker funciona como se fosse umcalendário onde especificamos ou consultamos uma determinadadata.4.23) Desenvolvendo uma aplicação de calendárioCrie um novo projeto com os seguintes dados abaixo: Project Name: Calendario 141
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Package Name : br.com.appcalendario Create Activity: AppCalendario Application Name: Calendário Min SDK Version : 7Depois de carregar o layout do arquivo “main.xml”, modifique oconteúdo da TextView com a frase : Selecione a data.Agora, insira os seguintes componentes na sequência:DatePicker Propriedade Valor Id @+id/data Layout_width fill_parentButton Propriedade Valor Id @+id/btdata Layout_width fill_parent Text Mostrar dataSeguindo os passos acima, a aplicação deve estar de acordo coma figura abaixo:142
  • Luciano Alves da Silva Layout da aplicaçãoE por último, vá no arquivo “AppData.java” e coloque oseguinte código abaixo:package br.com.appcalendario;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.View;import android.widget.*;public class AppCalendario extends Activity { DatePicker dp; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); 143
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Button b = (Button)findViewById(R.id.btdata); dp = (DatePicker) findViewById(R.id.data); dp.updateDate(2009, 04, 23); b.setOnClickListener(newView.OnClickListener(){ public void onClick(View v) { AlertDialog.Builder dialogo= new AlertDialog.Builder(AppCalendario.this); dialogo.setMessage("Dataselecionada : " +String.valueOf(dp.getDayOfMonth()) + "/" +String.valueOf(dp.getMonth() + 1) + "/" +String.valueOf(dp.getYear())); dialogo.setNeutralButton("OK", null); dialogo.setTitle("Data"); dialogo.show(); } }); }}Vamos executar a nossa aplicação. O resultado você vê nafigura abaixo:144
  • Luciano Alves da Silva Aplicação de calendário em execução4.24) A widget TimePickerO componente TimePicker funciona como se fosse umDatePicker ,só que ao invés de trabalhar com datas, vocêtrabalha com horas.4.25) Desenvolvendo uma aplicação que faz uso doTimePickerCrie um novo projeto com os seguintes dados abaixo:Project Name: ExemploTimePickerPackage Name : br.com.apptimeCreate Activity: AppTimeApplication Name: Exemplo com TimePicker 145
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresMin SDK Version: 7Agora carregue o arquivo de layout “main.xml” e modifique oconteúdo da TextView com a seguinte frase : “Selecione ahora:”. Agora, adicione os componentes na sequência:TimePicker Propriedade Valor Id @+id/hora Layout_width fill_parentButton Propriedade Valor Id @+id/btmostrar Layout_width fill_parent Text Mostrar horaSegundo os passos acima, a aplicação deve estar de acordo como layout abaixo:146
  • Luciano Alves da Silva Layout da aplicaçãoE por último, vá no arquivo “AppTime.java” e coloque oseguinte código abaixo:package br.com.apptime;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.View;import android.widget.*;public class AppTime extends Activity { TimePicker tp; @Override 147
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btmostrar = (Button)findViewById(R.id.btmostrar); tp = (TimePicker) findViewById(R.id.hora); btmostrar.setOnClickListener(newView.OnClickListener(){ public void onClick(View v) { AlertDialog.Builder dialogo= new AlertDialog.Builder(AppTime.this); dialogo.setMessage("Horaselecionada : " +String.valueOf(tp.getCurrentHour() + 1) + ":" +String.valueOf(tp.getCurrentMinute())); dialogo.setNeutralButton("OK", null); dialogo.setTitle("Hora"); dialogo.show(); } }); }}Vamos executar a nossa aplicação . O resultado você vê nafigura abaixo:148
  • Luciano Alves da SilvaAplicação que demonstra o uso do TimePicker em execução4.26) A widget ToogleButtonO componente ToogleButton é como se fosse uma combinaçãodo componente Button com o componente CheckBox. Todavez que clicamos no botão para marcá-lo ou desmarca-lo, otexto dele muda indicando essa mudança.4.27) Desenvolvendo uma aplicação que faz uso doToogleButtonProject Name: ExemploToogleButtonPackage Name : br.com.apptooglebuttonCreate Activity: AppToogleButtonApplication Name: Exemplo com ToogleButton 149
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresMin SDK Version: 7Bom, depois de criar o projeto carregue o arquivo “main.xml” eapague o componente TextView. Em seguida, coloque ocomponente ToogleButton (que se encontra na seção “FormWidgets”) na tela do dispositivo somente um. Seguindo essepasso, o layout deve estar de acordo com a figura abaixo: Layout da aplicaçãoSe você observar, automaticamente o texto que esta noToogleButton é “OFF”, ele coloca esse texto automaticamente.Agora vamos mudar as seguintes propriedades abaixo: Propriedade Valor Text off apagado Text on aceso150
  • Luciano Alves da SilvaBom, vou explicar as propriedades acima. A propriedade “Textoff” serve para definirmos um texto que irá apaecer quando obotão estiver desmarcado e a propriedade “Text on” serve para odefinirmos um texto que irá aparecer quando o botão estivermarcado.Execute a aplicação e veja os resultados, conforme demonstra afigura abaixo: Aplicação em execução (ToogleButton desmarcado) Aplicação em execução (ToogleButton marcado) 151
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores4.28) A widget ChronometerEste componente foi baseado no TextView e funciona como umcronômetro, onde podemos fazer um controle de tempo.4.29) Desenvolvendo um cronômetro digitalPara demonstrar o uso deste componente, vamos construir umcronômetro digital com algumas operações básicas. Crie umnovo projeto com os seguintes dados abaixo:Project Name: CronometroDigitalPackage Name : br.com.appcronometroCreate Activity: AppCronometroApplication Name: Cronômetro DigitalMin SDK Version: 7Bom, depois de criar o projeto carregue o arquivo “main.xml” eapague o componente TextView. Em seguida , adicione ocomponente abaixo:Chronometer Propriedade Valor Id @+id/cronometro Format Tempo decorrido (%s)152
  • Luciano Alves da SilvaVamos analisar a propriedade Format. Essa propriedadefunciona como se fosse a propriedade Text (do componenteTextView) mas, com uma formatação pra tempo. Quando vocêcolocou o componente na tela, ele mostrou o valor “’’00” (quedurante a execução do Android, será substituído pelo tempodecorrido no formato “mm:ss”). Observe que quando digitamoso valor acima na propriedade , o “%s” foi substituído pelo“’’00”, que equivale ao tempo decorrido.Agora adicione os seguintes componente na sequência:Button Propriedade Valor Id @+id/btiniciar Layout_width fill_parent Text IniciarButton Propriedade Valor Id @+id/btpausa Layout_width fill_parent Text PausaButton Propriedade Valor Id @+id/btparar Layout_width fill_parent Text Parar 153
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da aplicaçãoBom, agora vamos codificar o arquivo “AppCronometro.java”,com o seguinte código abaixo:package br.com.appcronometro;import android.app.Activity;import android.os.Bundle;import android.os.SystemClock;import android.widget.*;import android.view.*;public class AppCronometro extends Activity { /** Called when the activity is first created.*/ Chronometer cronometro; Button btiniciar, btpausa, btparar; boolean deuStop;154
  • Luciano Alves da Silva @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); deuStop = true; cronometro = (Chronometer) findViewById(R.id.cronometro); btiniciar = (Button) findViewById(R.id.btiniciar); btpausa = (Button) findViewById(R.id.btpausa); btparar = (Button) findViewById(R.id.btparar); btiniciar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if(deuStop) cronometro.setBase(SystemClock. elapsedRealtime()); cronometro.start(); } }); btpausa.setOnClickListener(new View.OnClickListener() { 155
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores @Override public void onClick(View arg0) { deuStop = false; cronometro.stop(); } }); btparar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { deuStop = true; cronometro.stop(); cronometro.setText("Tempo decorrido (00:00)"); } }); }}Vamos analisar alguns trechos de código do programa,principalmente os eventos dos botões. Vamos no evento dobotão “iniciar”, conforme mostro abaixo:public void onClick(View arg0) { if(deuStop)cronometro.setBase(SystemClock.elapsedRealtime());156
  • Luciano Alves da Silva cronometro.start(); }Quando eu pressiono o botão “iniciar”, a primeira coisa quefaço é verificar se a variável deuStop assume o valor true (ouseja, indicando que o botão stop foi pressionado), casoverdadeiro, executo o método “setBase”, com o argumento“SystemClock.elapsedRealTime()”, cujo objetivo é zerar otempo do cronômetro. Em seguida disparo o cronômetro com ométodo “start”.Agora vamos dentro do botão “pausa”, como mostro abaixo:public void onClick(View arg0) { deuStop = false; cronometro.stop(); }Quando eu pressiono o botão pausa, a variável deuStop assumeo valor false e em seguida, disparo o método “stop”.Agora vamos dentro do botão “parar”, conforme mostro abaixo:public void onClick(View arg0) { deuStop = true; cronometro.stop(); cronometro.setText("Tempo decorrido(00:00)"); 157
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores }Quando eu pressiono o botão “parar”, a variável deuStop assumeo valor “true". Em seguida, disparo o método “stop” e depois,altero o rótulo do cronômetro utilizando o método setText.Porque utilizo o método setText e não o setFormat ? Peloseguinte motivo : Quando o tempo é disparado ele irá buscar oconteúdo da propriedade “Format” , cujo objetivo é mostrar deformato personalizado o tempo, desde que haja a string “%s”.Se nos usássemos o método setFormat, nunca iríamos ver otempo de forma correta. Por isso utilizei o método setText, quetambém modifica o conteúdo exibido pelo componente.Execute a aplicação e veja o resultado: Aplicação de cronômetro digital em execução4.30) A widget AnalogClockO componente AnalogClock mostra um relógio analógicocomum com dois ponteiros : um pra minutos e outro parasegundos. O objetivo desde componente é mostrar hora correntedo sistema, nada mais.158
  • Luciano Alves da Silva4.31) Desenvolvendo uma aplicação que mostra a horacorrente do sistema.Crie um projeto com os seguintes dados abaixo:Project Name: HoraDoSistemaPackage Name : br.com.appanalogclockCreate Activity: AppHoraApplication Name: Hora do Sistema (AnalogClock)Min SDK Version : 7 Depois de criado o projeto carregue o arquivo “main.xml”, eem seguida selecione o componente TextView na tela dodispositivo e mude as seguintes propriedades: Propriedade Valor Text size 24sp Text color #ffffff Text Hora certa Gravity center Layout_width fill_parentAgora adicione o componente abaixo: 159
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAnalogClock Propriedade Valor Layout_width fill_parentSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da aplicaçãoExecute a aplicação e veja o resultado, conforme demonstra afigura abaixo: Aplicação em execução160
  • Luciano Alves da Silva4.30) A widget DigitalClockO componente DigitalClock foi baseado no componenteTextView, e possui a mesma finalidade do componenteAnalogClock, mostrar à hora corrente do sistema porém, noformato digital, nada mais.4.31) Desenvolvendo uma aplicação que mostra a horacorrente do sistema.Crie um projeto com os seguintes dados abaixo:Project Name: HoraDoSistema2Package Name : br.com.appdigitalclockCreate Activity: AppHoraApplication Name: Hora do sistema (DigitalClock)Min SDK Version : 7 Depois de criado o projeto carregue o arquivo “main.xml”, eem seguida selecione o componente TextView na tela dodispositivo e mude as seguintes propriedades: Propriedade Valor Text size 24sp Text color #ffffff 161
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Text Hora certa Gravity center Layout_width fill_parentAgora, adicione o componente abaixo:DigitalClock Propriedade Valor Text size 24sp Text color #ffff00 Gravity center Layout_width fill_parentSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da aplicaçãoExecute a aplicação e veja o resultado. Aplicação em execução162
  • Luciano Alves da Silva4.32) A widget ZoomControlsA widget ZoomControls consiste naqueles dois botões deZOOM, um para maximizar e outro para minimizar o zoom.4.33) Desenvolvendo um programa que aplica zoom emImagensCrie um novo projeto com os seguintes dados abaixo:Project Name: ZoomImagensPackage Name : br.com.appzoomCreate Activity: AppZoomApplication Name: Zoom em imagensMin SDK Version: 7Após criado o projeto, vamos adicionar uma imagem qualquerna pasta “drawable-mdpi”, que será utilizado na nossa aplicação(neste projeto, utilizei uma imagem chamada android.jpg).Depois de adicionar uma imagem no projeto, carregue o arquivo“main.xml”, e em seguida selecione o componente TextView efaça as seguintes modificações: Propriedade Valor 163
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Text size 24sp Text color #ffff00 Text Zoom com Imagens Gravity center Layout_width fill_parentEm seguida, dentro da estrutura LinearLayout principal, vamosadicionar uma nova estrutura LinearLayout e em seguida,modifique as seguintes propriedades abaixo:LinearLayout Propriedade Valor Id @+id/layoutImagem Gravity center Layout_width fill_parent Layout Height 250pxAgora dentro da estrutura LinearLayout que acabamos deconfigurar acima (layoutImagem), adicione um componenteImageView e faça as seguintes modificações:ImageView Propriedade Valor Id @+id/imagem Scale type fitXY Src @drawable/android Layout_width 100px Layout Height 100px164
  • Luciano Alves da SilvaBom, agora vou explicar a propriedade “Scale type” docomponente ImageView. Como vamos trabalhar com zoom naimagem, é preciso que ao aplicarmos o zoom, a imagem seestique dentro da proporção do zoom. Para isso, defini o valor“fitXY” que permite esticar a imagem quando ela forredimensionada.Agora dentro da estrutura LinearLayout principal, vamosadicionar o componente ZoomControls (que se encontra naguia “Advanced”) e em seguida fazer as seguintes modificações: Propriedade Valor Id @+id/zoom Gravity center Layout_width Fill_parentSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: 165
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da aplicaçãoAgora vamos codificar o arquivo “AppZoom.java” com oseguinte código abaixo:package br.com.appzoom;import android.app.Activity;import android.os.Bundle;import android.view.*;import android.widget.*;public class AppZoom extends Activity { /** Called when the activity is first created.*/ ZoomControls zoom; ImageView imagem; int sizeX=100, sizeY=100; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); zoom = (ZoomControls) findViewById(R.id.zoom); imagem = (ImageView) findViewById(R.id.imagem); zoom.setOnZoomInClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub sizeX+=10; sizeY+=10;166
  • Luciano Alves da Silva imagem.setLayoutParams(new LinearLayout.LayoutParams(sizeX, sizeY)); } }) ; zoom.setOnZoomOutClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub sizeX-=10; sizeY-=10; imagem.setLayoutParams(new LinearLayout.LayoutParams(sizeX, sizeY)); } }) ; }}Agora vamos analisar alguns trechos do código. Observe quenesse programa em defino dois eventos para o componenteZoomControls, um evento que será disparado quando o botão“Zoom In” for pressionado , através do métodosetOnZoomInClickListener e um outro que será disparadoquando o botão “Zoom Out” for pressionado , através dométodo setOnZoomOutClickListener. Agora vamos ver ocódigo do evento OnZoomInClickListener : 167
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores public void onClick(View arg0) { // TODO Auto-generated method stub sizeX+=10; sizeY+=10; imagem.setLayoutParams(newLinearLayout.LayoutParams(sizeX, sizeY)); }Observe que dentro desse método, incremento o valor dasvariáveis sizeX e sizeY com “10” onde essas variáveiscorrespondem respectivamente a largura e a altura da imagem(em pixels). Na instrução abaixo:imagem.setLayoutParams(newLinearLayout.LayoutParams(sizeX, sizeY));Redimensiono a imagem de acordo com os valores dasvariáveis, através do método setLayoutParams. Comoargumento para este método, criei a instancia de LinearLayoute em seguida, disparei o LayoutParams passando comoargumento, as variáveis que representam a largura e a altura daimagem.O código do evento OnZoomOutClickListener é similar ao doevento acima.Execute a aplicação e veja seu resultado:168
  • Luciano Alves da Silva Aplicação em execuçãoAté aqui, com o que já foi visto até agora, você já é capaz dedesenvolver aplicações em Android. Vamos agora nos próximostópicos nos aprofundar um pouco nos recursos existentes noAndroid. 169
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores5) Mudando de layoutsA té agora fizemos aplicações em Android que utilizassem um único layout. Agora vamos fazer aplicações Android que utilizem mais de um layout.Vamos criar um novo projeto de demonstração chamadoTrocaDeLayouts, conforme os dados abaixo:Project Name: TrocaDeLayoutsPackage Name : br.com.applayoutCreate Activity: AppLayoutApplication Name: Mudando de layoutsMin SDK Version: 7Carregue o arquivo de layout “main.xml” e modifique oconteúdo da TextView, com a seguinte frase : “Você está na telaprincipal”. Agora adicione um Button e modifique as seguintespropriedades:Button Propriedade Valor Id @+id/bttela2 Layout width fill_parent Text Ir pata tela 2170
  • Luciano Alves da SilvaSeguindo os passos acima, a aplicação deve estar de acordo coma figura abaixo: Layout da tela 1Ótimo! Agora vamos criar um novo arquivo chamado“tela2.xml”, que vai estar também dentro da pasta “layout”. Sigaos passos abaixo:Clique com o botão direito sobre a pasta “layout” e selecione aopção “New/Android XML File”, conforme mostra a figuraabaixo: Criando um arquivo 171
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAgora no campo “File” digite “tela2”, conforme figura abaixo elogo depois, clique em “Finish”. Definindo o nome do arquivoAo carreguar o arquivo “tela2.xml”, será mostrado a seguintetela abaixo:172
  • Luciano Alves da Silva Tela de layout em brancoVamos ajustar a visualização do nosso layout, selecionando para“3.2in HVGA slider (ADP1)”.Em seguida mude o valor da propriedade do layout principal datela da aplicação, conforme é mostrado abaixo:LinearLayout Propriedade Valor Orientation verticalLogo em seguida adicione os seguintes componentes, nasequência: 173
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresTextView Propriedade Valor Text Você está na tela 2Button Propriedade Valor Id @+id/bttelaprincipal Layout width fill_parent Text Ir pata tela principalSeguindo os passos acima, o layout do arquivo “tela2.xml” deveestar de acordo com a figura abaixo: Layout da tela 2174
  • Luciano Alves da SilvaDepois disso, modifique o arquivo “AppLayout.java”, conformeo código abaixo:package br.com.applayout;import android.app.Activity;import android.os.Bundle;import android.view.*;import android.widget.*;public class AppLayout extends Activity { public void CarregaTelaPrincipal() { setContentView(R.layout.main); Button bttela2 = (Button) findViewById(R.id.bttela2); bttela2.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0) { CarregaTela2(); } }); } public void CarregaTela2() { setContentView(R.layout.tela2); Button bttelaprincipal = (Button) findViewById(R.id.bttelaprincipal); 175
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores bttelaprincipal.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0) { CarregaTelaPrincipal(); } }); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CarregaTelaPrincipal(); }}Observem que nesta classe eu criei dois métodos :CarregaTelaPrincipal e CarregaTela2. Toda aplicação queutilize mais de um layout, o carregamento dos layouts e de seusrespectivos widgets devem estar separados em funçõesdesenvolvidas para esse propósito. Logo, o métodoCarregaTelaPrincipal carrega o layout principal e seusrespectivos componentes, o mesmo válido para o métodoCarregaTela2, que carrega o layout da tela 2 e seus respectivoscomponentes. Feito isso, execute a aplicação. Veja o resultadoabaixo:176
  • Luciano Alves da Silva Aplicação em execução (no layout principal) Aplicação em execução (no segundo layout)5.1) Desenvolvendo uma aplicação de cadastroAgora vamos desenvolver uma aplicação de cadastro. Essaaplicação consiste em um cadastro de pessoas onde possocadastrar dados como: Nome, Profissão e Idade. Essa aplicaçãovai fazer uso de três layouts:O layout principal: Esse layout dará acesso ao layout decadastro e o layout de visualização de dados. 177
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresO layout de cadastro: Nesse layout é onde será efetuado ocadastro dos dados da pessoa.O layout de visualização de dados: Nesse layout é onde serãovisualizados os dados cadastrados. Se nenhum dado foicadastrado, será exibida uma mensagem informando essasituação.Nessa aplicação, para armazenar os dados, eu faço um de umaestrutura de dados FIFO ou Fila. Nessa estrutura, os dados sãoarmazenados em sequência, e acessados em sequência , ou seja,o primeiro dado a entrar será o primeiro a ser exibido.Bom, vamos construir a nossa aplicação. Crie um novo projetocom os dados abaixo:Project Name: AplicacaoDeCadastroPackage Name : br.com.appcadastroCreate Activity: AppCadastroApplication Name: Aplicação de CadastroMin SDK Version: 7Dentro da pasta “res/drawable-mdpi”, coloque uma figura , queque represente o ícone da nossa aplicação. Para esta aplicaçãoutilizei uma imagem de extensão PNG chamada “profile.png”.178
  • Luciano Alves da SilvaAgora carregue o arquivo “main.xml” e APAGUE a TextViewque se encontra na tela do layout do dispositivo. Em seguida,coloque os seguintes componentes, na sequência:ImageView Propriedade Valor Src @drawable/profileTextView Propriedade Valor Bem vindo a Aplicação de Cadastro de Pessoas.Este é Text um pequeno programa de demonstração de cadastro.Selecione uma das opções abaixo:Button Propriedade Valor Id @+principal/btcadastrarpessoas Layout_width fill_parent Text Cadastrar pessoa 179
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresButton Propriedade Valor Id @+principal/btlistarpessoas Layout_width fill_parent Text Listar pessoas cadastradasSeguindo os passos acima, a aplicação deve estar de acordo coma figura abaixo: Layout da tela principal da aplicaçãoAgora vamos criar um arquivo chamado “cadastro.xml” evamos coloca-lo dentro da pasta “res/layout” do nosso projeto.180
  • Luciano Alves da SilvaNo início o arquivo estará somente com a estrutura de layout datela, mude a propriedade desse layout, conforme é mostradoabaixo:LinearLayout Propriedade Valor Orientation verticalEm seguida coloque os seguintes componentes na sequencia:ImageView Propriedade Valor Src @drawable/profileTextView Propriedade Valor Text Módulo de cadastro.Digite seus dados abaixo:TextView Propriedade Valor Text Nome: 181
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresEditText Propriedade Valor Id @+cadastro/ednome Layout_width fill_parent TextTextView Propriedade Valor Text Profissão:EditText Propriedade Valor Id @+cadastro/edprofissao Layout_width fill_parent TextTextView Propriedade Valor Text Idade:EditText Propriedade Valor Id @+cadastro/edidade Layout_width fill_parent Text182
  • Luciano Alves da SilvaSeguindo os passos acima, a aplicação deve estar de acordo coma figura seguinte: Layout da tela de cadastroBom, ainda não acabou. Agora vamos adicionar uma estruturaLinearLayout que será responsável por organizar os botões deforma horizontal logo após a EditText que representa o campo“idade”. Após adicionar essa estrutura ela vai estar nomeada delinearLayout2 e em seguida, modifique a seguintes propriedadesdela, conforme abaixo: Propriedade Valor Orientation horizontal Layout fill_parent Gravity center 183
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresA propriedade “Gravity” , similar a propriedade “Orientation”,determina o alinhamento dos componentes dentro da estrutura,que no caso acima está alinhando os componentes de formacentralizada, ou seja, os componentes vão estar dispostos deforma horizontal (um ao lado do outro) e todos essescomponentes estarão alinhados de forma centralizada.Seguindo o mesmo procedimento acima, vamos adicionar doisButtons dentro dessa estrutura, e mude as seguintespropriedades citadas abaixo.Button Propriedade Valor Id @+cadastro/btcadastrar Text Cadastrar pessoaButton Propriedade Valor Id @+cadastro/btcancelar Text CancelarSeguindo os passos acima, o Layout de nossa aplicação deveestar de acordo com a figura abaixo:184
  • Luciano Alves da Silva Layout da tela de cadastroAgora dentro da pasta “res/layout” vamos criar um arquivochamado “listacadastrados.xml” que será responsável pormostrar todos usuários devidamente cadastrados.No início o arquivo estará somente com a estrutura de layout datela, mude a propriedade desse layout, conforme é mostradoabaixo:LinearLayout Propriedade Valor Orientation verticalEm seguida coloque os seguintes componentes, na sequência: 185
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresImageView Propriedade Valor Src @drawable/profileTextView Propriedade Valor Text Lista de pessoas cadastradas. Text color #ffffff Text size 20spSe você observar acima, estou trabalhando com duaspropriedades pertencentes também ao componente TextView,uma chamada “Text color”, responsável por definir a cor dotexto que neste caso, o valor da cor precisa estar no formatohexadecimal precedido do símbolo # ,e “Text size” responsávelpor definir o tamanho do texto.Seguindo os passos acima, o layout da aplicação deve estar deacordo com a figura abaixo: Layout da tela de listagem de cadastrados186
  • Luciano Alves da SilvaBom, ainda não acabou. Se você observou damos um nome anossa estrutura LinearLayout, nós a chamados de“layoutPrincipal”. Seguindo os procedimentos que já foramexplicados, vamos adicionar dentro da estrutura“layoutPrincipal” uma nova estrutura LinearLayout dentrodela. Depois de adicionar vamos mudar as seguintespropriedades dela, conforme abaixo:LinearLayout Propriedade Valor Orientation Horizontal Id @+id/layoutNomeBom, agora dentro da estrutura “layoutNome” vamos adicionaros seguintes componentes na sequência:TextView Propriedade Valor Text Nome. Text color #ffff00 Text size 20spTextView Propriedade Valor Text 187
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Text color #ffffff Text size 20sp Id @+lista/txtnomeBom agora dentro da estrutura “layoutPrincipal”, vamosadicionar uma nova estrutura LinearLayout, e em seguidamodifique as seguintes propriedades abaixo: Propriedade Valor Orientation Horizontal Id @+id/layoutProfissaoBom, agora dentro da estrutura “layoutProfissao” vamosadicionar os seguintes componentes na sequência:TextView Propriedade Valor Text Profissão. Text color #ffff00 Text size 20spTextView Propriedade Valor Text Text color #ffffff Text size 20sp Id @+lista/txtprofissao188
  • Luciano Alves da SilvaAgora dentro da estrutura “layoutPrincipal” vamos adicionaruma nova estrutura LinearLayout, e em seguida modifique asseguintes propriedades abaixo: Propriedade Valor Orientation Horizontal Id @+id/layoutIdadeBom, agora dentro da estrutura “layoutProfissao” vamosadicionar os seguintes componentes na sequência:TextView Propriedade Valor Text Idade. Text color #ffff00 Text size 20spTextView Propriedade Valor Text Text color #ffffff Text size 20sp Id @+lista/txtidadeBom agora dentro da estrutura “layoutPrincipal”, vamosadicionar uma nova estrutura LinearLayout, como já foimostrado acima. E depois, modifique as seguintes propriedadesabaixo: 189
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Propriedade Valor Orientation Horizontal Id @+id/layoutBotoes Layout width fill_parent Gravity CenterBom, agora dentro da estrutura “layoutProfissao” vamosadicionar os seguintes componentes na sequência:Button Propriedade Valor Id @+lista/btvoltar Text VoltarButton Propriedade Valor Id @+lista/btavancar Text AvançarAgora vamos adicionar na estrutura “layoutPrincipal’ um Buttoncom as seguintes propriedades abaixo:Button Propriedade Valor Id @+lista/btmenu Text Menu principal Layout width fill_parent190
  • Luciano Alves da SilvaSeguindo todos os passos acima, o layout da aplicação deveestar de acordo com a figura abaixo: Layout da tela de listagem de cadastradosAgora no arquivo “AppCadastro.java”, coloque o seguintecódigo:package br.com.appcadastro;import android.app.Activity;import android.os.Bundle;import android.widget.*;import android.view.*;import android.app.*;public class AppCadastro extends Activity { 191
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Registro pri,reg,ult,aux; EditText ednome,edprof,edidade; int numreg,pos; void CarregaTelaPrincipal () { setContentView(R.layout.main); Button btcadpess = (Button) findViewById(R.principal.btcadastrarpessoa); Button btlistapess = (Button) findViewById(R.principal.btlistarpessoas); btcadpess.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ CarregaTelaCadastro(); }}); btlistapess.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ CarregaListaPessoas(); }});192
  • Luciano Alves da Silva } void CarregaTelaCadastro() { setContentView(R.layout.cadastro); Button btcadastrar = (Button) findViewById(R.cadastro.btcadastrar); Button btcancelar = (Button) findViewById(R.cadastro.btcancelar); btcadastrar.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ try { reg = new Registro(); ednome =(EditText)findViewById(R.cadastro.ednome); edprof =(EditText)findViewById(R.cadastro.edprofissao); edidade =(EditText)findViewById(R.cadastro.edidade); reg.nome = ednome.getText().toString(); reg.profissao =edprof.getText().toString(); reg.idade =edidade.getText().toString(); if(pri==null) pri=reg; reg.Ant = ult; if(ult==null) 193
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores ult=reg; else { ult.Prox = reg; ult=reg; } numreg++; showMessage("Cadastro efetuado comsucesso", "Aviso"); CarregaTelaPrincipal(); } catch(Exception e) { showMessage("Erro ao cadastrar","Erro"); }} }); btcancelar.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ CarregaTelaPrincipal(); } }); } void CarregaListaPessoas() { if(numreg==0) { showMessage("Nenhum registrocadastrado", "Aviso"); CarregaTelaPrincipal(); return;194
  • Luciano Alves da Silva}setContentView(R.layout.listacadastrados);pos=1;aux=pri;TextView txtnome =(TextView)findViewById(R.lista.txtnome);TextView txtidade =(TextView)findViewById(R.lista.txtidade);TextView txtprofissao =(TextView)findViewById(R.lista.txtprofissao);Button btmenu = (Button)findViewById(R.lista.btmenu);Button btavancar = (Button)findViewById(R.lista.btavancar);Button btvoltar = (Button)findViewById(R.lista.btvoltar);txtnome.setText(aux.nome);txtidade.setText(aux.idade);txtprofissao.setText(aux.profissao);btmenu.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ CarregaTelaPrincipal(); } });btvoltar.setOnClickListener(newView.OnClickListener(){public void onClick(View arg0){ if(pos==1) return; 195
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores pos--; aux=aux.Ant; TextView txtnome = (TextView) findViewById(R.lista.txtnome); TextView txtidade = (TextView) findViewById(R.lista.txtidade); TextView txtprofissao = (TextView) findViewById(R.lista.txtprofissao); txtnome.setText(aux.nome); txtidade.setText(aux.idade); txtprofissao.setText(aux.profissao); } }); btavancar.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ if(pos==numreg) return; pos++; aux=aux.Prox; TextView txtnome = (TextView) findViewById(R.lista.txtnome); TextView txtidade = (TextView) findViewById(R.lista.txtidade); TextView txtprofissao = (TextView) findViewById(R.lista.txtprofissao); txtnome.setText(aux.nome); txtidade.setText(aux.idade); txtprofissao.setText(aux.profissao); } });196
  • Luciano Alves da Silva } public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); numreg=0; pri=ult=null; CarregaTelaPrincipal();}public void showMessage(String Caption,StringTitle) { AlertDialog.Builder dialogo = new AlertDialog.Builder(AppCadastro.this); dialogo.setTitle(Title); dialogo.setMessage(Caption); dialogo.setNeutralButton("OK", null); dialogo.show(); }}Agora no mesmo local onde se encontra o arquivo“AppCadastro.java” (no pacote “br.com.appcadastro”), você vaicriar uma classe chamada Registro. Depois de criar a classe,coloque o código que é exibido abaixo:package br.com.appcadastro;public class Registro { 197
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores String nome; String profissao; String idade; Registro Prox; Registro Ant;}Agora vamos analisar aos poucos os códigos dessa aplicação.Observe que nessa aplicação ou possuo três métodos: ummétodo chamado CarregaTelaPrincipal , responsável porcarregar o layout da tela principal. O métodoCarregaTelaCadastro é responsável por carregar a tela decadastro.Vamos analisar alguns códigos do métodoCarregaTelaCadastro. Se você observar nessa aplicação, queeu declarei quatro variáveis chamadas pri,ult e reg e aux do tipoRegistro. A variável pri serve para apontar para o endereço doprimeiro registro. A variável ult aponta para o endereço doúltimo registro. A variável reg armazena os dados do registrocorrente e a variável aux funciona como uma variável auxiliar.É com a utilização essas variáveis que faço o cadastro dos dadosdas pessoas. Vamos para o evento Click do botão btcadastrarsituado dentro do método CarregaTelaCadastro e analisaralgumas linhas de código. A linha:reg = new Registro();Cria uma nova instância da classe Registro e atribui a “variávelobjeto” reg. As linhas:198
  • Luciano Alves da Silvareg.nome = ednome.getText().toString(); reg.profissao = edprof.getText().toString(); reg.idade = edidade.getText().toString();Gravam os dados dos campos no objeto reg. Já as linhas abaixo: if(pri==null) pri=reg; reg.Ant = ult; if(ult==null) ult=reg; else { ult.Prox = reg; ult=reg; }Fazem todo o processo de armazenamento dos dados.Agora vamos para o método CarregaListaPessoas. Quandoesse método é chamado, é feita uma verificação se há dadoscadastrados, se não houver dados cadastrados será exibida umamensagem indicando essa situação e você será retornado a telaprincipal. Vou comentar algumas linhas. A linha:aux=pri;Retorna para a variável aux o endereço do primeiro registro, queestá armazenado em pri . Já as linhas: txtnome.setText(aux.nome); txtidade.setText(aux.idade); txtprofissao.setText(aux.profissao); 199
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresJoga as informações obtidas (nome, idade e profissão) para oscampos (TextViews), para que eles possam ser exibidas.Vamos agora para o evento click do botão btvoltar. Esse botãomostra os registros anteriores. Antes de voltar um registro,verifico se eu me encontro no primeiro registro pela condição:if(pos==1)Se a condição for verdadeira, saio do evento, senão, continuoexecutando as instruções. A linha:aux=aux.Ant;Retorna para aux o endereço do registro anterior. Depois dissosão executados instruções para que os dados possam serexibidos.Já no evento click do botão btavancar, antes de passar para opróximo registro, verifico se já está no último registro pelainstrução:if(pos==numreg)Se a condição for verdadeira, saio do evento, senão, continuoexecutando as instruções. A linha:aux=aux.Prox;Retorna para aux o endereço do próximo registro. Depois dissosão executados instruções para que os dados possam serexibidos.Bom, vamos executar a nossa aplicação ? O resultado vocêconfere nas figuras seguintes:200
  • Luciano Alves da Silva Aplicação em execução – Tela principalAplicação em execução – Tela de cadastro 201
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Aplicação em execução – Tela de listagem dos cadastrados202
  • Luciano Alves da Silva6) Trabalhando com mais de uma Activity (Atividade)C omo vimos no tópico anterior, aprendemos a utilizar mais de um layout (tela) em uma aplicação. Agora iremos ver como trabalhar com mais de uma Activity(Atividade) dentro de uma aplicação Android.Bom, vamos construir a nossa aplicação. Crie um novo projetocom os dados abaixo:Project Name: TrocaDeAtividadesPackage Name : br.com.appactivityCreate Activity: AppActivity1Application Name: Troca de atividadesMin SDK Version: 7Bom, carregue o arquivo “main.xml” e em seguida selecione aTextView e mude o valor da propriedade Text com a seguintefrase : “Você está executando a Activity 1”. Em seguida insiraum Button e mude as seguintes propriedades abaixo: Propriedade Valor Id @+lista/btchamaractivity2 Text Chamar Activity2 Layout width fill_parent 203
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da tela para a Activity1Dentro da pasta “layout”, vamos criar um segundo arquivochamado “tela2.xml”.Depois de criar o arquivo mude a propriedade desse layout,conforme é mostrado abaixo:LinearLayout Propriedade Valor Orientation verticalDepois disso, insira os seguintes componentes na sequência:204
  • Luciano Alves da SilvaTextView Propriedade Valor Text Você está executando a Activity 2Button Propriedade Valor Id @+id/btchamaractivity1 Text Chamar Activity1 Layout width fill_parentSeguindo os passos acima, a tela da nossa aplicação deve estarde acordo com a figura abaixo: Layout da tela para a Activity2Agora vamos no arquivo “AppActivity1.java” e vamos inserir oseguinte código abaixo: 205
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorespackage br.com.appactivity;import android.app.Activity;import android.content.*;import android.os.Bundle;import android.widget.*;import android.view.*;public class AppActivity1 extends Activity { /** Called when the activity is first created.*/ Button btchamaractivity2; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btchamaractivity2 = (Button)findViewById(R.id.btchamaractivity2); btchamaractivity2.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {Intent atividade = newIntent(AppActivity1.this,AppActivity2.class); AppActivity1.this.startActivity(atividade); AppActivity1.this.finish(); } }); }}Bom, vamos analisar alguns trechos de código abaixo:206
  • Luciano Alves da SilvaSe você observar acima, dentro do evento OnClick, fazemosuso da classe Intent, ela é responsável por executar algunsserviços internos do Android inclusive também, responsável porchamar ou melhor, executar outras atividades (aplicações).Vamos ver a linha abaixo:Intent atividade = newIntent(AppActivity1.this,AppActivity2.class);Na linha acima eu crio uma instância da classe Intent e nela sãopassados dois parâmetros, um referente a atividade em execução(AppActivity1.this) e outro referente a aplicação que eu queroexecutar (AppActivity2.class).Na linha abaixo:AppActivity1.this.startActivity(atividade);Eu executo a minha atividade AppActivity2 pelo métodostartActivity, representado pela instância “atividade”. Emseguida, finalizo a minha atividade corrente pelo método finish,como demonstra a linha abaixo:AppActivity1.this.finish();Agora no mesmo local onde se encontra o arquivo“AppActivity1.java” (no pacote “br.com.appactivity”), você vaicriar uma classe chamada “AppActivity2”. Depois de criar aclasse, coloque o código que é exibido abaixo: 207
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorespackage br.com.appactivity;import android.app.Activity;import android.content.*;import android.os.Bundle;import android.widget.*;import android.view.*;public class AppActivity2 extends Activity { /** Called when the activity is first created.*/ Button btchamaractivity1; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.tela2); btchamaractivity1 = (Button) findViewById(R.id.btchamaractivity1); btchamaractivity1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent atividade = new Intent(AppActivity2.this, AppActivity1.class); AppActivity2.this. startActivity(atividade); AppActivity2.this.finish(); } }); } }Bom, agora para finalizar a nossa aplicação vamos configurar oarquivo “AndroidManifest.xml”, dizendo a ele que nosso208
  • Luciano Alves da Silvaprojeto vai utilizar mais de uma atividade. Dê um duplo cliqueno arquivo e em seguida clique na guia “AndroidManifest.xml”e insira o seguinte código logo após a tag </activity>.<activity android:name=".AppActivity2" android:label="@string/app_name"> </activity>Bom, depois disso já podemos rodar a nossa aplicação. Veja afigura abaixo: Aplicação em execução (Activity1) Aplicação em execução (Activity2) 209
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores7) Trabalhando com o componente TabWidgetN o Android é possível desenvolvermos aplicações onde cada componente fica disponível em páginas (Tabs). Isso é conseguido através da estrutura TabWidget.Vamos desenvolver uma aplicação que faça uso dessa estrutura.Crie um novo projeto com os dados abaixo:Project Name: TabWidgetPackage Name : br.com.apptabwidgetCreate Activity: AppTabWidgetApplication Name: TabWidgetMin SDK Version: 7Agora siga os passos para a construção dessa aplicação.Primeiramente vamos criar um novo arquivo chamado“tela_activity1.xml” dentro do diretório “layout”. Depois decriado, insira uma TextView e modifique a sua propriedadeText com a seguinte frase: “Esta é a Activity1”. Seguido o quese foi pedido, o layout da tela deve estar de acordo com o dafigura abaixo:210
  • Luciano Alves da Silva Layout da tela da aplicaçãoAgora vamos criar um novo arquivo chamado“tela_activity2.xml” dentro do diretório “layout”. Depois decriado, insira uma TextView e modifique a sua propriedadeText com a seguinte frase: “Esta é a Activity2”. Seguido o quese foi pedido, o layout da tela deve estar de acordo com o dafigura abaixo: Layout da tela da aplicaçãoAgora vamos criar um novo arquivo chamado“tela_activity3.xml” dentro do diretório “layout”. Depois decriado, insira uma TextView e modifique a sua propriedadeText com a seguinte frase: “Esta é a Activity3”. Seguido o quese foi pedido, o layout da tela deve estar de acordo com o dafigura abaixo: 211
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da tela da aplicaçãoBom carregue o arquivo “main.xml” e em seguida, clique naguia “main.xml” e substitua o código existente pelo códigoabaixo:<?xml version="1.0" encoding="utf-8"?><TabHostxmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp" /> </LinearLayout></TabHost>212
  • Luciano Alves da SilvaA estrutura acima é reponsável por suportar aplicações baseadasem páginas (Tabs). Depois de substituir o código, salve oarquivo.Bom agora vamos criar três classes (Atividades), cada umacorrespondendo a uma tela de aplicação.Clique com o botão direito sobre o pacote “br.com.appwidget” eselecione “New/Class”. O nome da nossa primeira classe vai sechamar “Activity1”. Depois de criada a classe , coloque ocódigo o seguinte, conforme mostra abaixo:package br.com.appwidget;import android.app.*;import android.os.*;public class Activity1 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tela_activity1); }}Seguindo os mesmos procedimentos acima, crie uma segundaclasse chamada “Activity2”, e depois de criada , coloque oseguinte código abaixo:package br.com.appwidget;import android.app.*;import android.os.*; 213
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorespublic class Activity2 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tela_activity2); }}Repetindo os mesmos procedimentos, crie uma terceira classechamada “Activity3”, e depois de criada , coloque o seguintecódigo abaixo:package br.com.appwidget;import android.app.*;import android.os.*;public class Activity3 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tela_activity3); }}Bom, agora vamos no arquivo “AppTabWidget.java” e vamoscolocar o seguinte código abaixo:214
  • Luciano Alves da Silvapackage br.com.apptabwidget;import android.app.*;import android.os.Bundle;import android.widget.*;public class AppTabWidget extends TabActivity { /** Called when the activity is first created.*/ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); TabHost tabHost = getTabHost(); TabHost.TabSpec spec; Intent intent; intent = new Intent().setClass(this, Activity1.class); spec = tabHost.newTabSpec("tab1"). setIndicator("TAB 1").setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, Activity2.class); spec = tabHost.newTabSpec("tab2"). setIndicator("TAB 2").setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, Activity3.class); 215
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores spec = tabHost.newTabSpec("tab3"). setIndicator("TAB 3").setContent(intent); tabHost.addTab(spec); tabHost.setCurrentTab(0); }}Agora vamos a explicação do código:Se você observar, agora não derivamos da classe Activity e simda classe TabActivity. Essa classe é voltada para trabalhar comaplicações baseadas em páginas e possui alguns métodossimilares ao da classe Activity como o método onCreate.Na linha abaixo: TabHost mTabHost = getTabHost();Criamos um objeto do tipo TabHost que recebe como valor ainstância retornada pelo método getTabHost. Na linha seguinte:TabHost.TabSpec spec;Crio um objeto do tipo TabSpec, que na verdade representauma TAB a ser adicionada na estrutura TabHost.Na linha abaixo:Intent intent;216
  • Luciano Alves da SilvaCrio uma variável objeto do tipo Intent (classe responsável porexecutar algumas operações dentro do Android, conforme já foiexplicado). Na linha seguinte:intent = new Intent().setClass(this,Activity1.class);Crio uma instância da classe Intent , disparando uma chamadapara a Activity1, através do método setClass. Na linha seguinte:spec = tabHost.newTabSpec("tab1").setIndicator("TAB1").setContent(intent);Crio uma nova TAB referenciando a “intent” que representa àActivity1. Na linha seguinte:tabHost.addTab(spec);Adiciono a página criada a estrutura . Os passos mostradosacima são os mesmos para a Activity2 e Activity3.Na linha abaixo:tabHost.setCurrentTab(0);Definimos a página corrente a ser exibida, que no caso será aprimeira.Ainda não acabou, precisamos fazer agora uma última operação.Acabamos de criar três classes : Activity1, Activity2 eActivity3. Precisamos definir no “AndroidManifest.xml”, queacabamos de criar três classes que na verdade são Atividades(Activitys) a serem executadas pela aplicação Android. Para issocarregue o arquivo “AndroidManifest.xml” e em seguida, clique 217
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresna guia “AndroidManifest.xml” e dentro do seu código antes datag </application>, insira o seguinte bloco de instruções abaixo:<activity android:name=".Activity1"android:label="@string/app_name"></activity><activity android:name=".Activity2"android:label="@string/app_name"></activity><activity android:name=".Activity3"android:label="@string/app_name"></activity>O código acima fará com que o Android reconheça as trêsclasses criadas como Atividades.Agora sim podemos executar a nossa aplicação. Veja o resultadoda execução na figura abaixo: Aplicação baseada em páginas em execução218
  • Luciano Alves da Silva8) Trabalhando com menus em uma aplicaçãoT ambém em uma aplicação Android é possível adicionar menus em uma aplicação. Os menus são visualizados quando pressionamos o botão “Menu” do emulador.Vamos a um exemplo, crie um novo projeto com os seguintesdados abaixo:Project Name: ExemploMenusPackage Name : br.com.appmenuCreate Activity: AppMenuApplication Name: Exemplo com menusMin SDK Version: 7Carregue o arquivo “main.xml“ e modifique o conteúdo daTextView com a seguinte frase: “Clique no botão menu para veras opções”.Seguindo o passo acima a aplicação deve estar de acordo com afigura abaixo:Seguindo o passo acima a aplicação deve estar de acordo com afigura abaixo: 219
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da tela de aplicaçãoNo arquivo “AppMenu.java”, coloque o seguinte código abaixo:package br.com.appmenu;import android.app.Activity;import android.os.Bundle;import android.view.*;public class AppMenu extends Activity { private static final int GRAVAR = Menu.FIRST; private static final int EDITAR = Menu.FIRST+1; private static final int SAIR = Menu.FIRST+2;220
  • Luciano Alves da Silva @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu){ menu.add(0, GRAVAR, 0, "Gravar"); menu.add(0, EDITAR, 0, "Editar"); menu.add(0, SAIR, 0, "Sair"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case GRAVAR: //Executa algo return true; case EDITAR: //Executa algo return true; default: return super.onOptionsItemSelected(item); } } 221
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores} .Vamos à explicação do código. Nas linhas : private static final int GRAVAR = Menu.FIRST; private static final int EDITAR = Menu.FIRST+1; private static final int SAIR = Menu.FIRST+2;São criadas três constantes que descrevei a seguir. A constante“GRAVAR”, recebe o valor contido no campo “FIRST”, doobjeto Menu , que normalmente é o valor “1”. Logo, asconstantes “EDITAR” e ”SAIR” recebem, respectivamente osvalores 2 e 3.Agora vamos analisar o método onCreateOptionsMenu. Essemétodo é responsável por criar os menus e adicioná-los àaplicação. Vamos analisar as instruções abaixo: menu.add(0, GRAVAR, 0, "Gravar"); menu.add(0, EDITAR, 0, "Editar"); menu.add(0, SAIR, 0, "Sair");Elas são responsáveis por adicionar os menus “Gravar”,”Editar”e “Sair”.222
  • Luciano Alves da SilvaToda vez que um item de menu é selecionado, o métodoonOptionsItemSelected é disparado. Vamos ver o código deleabaixo: @Override public boolean onOptionsItemSelected(MenuItemitem) { switch (item.getItemId()) { case GRAVAR: //Executa algo return true; case EDITAR: //Executa algo return true; default: return super.onOptionsItemSelected(item); } }Vamos analisar o código desse método. Observe que naestrutura switch é avaliado o valor retornado pelo métodogetItemId(), do objeto “item”. Esse método retorna o “Id” domenu selecionado, que é representado pelas constantes, comopode ser observado na estrutura switch.Vamos executar a nossa aplicação. O resultado você vê nafigura abaixo: 223
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Aplicação que demonstra do uso de menus em execuçãoTambém é possível adicionar sub-menus a um determinadomenu. Vamos a um outro exemplo, agora utilizando os sub-menus. Vamos modificar todo o código do arquivo“AppMenu.java” , pelo novo código abaixo:package br.com.appmenu;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;public class AppMenu extends Activity { private static final int ABRIR = Menu.FIRST; private static final int SALVAR =224
  • Luciano Alves da Silva Menu.FIRST+1; private static final int FERRAMENTAS = Menu.FIRST+2; private static final int PERSONALIZAR = Menu.FIRST+3; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, ABRIR, 0, "Abrir"); menu.add(0, SALVAR, 0, "Salvar"); SubMenu outros = menu.addSubMenu("Outros"); outros.add(0, FERRAMENTAS, 0, "Ferramentas"); outros.add(0, PERSONALIZAR, 0, "Personalizar"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case ABRIR: //Executa algo return true; 225
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores case SALVAR: //Executa algo return true; case FERRAMENTAS: //Executa algo return true; case PERSONALIZAR: //Executa algo return true; default: return super.onOptionsItemSelected (item); } }}Vamos analisar as mudanças. Observe que nesse novo código eucriei quatro constantes, conforme mostra as instruções abaixo:private static final int ABRIR = Menu.FIRST;private static final int SALVAR = Menu.FIRST+1;private static final int FERRAMENTAS =Menu.FIRST+2;private static final int PERSONALIZAR =Menu.FIRST+3;Agora vamos ver as mudanças feitas no métodoonCreateOptionsMenu. Veja as instruções abaixo: menu.add(0, ABRIR, 0, "Abrir"); menu.add(0, SALVAR, 0, "Salvar");226
  • Luciano Alves da Silva SubMenu outros = menu.addSubMenu("Outros"); outros.add(0, FERRAMENTAS, 0,"Ferramentas"); outros.add(0, PERSONALIZAR, 0,"Personalizar");Observando o código acima, são criados dois menus: Um menuchamado “Abrir” e um outro chamado “Salvar”.Depois de criar os dois menus eu crio logo em seguida um sub-menu , cujo rótulo é “Outros” e dentro desse sub-menu adicionodois itens, um chamado “Ferramentas” e “Personalizar”.Vamos executar a nossa aplicação. O resultado você vê nafigura abaixo:Aplicação que demonstra do uso de menus em execução 227
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSelecione a opção “Outros”, como mostra a figura acima, e serámostrado mais dois itens : “Ferramentas” e ”Personalizar”.Veja a figura abaixo: Usando submenus228
  • Luciano Alves da Silva9 ) Conhecendo as caixas de diálogo do AndroidN os já usamos, em alguns dos nossos programas anteriores, a classe AlertDialog responsável por mostrar as mensagens na tela do dispositivo. Mas agora vamosentender melhor essa classe e algumas outras, enfatizando aquialguns métodos interessantes.9.1) A classe AlertDialogJá trabalhamos com essa classe nos programas anteriores. Agoravamos conhecer alguns métodos existentes dessa classe: Métodos Descrição Neste método, você setIcon(int IconId) define um ícone para a sua caixa de diálogo. Neste método, você setMessage(CharSequence define a mensagem mensagem) que será exibida na caixa de diálogo. Neste método, você setTitle(CharSequence titulo) define o título que será exibido na caixa de diálogo. Neste método você define um botão setNeutralButton(CharSequence <rotulo do botão>, neutro (normalmente OnClickListener evento) rotulado com o título “OK”) e um evento, caso ele seja clicado. 229
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Neste método você define um botão setPositiveButton(CharSequence <rotulo do botão>, positivo DialogInterface.OnClickListener (normalmente evento) rotulado com o título “Sim” ou “Yes”) e um evento, caso ele seja clicado. Neste método você define um botão setNegativeButton(CharSequence <rotulo do botão>, negativo(normalmente DialogInterface.OnClickListener rotulado com o título evento) “Não” ou “No”) e um evento, caso ele seja clicado.Veja alguns exemplos abaixo: AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setMessage("Cadastro efetuado comsucesso."); dialog.setNeutralButton("OK", null); dialog.setTitle("Aviso"); dialog.show();O resultado será :230
  • Luciano Alves da Silva AlertDialog com o botão OKOutro Exemplo:AlertDialog.Builder dialog = newAlertDialog.Builder(this);dialog.setMessage("Deseja cadastrar esse registro?");dialog.setPositiveButton("Sim", newDialogInterface.OnClickListener(){ public void onClick(DialogInterface di, int arg) { //Executa algo se o botão "Sim" por pressionado } });dialog.setNegativeButton("Não", newDialogInterface.OnClickListener(){ public void onClick(DialogInterface di, int arg) { //Executa algo se o botão "Não" por pressionado 231
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores } }); dialog.setTitle("Aviso"); dialog.show();O resultado será : AlertDialog com botões SIM e NÃOMais um exemplo :AlertDialog.Builder dialog = newAlertDialog.Builder(this);dialog.setMessage("Exemplo com ícone.");dialog.setNeutralButton("OK", null);dialog.setTitle("Ícone");dialog.setIcon(R.drawable.icon);dialog.show();O resultado será:232
  • Luciano Alves da Silva AlertDialog com o botão OK e com íconeÉ possível também na classe AlertDialog.Builder trabalharmoscom lista de itens (como no ListView) e também com opções(como no RadioButton).Vou demonstrar aqui como trabalhar com lista de itens. Veja ocódigo abaixo:AlertDialog.Builder d = newAlertDialog.Builder(AppAlert.this);final String[] opcoes={"Azul","Amarelo","Vermelho"};d.setTitle("Escolha uma opção");d.setItems(opcoes, newDialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, intitem) { switch (item) { 233
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores case 0: //EXECUTA OPERAÇÃO SE SELECIONOUA OPÇÃO AZUL case 1: //EXECUTA OPERAÇÃO SE SELECIONOUA OPÇÃO AMARELO case 2: //EXECUTA OPERAÇÃO SE SELECIONOUA OPÇÃO VERMELHO } }});d.show();Vamos analisar algumas linhas de código acima. Observe quecriei uma constante de array de String chamada opcoes, com trêsvalores, como é demonstrado abaixo:final String[] opcoes={"Azul","Amarelo","Vermelho"};Para criar a lista de itens na caixa de diálogo, foi preciso usar ométodo setItems que possui dois parâmetros :no primeiro, vocêpassa o array de itens a serem selecionados ; no segundo vocêdefine um evento onClick, que será disparado toda vez que umdeterminado item for selecionado. Vamos analisar o eventoonClick:public void onClick(DialogInterface dialog, intitem) { switch (item) { case 0: //EXECUTA OPERAÇÃO SE SELECIONOUA OPÇÃO AZUL case 1: //EXECUTA OPERAÇÃO SE SELECIONOUA OPÇÃO AMARELO234
  • Luciano Alves da Silva case 2: //EXECUTA OPERAÇÃO SE SELECIONOUA OPÇÃO VERMELHO } }});O método onClick possui dois parâmetros : o primeirocorresponde a instância da caixa de diálogo e o segundoparâmetro corresponde ao índice do item selecionado.Veja o resultado abaixo: AlertDialog com o lista de opçõesAgora vamos trabalhar com itens de opções , como noRadioButton. Veja o código abaixo: AlertDialog.Builder d = newAlertDialog.Builder(AppAlert.this); final String[] opcoes={"Azul","Amarelo","Vermelho"}; 235
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores d.setTitle("Escolha uma opção"); d.setSingleChoiceItems(opcoes, -1, newDialogInterface.OnClickListener() { @Override public void onClick(DialogInterfacedialog, int item) { switch (item) { case 0: //EXECUTA OPERAÇÃO SESELECIONOU A OPÇÃO AZUL case 1: //EXECUTA OPERAÇÃO SESELECIONOU A OPÇÃO AMARELO case 2: //EXECUTA OPERAÇÃO SESELECIONOU A OPÇÃO VERMELHO } } }); d.show();Bom, vamos analisar o código acima. Observe que para utilizaro recursos de itens de opção foi necessário usar o métodosetSingleChoiceItems, que possui três parâmetros : noprimeiro, você passa o array de itens a serem selecionados ; nosegundo, você define a opção que já será por default ao abrir acaixa de diálogo através do seu índice, neste caso definimoscomo -1 ou seja, nenhuma opção padrão será selecionada ; noterceiro você define um evento onClick, que será disparado todavez que um determinado item for selecionado. O restante docódigo já foi explicado anteriormente.Veja o resultado na figura abaixo:236
  • Luciano Alves da Silva AlertDialog com o lista RadioButons9.2) A classe DatePickerDialogSe lembra daquele componente que nós trabalhamos oDatePicker ? Pois bem, ele também existe na sua forma decaixa de diálogo, o DatePickerDialog. Vamos ver umademonstração do uso dessa caixa de diálogo. DatePickerDialog.OnDateSetListener mudarData =new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker dialog, intyear, int monthOfYear, int dayOfMonth) { //ESSE MÉTODO SEMPRE SERÁ EXECUTADO TODAVEZ QUE UMA DATA FOR SELECIONADA } }; DatePickerDialog dp = newDatePickerDialog(AppAlert.this,mudarData,2010,6,24); 237
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores dp.setTitle("Selecione a data"); dp.show();Bom, vamos analisar o código acima. Observe que a primeiracoisa que faço é criar uma instância da interfaceOnDateSetListener, que será representado pela variávelmudarData. Nesta interface existe um método chamadoonDateSet, que possui quatro parâmetros : no primeiro vocêtem a instância da caixa de diálogo , no segundo você tem o ano,no terceiro você tem o mês (não se esqueça daquele detalhe:primeiro mês número zero, segundo mês número um e assim pordiante), e no quatro e ultimo parâmetros temos o dia do mês.Na linha abaixo:DatePickerDialog dp = newDatePickerDialog(AppAlert.this,mudarData,2010,6,24);Crio a instância do objeto DatePickerDialog. Esta classepossui 5 parâmetros : o primeiro faz referencia à atividade emexecução ; o segundo faz referência a interface que serádisparada quando a data for selecionada, que está sendorepresentada pela variável mudarData ; no terceiro parâmetroespecificamos o ano no quarto o mês e no último, o dia.Veja o resultado abaixo:238
  • Luciano Alves da Silva Exemplo usando DatePickerDialog9.3) A classe TimePickerDialogSe lembra daquele componente que nós trabalhamos oTimePicker ? Pois bem, ele também existe na sua forma decaixa de diálogo, o TimePickerDialog. Vamos ver umademonstração do uso dessa caixa de diálogo.TimePickerDialog.OnTimeSetListener mudarHora = newTimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view,int hourOfDay, int minute) { //ESTE MÉTODO SERÁ EXECUTADO QUANDO AHORA FOR SELECIONADA } }; 239
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores TimePickerDialog tp = new TimePickerDialog(AppAlert.this,mudarHora,10,10,false); tp.setTitle("Selecione a hora"); tp.show();Bom, vamos analisar o código acima. Observe que a primeiracoisa que faço é criar uma instância da interfaceOnTimeSetListener, que será representado pela variávelmudarHora. Nesta interface existe um método chamadoonTimeSet, que possui três parâmetros : no primeiro você tem ainstância do objeto TimePicker ; no segundo parâmetro nóstemos a hora e no terceiro parâmetro, nós temos os minutos. Na linha abaixo: TimePickerDialog tp = new TimePickerDialog(AppAlert.this,mudarHora,10,10,false);Crio a instância do objeto DatePickerDialog. Esta classepossui 5 parâmetrros : o primeiro faz referencia à atividade emexecução ; o segundo faz referência a interface que serádisparada quando a hora for selecionada, que está sendorepresentada pela variável mudarHora ; no terceiro parâmetroespecificamos a hora ; no quarto especificamos o minuto e noúltimo, especificamos se a hora será vista no formato 24 horas(true) ou não (false).Veja o resultado abaixo:240
  • Luciano Alves da Silva Exemplo usando TimePickerDialog9.4) A classe ProgressDialogSe lembra daquele componente que nós trabalhamos oProgressBar ? Pois bem, ele também existe na sua forma decaixa de diálogo, o ProgressDialog. Vamos ver umademonstração do uso dessa caixa de diálogo. ProgressDialog pd = newProgressDialog(AppAlert.this); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setTitle("Carregando..."); pd.setMessage("Carregando dados, aguarde..."); pd.show(); 241
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Vamos analisar as instruções acima. As linhas: ProgressDialog pd = newProgressDialog(AppAlert.this); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);Cria uma instância da classe ProgressDialog e em seguidaespecifica o estilo da progress bar, que neste caso é um estilo“Spinner”. As instruções seguintes já são conhecidas. Veja oresultado abaixo: Exemplo usando ProgressDialogQuando a ProgressDialog é exibida na tela , não existe um botãode “OK” para encerrar a sua exibição. Então, como fazemospara “sumir” ele da tela ? Existem duas formas : A primeiraforma é pressionando a tela “ESC” , dando a entender que vocêquis cancelar um processo em andamento. A segunda forma échamar o método “dismiss” da classe ProgressDialog. Como ?Considerando a variável pd do tipo ProgressDialog : pd.dismiss();242
  • Luciano Alves da SilvaEste método é utilizado quando um determinado processo emandamento, indicado pela exibição da ProgressDialog na tela éfinalizado. Vamos supor que uma mensagem desse tipo indica odownload de um arquivo, após o termino do download, essemétodo deve ser chamado, fechando a caixa de diálogo,indicando fim do processo.Também é possível trabalharmos com uma barra de progressono estilo horizontal. Veja uma demonstração abaixo:Declarando a seguintes variáveis abaixo como globais: ProgressDialog pd; Thread t; Handler h; int i; Agora dentro de um método qualquer: pd = new ProgressDialog(AppAlert.this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setTitle("Carregando...");pd.setMessage("Carregando dados, aguarde...");pd.setMax(100);pd.setProgress(0);pd.show(); 243
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores h = new Handler(); t = new Thread(new Runnable(){ @Override public void run() { while(i < 100){ try { i++; h.post(new Runnable(){ @Override public void run() { pd.setProgress(i); if(i==100) pd.dismiss(); } }); Thread.sleep(100); }catch(Exception e) { } } } }) ; t.start(); Veja o resultado dessa execução na figura abaixo:244
  • Luciano Alves da Silva Exemplo usando ProgressDialog9.5) Criando uma caixa de diálogo personalizadaAcabamos de ver agora os diversos tipos de caixas de diálogoque o Android nos oferece. Agora, se eu quisesse criar umacaixa de diálogo minha personalizada como por exemplo, umacaixa de diálogo para o usuário preencher um campo com umadeterminada informação. Pois bem, o Android também nospermite fazermos isso. Do mesmo jeito que utilizamos osarquivos XML para definirmos a tela da nossa aplicação,podemos utilizá-los para definir uma caixa de diálogo nossapersonalizada.Para demonstrar esse exemplo, suponhamos um arquivo XMLchamado “mensagem.xml”, com a estrutura principalconfigurada segundo os dados abaixo:LinearLayout Propriedade Valor Id @+id/mensagem Layout height fill_parent 245
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout width fill_parent Padding 10dp Orientation verticalDentro da estrutura acima, vamos supor os seguintescomponentes:TextView Propriedade Valor Text Digite o número da matriculaEditText Propriedade Valor Id @+id/edmatricula Layout width fill_parent TextButton Propriedade Valor Id @+id/btok Layout width fill_parent Text OK246
  • Luciano Alves da SilvaAgora, em um método qualquer:Dialog d = new Dialog(AppAlert.this); d.setContentView(R.layout.mensagem); d.setTitle("Matricula");d.show(); Exemplo de uma caixa de diálogo personalisada 247
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores10) Programação com internet em AndroidA qui nesta seção irei mostrar como fazer algumas aplicações em Android voltadas para a internet, envolvendo aqui programação com Sockets , envio erecebimento de dados para uma página Web, download dearquivos e etc.10.1) Trabalhando com sockets em AndroidO que são sockets ou soquetes ?Os sockets são conexões de internet que são especificadas pelosprotocolos TCP/IP, ou melhor, são endereços de nós e umnúmero de porta, os quais identificam um serviço.Como funciona ?1) Primeiro, o programa servidor começa a ser executadoesperando por um pedido do cliente.2) O programa cliente requisita uma conexão indicando oservidor com o qual quer se conectar.3) Quando o cliente envia um pedido, o servidor pode “aceitar”a conexão, e inicia um “soquete” no lado servidor e dedica essesoquete para essa conexão cliente especifica.248
  • Luciano Alves da SilvaTodo computador ou dispositivo conectado a internet pode seracessado qualquer outro computador ou dispositivo,e elespodem estar atuando como cliente (que requisita uma conexão)ou servidor (negando ou aceitando essa conexão).A idéia aqui e criar um cliente , que será uma aplicação emAndroid onde ela irá requisitar um serviço no servidor, que seráuma aplicação em Java. A aplicação cliente será umacalculadora onde ela envia dois números para o servidor, queserá responsável por retornar a soma dos dois números para ocliente. Existem duas classes Java utilizadas aqui para trabalharcom sockets que são ServerSocket (usada no lado servidor) eSocket (usada no lado cliente).10.2) Desenvolvendo uma aplicação cliente em Android e umservidor Java.A classe ServerSocket é utilizada para “escutar” as conexõesclientes que vem da rede. Bom, vamos criar uma aplicação“Servidor” para receber as requisições da aplicação cliente doAndroid. Vá no menu “File”/”New”/”Java Project” e será umacaixa de diálogo para a criação da projeto. No campo “ProjectName” , digite “AplicacoesJava” e depois, clique no botão“Finish”.Expanda o item “AplicacoesJava” e selecione a pasta “src”,conforme a figura abaixo: Pasta “AplicacoesJava” expandida 249
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAgora vamos criar uma nova classe Java, indo no menu“File”/”New”/”Class”. No campo name digite “ServidorCalc” emarque a opção “public static void main(String arg[])”,conforme a figura abaixo: Criando uma nova classeAgora, adicione o código abaixo:import java.net.*;import java.io.*;public class ServidorCalc {250
  • Luciano Alves da Silvapublic static void main(String[] args) { double num1,num2; try { ServerSocket ss = new ServerSocket(60); System.out.print("Aguardando conexao...nn"); Socket s = ss.accept(); System.out.print("Conexao aceita...nn"); DataInputStream in = new DataInputStream(s.getInputStream()); DataOutputStream out = new DataOutputStream(s.getOutputStream()); num1 = in.readDouble(); num2 = in.readDouble(); System.out.println(num1 + "+" + num2 + "=" + (num1 + num2)); out.writeDouble((num1 + num2)); in.close(); out.close(); s.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } } 251
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores}Vamos ao comentário de algumas linhas de código. A linha :ServerSocket ss = new ServerSocket(60);Cria uma instância na classe ServerSocket, passando comoparâmetro do construtor, o número da porta pela qual, o socketirá escutar as conexões clientes, que será 60. A linha: Socket s = ss.accept();Nesta linha acontece o seguinte, o objeto ss chama o métodoaccept, que é responsável por aguardar uma conexão cliente quevirá na porta 60. Enquanto nenhuma conexão vir, essa linhaficará “pendurada” , ou seja, ficará aguardando uma conexãocliente até que venha a conexão. Quando vier uma conexão, areferência do cliente será referência pela variável s, do tipoSocket. Nas instruções abaixo : DataInputStream in = newDataInputStream(s.getInputStream()); DataOutputStream out = newDataOutputStream(s.getOutputStream());São criados dois objetos. O primeiro objeto se chama in, do tipoDataInputStream, que é uma classe responsável por receberdados que vem de uma conexão. O segundo objeto se chamaout, do tipo DataOutputStream, que é uma classe responsávelpor enviar dados para uma conexão.252
  • Luciano Alves da Silva Nas instruções : num1 = in.readDouble(); num2 = in.readDouble();Ocorre o seguinte : as variáveis num1 e num2 recebem osnúmeros que são enviados pelo cliente, pelo métodoreadDouble.A instrução: out.writeDouble((num1 + num2));Envia para a aplicação cliente, a soma dos dois números, pelométodo writeDouble. As instruções: in.close(); out.close(); s.close(); ss.close();Fecha todas as conexões.Bom, agora salve o arquivo, mas não o execute. Iremos executaresse arquivo fora do eclipse. Quando salvamos um arquivo, se asintaxe dele estiver correta, o eclipse “automaticamente”compila o arquivo. Agora vamos copiar esse executável para aunidade “C”. Onde esse executável se encontra ? quandoexecutamos o eclipse pela primeira vez, ele pede um diretóriopara trabalho (workspace). Automaticamente ele já sugere um, 253
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresmas você pode mudá-lo. Provavelmente você deve ter feito umadessas opções.Agora, você lembra qual é o diretório que você selecionou paraworkspace? Se você não se lembra, faça o seguinte : Vá nomenu “File”/”Switch Workspace”/”Other...”, e será mostrada acaixa de diálogo abaixo: Definindo um workspaceAgora se lembrou né ? Simplesmente cancele a caixa de diálogomostrada na figura acima e vá no diretório especificado.Dentro do diretório “AplicacoesJava”, existe um diretóriochamado “bin”, onde estão armazenados todos os executáveisdo Java (arquivos “.class”).Agora, vá no “prompt” do comando e vamos executar essaclasse.Como ?A minha classe se encontra no seguinte caminho:"F:LucianoProgramaçãoJavaAplicacoesJavabin"254
  • Luciano Alves da SilvaQuando eu for executar a minha, será assim:java –cp "F:LucianoProgramaçãoJavaAplicacoesJavabin"ServidorCalcVeja um exemplo na figura abaixo: Aplicação servidor em execuçãoVocê vai “minimizar” essa janela, deixando o servidor emexecução. Agora vamos criar a nossa aplicação cliente emAndroid.Crie um novo projeto com os seguintes dados abaixo:Project Name: AndClientePackage Name : br.com.appclienteCreate Activity: AppCliente 255
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresApplication Name: ClienteMin SDK Version : 7Após criar o projeto, carregue o layout do arquivo “main.xml” eem seguida selecione o TextView já inserido na tela emodifique o conteúdo do texto para “Primeiro número”.Depois de fazer o que foi pedido acima, insira os seguintescomponentes, na sequência:EditText Propriedade Valor Id @+id/txtnum1 Layout width fill_parent TextTextView Propriedade Valor Text Segundo númeroEditText Propriedade Valor Id @+id/txtnum2 Layout width fill_parent Text256
  • Luciano Alves da SilvaButton Propriedade Valor Id @+id/btsomar Layout width fill_parent Text SomarDepois de seguir os passos acima, a tela da nossa aplicaçãodeverá estar de acordo com a figura abaixo: Layout da tela da aplicaçãoAgora salve o arquivo para confirmar as alterações feitas.Agora, no arquivo “AppCliente.java”, coloque o seguinte códigoabaixo: 257
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorespackage br.com.appcliente;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import android.widget.*;import android.view.*;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;public class AppCliente extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btsomar = (Button) findViewById(R.id.btsomar); btsomar.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { try { Socket s = new Socket("10.0.2.2",60); DataInputStream in = new258
  • Luciano Alves da Silva DataInputStream(s.getInputStream()); DataOutputStream out = new DataOutputStream(s.getOutputStream()); TextView txtnum1,txtnum2; txtnum1 = (TextView) findViewById(R.id.txtnum1); txtnum2 = (TextView) findViewById(R.id.txtnum2); out.writeDouble(Double.parseDouble( txtnum1.getText().toString())); out.writeDouble(Double.parseDouble( txtnum2.getText().toString())); AlertDialog.Builder d = new AlertDialog.Builder(AppCliente.this); d.setTitle("Soma"); d.setMessage("Soma:" + String.valueOf(in.readDouble())); d.setNeutralButton("OK", null); d.show(); in.close(); out.close(); s.close();} catch (Exception e) { 259
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores e.printStackTrace(); } } }); }}Vamos a explicação de algumas partes de código desseprograma. A linha: Socket s = new Socket("10.0.2.2",60);Cria uma instância da classe Socket, passando como parâmetrosno construtor o endereço IP do nosso servidor e a porta pelaqual nós iremos se comunicar. Espere, o endereço IP localnormalmente não é 127.0.0.1 ou localhost? Sim, mas sepassássemos como parâmetro o IP 127.0.0.1 ou localhost nósestaríamos se comunicando com o emulador e não com ocomputador que está com o servidor em execução. No Android,todo endereço IP local de um computador é referenciado pelo IP10.0.2.2, que é um endereço local de rede.As instruções : out.writeDouble(Double.parseDouble( txtnum1.getText().toString())); out.writeDouble(Double.parseDouble( txtnum2.getText().toString()));260
  • Luciano Alves da SilvaEnviam para o servidor, os números a serem somados, pelométodo writeDouble. A instrução :d.setMessage("Soma:" +String.valueOf(in.readDouble()));Chama o método readDouble, responsável por receber a somaenviada pelo servidor, convertendo-a para um tipo String, paraque possa ser exibido na mensagem.Agora vamos fazer uma última modificação. Abra o arquivo“AndroidManifest.xml” e em seguida, clique na guia“AndroidManifest.xml” e antes da tag “</manifest>”, coloque aseguinte linha:<uses-permissionandroid:name="android.permission.INTERNET" />Para que isso ? Toda aplicação Android que por acaso venha ausar uma conexão internet ou local, é obrigado a ter essa linha,caso contrário, a aplicação não funcionará.Vamos executar a nossa aplicação. O resultado você vê nafigura abaixo: 261
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Aplicação cliente Android em execuçãoExperiente digitar dois números quaisquer e depois, clique nobotão “Somar”. Será exibida uma mensagem com o valor dasoma, como mostra um exemplo da figura abaixo: Aplicação cliente Android em execução262
  • Luciano Alves da SilvaLembra-se que eu pedi para que você deixasse minimizadoaquela janela de prompt , pela qual executamos o servidor ?Maximize-a e veja o que aconteceu, como mostra a figuraabaixo: Aplicação servidor em execução: ResultadoO servidor aceitou a conexão, recebeu os dois números e osenviou de volta para o cliente Android.10.3) Obtendo conteúdo de uma URLAgora irei mostrar como desenvolver uma aplicação que obtémum conteúdo de uma determinada URL, que será especificadaatravés da aplicação.Para que esse exemplo funcione, verifique as configurações doseu Firewall, caso contrário, essa aplicação não funcionará.Crie um novo projeto com os seguintes dados abaixo: 263
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresProject Name: ObtendoConteudoURLPackage Name : br.com.appcontentCreate Activity: AppContentMin SDK Version: 7Application Name: Obtendo conteúdo de uma URLApós criar o projeto, carregue o layout do arquivo “main.xml” eem seguida selecione o TextView já inserido na tela emodifique o conteúdo do texto para “Digite sua URL”.Depois de fazer o que foi pedido acima, insira os seguintescomponentes, na sequência:EditText Propriedade Valor Id @+id/edurl Layout width fill_parent TextButton Propriedade Valor Id @+id/btmostrar Layout width fill_parent Text Mostrar264
  • Luciano Alves da SilvaSeguindo os passos acima, o layout da aplicação deve estar deacordo com a figura abaixo: Layout da tela da aplicaçãoAgora, vá no arquivo “AppContent.java”, coloque o seguintecódigo abaixo:package br.com.appcontent;import android.app.Activity;import android.os.Bundle;import android.widget.*;import android.view.*;import android.app.*;import java.io.*;import java.net.*;public class AppContent extends Activity { 265
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores EditText edurl; Button btmostrar; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); edurl = (EditText) findViewById(R.id.edurl); btmostrar = (Button) findViewById(R.id.mostrar); btmostrar.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { try { String strurl = edurl.getText().toString(); URL url = new URL(strurl); InputStream is = url.openStream(); int i; String conteudo=""; while((i = is.read()) != -1) conteudo+= ((char)i); AlertDialog.Builder dialogo = new AlertDialog.Builder(AppContent.this);266
  • Luciano Alves da Silva dialogo.setMessage(conteudo); dialogo.setTitle("Conteúdo"); dialogo.setNeutralButton("OK", null); dialogo.show(); }catch(Exception e) { } } }); } }Agora vamos analisar o programa. Nesse programa existe umEditText, através do qual irei digitar uma URL de minhaescolha para obter o seu conteúdo (que pode ser de página Webou um arquivo de texto simples) e um botão que seráresponsável por “obter” o conteúdo dessa URL. Vamos analisaro código do evento desse botão responsável por obter oconteúdo da URL.A linha: String strurl = edurl.getText().toString();Cria uma variável do tipo String chamada strurl , que ira contera URL digitada pelo usuário.A linha: URL url = new URL(strurl); 267
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresCria uma instância da classe URL, responsável por acessar umadeterminada URL. Neste caso, a URL está contida dentro davariável strurl.A linha :InputStream is = url.openStream();Retorna para a variável chamada is, do tipo InputStream, ofluxo obtido pela URL, através do método openStream. Ocódigo: while((i=is.read())!= -1) s+=(char) i;Joga para a variável s, do tipo String, o conteúdo da URL.Só para lembrar que para executar essa aplicação, não seesqueça da linha abaixo no arquivo “AndroidManifest.xml”:<uses-permissionandroid:name="android.permission.INTERNET" />Execuque a aplicação. Veja o resultado de sua execução abaixo:268
  • Luciano Alves da Silva Aplicação em execuçãoComo havia falado, você pode experimentar uma outra URL,porém, é muito provável páginas muito grandes faça com que aaplicação não responda ou talvez, você se depare com um errode execução pois, um conteúdo muito grande de uma URL nãoseja talvez “comportado” pela caixa de diálogo (e também , pelavariável s).10.4) Enviando informações para uma página Web via URLUtilizando os mesmos conceitos do programa anterior, vamosconstruir uma aplicação Android que envia informações viaURL para uma determinada página Web.Para esse exemplo, desenvolvi uma página PHP no meu site(MakeWare) para que ele possa receber os dados enviados pornossa aplicação. A aplicação consiste em um cadastro onde os 269
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresdados serão armazenados em uma página Web, e esses dadosserão passados via URL para o site.Crie um novo projeto com os seguintes dados abaixo:Project Name: EnviandoDadosAndroidPackage Name : br.com.appsendCreate Activity : AppSendApplication Name Enviando DadosMin SDK Version: 7Após criar o projeto, carregue o layout do arquivo “main.xml” eem seguida selecione o TextView já inserido na tela emodifique o conteúdo do texto para “Nome:”. Em seguidacoloque os seguintes componentes , na sequência:EditText Propriedade Valor Id @+id/ednome Layout width fill_parent TextTextView Propriedade Valor Text Idade:270
  • Luciano Alves da SilvaEditText Propriedade Valor Id @+id/edidade Layout width fill_parent TextButton Propriedade Valor Id @+id/btenviar Layout width fill_parent Text Enviar dadosSeguido os passos acima, a tela da nossa aplicação deve estar deacordo com a figura abaixo: Layout da tela da aplicaçãoAgora no arquivo “AppSend.java” coloque o seguinte códigoabaixo: 271
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorespackage br.com.appsend;import java.io.*;import java.net.*;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;public class AppSend extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.btenviar); b.setOnClickListener(newView.OnClickListener(){ public void onClick(View v) { TextView txtnome = (TextView)findViewById(R.id.nome); TextView txtidade = (TextView)findViewById(R.id.idade);272
  • Luciano Alves da Silva String nome =txtnome.getText().toString(); String idade =txtidade.getText().toString(); //Substitui todos os caracteres especiais nome = URLEncoder.encode(nome); try { //Envia dados , via URL URL url = newURL("http://www.makeware.ueuo.com/cadastrar_dados.php?nome=" + nome + "&idade=" + idade); //Executa a requisição url.openStream(); AlertDialog.Builder d = newAlertDialog.Builder(AppSend.this); d.setMessage("Dados enviados comsucesso."); d.setNeutralButton("OK", null); d.setTitle("Resultado"); d.show(); }catch(Exception e) { AlertDialog.Builder d = newAlertDialog.Builder(AppSend.this); d.setMessage(e.toString()); d.setNeutralButton("OK", null); 273
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores d.setTitle("Erro"); d.show(); } } }); }}O código dessa aplicação é similar ao da aplicação anterior,então não há muitos comentários a ser fazer dessa aplicaçãoporém,há algumas linhas de código que preciso explicar.Observe que passamos os parâmetros nome e idade para a URLcerto ? A idade é um valor numérico simples , já o nome é umconjunto formado por vários caracteres comuns e especiais.Quando passamos parâmetros para uma URL, nessa URL nãopode HAVER caracteres especiais , para isso fiz uso do métodoencode da classe URLEncoder, responsável por converter essescaracteres especiais em seus respectivos valores hexadecimais,que são aceitos pela URL, conforme mostro abaixo:nome = URLEncoder.encode(nome);Executar a aplicação. O resultado você confere na figura abaixo:274
  • Luciano Alves da Silva Aplicação de envio de dados em execução10.5) Enviando informações para uma página Web viaPOST (Usando a classe HttpPost)Desenvolvemos uma aplicação que enviava dados para oservidor, através de sua URL (Método GET). Agora vamosdesenvolver um aplicação similar ao da aplicação anterior, sóque agora, essa aplicação fará uso do método POST, conseguidoatravés da classe HttpPost, do Android.10.5.1) Diferenças entre GET e POSTPara muitos programadores os métodos GET e POST sãométodos que executam ações diferentes uma das outras, o quenão é verdade. Os métodos GET e POST tem a mesmafinalidade, que é o de enviar dados para uma página Web. Adiferença está no “método de envio” deles. Vamos citá-los: 275
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresO método GET envia dados para o servidor utilizando comomeio de trafego desses dados, a URL de onde se encontra oservidor. Por exemplo: quero enviar para meu servidor doisnúmeros para serem processados por uma página Web. Pelofaríamos assim:http://www.meuservidor.com/calculadora.php?numero=12&numero2=13Observe que na URL acima, existe uma página que vaiprocessar os números que quero mandar pra ela, no caso, apágina “calculadora.php”. Observe que nessa página sãopassados dois parâmetros : “numero”, que recebe como valor 12e “numero2”, que recebe como valor 13. Esses dois parâmetrossão reconhecidos pela página “calculadora.php”, que fará oprocessamento deles.Uma das características do GET é que nesse método de envio,podemos “visualizar” os dados que são enviados para a paginano servidor, o que , em algumas ocasiões, não é seguro. Vamossupor que você enviasse via GET dados de nome e senha,facilmente esses dados seriam de alguma forma, capturados eusados de forma indevida.Uma outra característica do método GET está relacionado àlimitação de dados a serem enviados para uma página noservidor, pois, uma url suporta no máximo 2.000 caracteres. Porexemplo, vamos supor que eu construísse uma página de umfórum para que o usuário escrevesse seu tópico, com certeza,jamais conseguiria fazer isso usando o método de envio GET,pois páginas de fórum deste tipo, possuem mais de 2.000caracteres para serem enviados e processados.276
  • Luciano Alves da SilvaTodas essas desvantagens do GET podem ser solucionadasatravés do uso do método de envio POST. Com o métodoPOST, os dados enviados para uma página Web não sãovisualizados na URL do servidor, garantido assim que os dadosnão sejam capturados. E outra vantagem do POST é que vocêpode enviar dados sem limite de tamanho.10.5.2) Desenvolvendo a aplicaçãoBom, vamos desenvolver agora a nossa aplicação. Crie umprojeto Android com os seguintes dados abaixo:Project Name: EnviaDadosPostPackage Name : br.com.appsendpostCreate Activity: AppSendPostApplication Name: Enviando dadosMin SDK Version: 7Após criar o projeto, carregue o layout do arquivo “main.xml” eem seguida selecione o TextView já inserido na tela emodifique o conteúdo do texto para “Nome:”. Em seguidacoloque os seguintes componentes , na sequência:EditText 277
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Propriedade Valor Id @+id/ednome Layout width fill_parent TextTextView Propriedade Valor Text Idade:EditText Propriedade Valor Id @+id/edidade Layout width fill_parent TextButton Propriedade Valor Id @+id/btenviar Layout width fill_parent Text Enviar dadosSeguido os passos acima, a tela da nossa aplicação deve estar deacordo com a figura abaixo:278
  • Luciano Alves da Silva Layout da tela da aplicaçãoSe vocês notaram, a tela da aplicação a similar ao da aplicaçãoanterior que desenvolvemos.Agora no arquivo “AppSendPost.java”, coloque o seguintecódigo abaixo:package br.com.appsendpost;import java.io.*;import java.net.*;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;importorg.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;importorg.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import android.app.Activity;import android.app.AlertDialog; 279
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresimport android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;public class AppSendPost extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.btenviar); b.setOnClickListener(newView.OnClickListener(){ public void onClick(View v) { TextView txtnome = (TextView)findViewById(R.id.nome); TextView txtidade = (TextView)findViewById(R.id.idade); String nome = txtnome.getText().toString(); String idade = txtidade.getText().toString(); try { //Envia dados , via POST HttpClient httpclient = newDefaultHttpClient();280
  • Luciano Alves da Silva HttpPost httppost = newHttpPost("http://www.makeware.ueuo.com/cadastrar_dados.php"); List<NameValuePair> nameValuePairs = newArrayList<NameValuePair>(2); nameValuePairs.add(newBasicNameValuePair("nome",nome)); nameValuePairs.add(newBasicNameValuePair("idade",idade)); httppost.setEntity(newUrlEncodedFormEntity(nameValuePairs)); httpclient.execute(httppost); AlertDialog.Builder d = newAlertDialog.Builder(AppSendPost.this); d.setMessage("Dados enviados com sucesso"); d.setNeutralButton("OK", null); d.setTitle("Aviso"); d.show();}catch(Exception e) { AlertDialog.Builder d = newAlertDialog.Builder(AppSendPost.this); d.setMessage(e.toString()); d.setNeutralButton("OK", null); d.setTitle("Erro"); d.show(); } 281
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores } }); }}Se observarmos o código da aplicação acima é praticamente omesmo da última aplicação, porém, com algumas diferenças(que envolve o uso da classe HttpPost). Vamos aoscomentários:A linha abaixo: HttpClient httpclient = newDefaultHttpClient();Cria uma instância da classe HttpClient. Essa classe funcionacomo se fosse uma INTERFACE Cliente, que vai requisitardados do servidor.A linha abaixo:HttpPost httppost = newHttpPost("http://www.makeware.ueuo.com/cadastrar_dados.php");Cria uma instância da classe HttpPost, responsável por enviardados através do método POST. Observe que foi passado noparâmetro do seu construtor, o endereço da página que vaireceber os dados através desse método.A linha abaixo:282
  • Luciano Alves da Silva List<NameValuePair> nameValuePairs = newArrayList<NameValuePair>(2);Cria uma instância da classe List, que funciona como um Arraydinâmico que recebe valores. Os valores que serão armazenadosnesse Array são os valores que serão enviados pelo servidor,estruturados na classe NameValuePair. Observe que foipassado dois argumentos : o tipo de informação que seráarmazenado nesse Array (NameValuePair) e o valor 2, quecorresponde aos dois valores que serão enviados ao servidor,“nome” e “idade”.A instruções abaixo:nameValuePairs.add(newBasicNameValuePair("nome",nome)); nameValuePairs.add(newBasicNameValuePair("idade",idade));Adiciona no Array os dois valores que serão enviados para oservidor, “nome” e “idade”, cada um com seus respectivosvalores.A linha abaixo:httppost.setEntity(newUrlEncodedFormEntity(nameValuePairs));Prepara os dados a serem enviados para o servidor. A classeUrlEncodedFormEntity é responsável por codificar a estrutura 283
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores“nameValuePair” do tipo List , para que ela possa ser enviadapara o servidor.A linha abaixo:httpclient.execute(httppost);Envia os dados para o servidor através do método “execute”, daclasse HttpClient, passando como parâmetro, o objeto da classeHttpPost.Para finalizar, coloque essa linha no arquivo“AndroidManifest.xml”, antes da Tag </manifest>:<uses-permissionandroid:name="android.permission.INTERNET"/>Execute a aplicação. O resultado você confere na figuraseguinte: Aplicação em execução284
  • Luciano Alves da Silva10.6) Fazendo download de um arquivoAgora irei mostrar como realizar um download de um arquivo,que pode ser uma imagem, um arquivo texto e etc.Crie um novo projeto com os seguintes dados abaixo:Project Name: DownloadPackage Name : br.com.appdownloadCreate Activity: AppDownloadApplication Name: Exemplo de downloadMin SDK Version: 7Após criar o projeto, carregue o layout do arquivo “main.xml” ee apague o TextView já inserido na tela. Em seguida insira oscomponentes, na sequencia :Button Propriedade Valor Id @+id/btdownload Layout width fill_parent Text Baixar imagemTextView Propriedade Valor Text Imagem 285
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresImageView Propriedade Valor Id @+id/imagem Src Layout height wrap_content Layout width wrap_contentSeguindo os passos acima, a tela da nossa aplicação deve estarde acordo com a figura abaixo: Layout da tela da aplicaçãoNo arquivo “AppDownload.java”, coloque o seguinte códigoabaixo:package br.com.appdownload;import android.app.*;import android.app.AlertDialog.Builder;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;286
  • Luciano Alves da Silvaimport java.net.*;import java.io.*;public class AppDownload extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.btdownload); b.setOnClickListener(newView.OnClickListener(){ public void onClick(View v) { //Faz o download da imagem ImageView imagem = (ImageView)findViewById(R.id.imagem); try { URL url = newURL("http://10.0.2.2/icon.png"); InputStream is = url.openStream(); Bitmap bmp =BitmapFactory.decodeStream(is); imagem.setImageBitmap(bmp); } catch (Exception e) { 287
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores AlertDialog.Builder d = new AlertDialog.Builder(AppDownload.this); d.setMessage(e.toString()); d.setTitle("Aviso"); d.setNeutralButton("OK", null); d.show(); } } }); }}Vamos analisar algumas linhas de código. A maioria doscódigos desse programa já são conhecidos. A linha abaixo:Bitmap bmp = BitmapFactory.decodeStream(is);Cria o objeto do tipo Bitmap e carrega nele, o objetoInputStream, que contem o conteúdo da imagem baixada, noformato dele.Logo após o download da imagem, ela é visualizada, através docódigo abaixo:imagem.setImageBitmap(bmp);288
  • Luciano Alves da SilvaVamos executar a nossa aplicação. Veja a figura abaixo: Aplicação que faz downloads em execução10.7) O componente WebViewEsse componente WebView é muito utilizado quando queremosdesenvolver um navegador próprio para o nosso dispositivo.Embora o emulador já possua um Browser embutido, o Androidjá fornece um componente próprio voltado para tal finalidade.Ele funciona como um display onde podemos visualizar aspáginas da internet. Normalmente, o componente WebView étrabalhado em conjunto com o componente WebSettings.Vamos ver alguns métodos dos componentes Método Descriçãoboolean canGoBack() Retorna verdadeiro caso seja possível voltar para a página anterior.boolean canGoForward() Retorna verdadeiro caso seja possível avançar para a 289
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores próxima página. Retorna verdadeiro caso seja possível retornar para algumas páginas anteriores ou avançar alguns páginas.boolean Ex: se você entrar com ocanGoBackOrForward(int valor 2, você aqui verificapassos) se é possível avançar duas páginas. Se você entrar com o valor -2, você aqui verifica se é possível retornar duas páginas anteriores. Logo, números positivos indicam números de páginas que você deseja avançar e números negativos indicam números de páginas que você deseja retornar.void clearHistory() Lista o histórico das páginas visitadas.WebSettings getSettings() Retorna um objeto WebSettings usado para fazer as configurações do WebView.String getTitle() Retorna o título da página corrente.String getUrl() Retorna a URL da página corrente.void goFoward() Avança uma página.void goBack() Retorna à página anterior. Retorna para algumas290
  • Luciano Alves da Silva páginas anteriores ou avançar alguns páginas.void goBackOrForward(intpassos) Ex: se você entrar com o valor 2, você avança duas páginas. Se você entrar com o valor -2, você retorna duas páginas anteriores. Logo, números positivos indicam números de páginas que você deseja avançam páginas e números negativos retornam páginas anteriores.void loadUrl(String url) Carrega a url especificada no parâmetro.- WebSettings Métodos Descriçãovoid setSaveFormData (boolean Define se o Browserarg) deve salvar dados de formulário (true) ou não (false). Habilita (true) ou nãovoid (false) a execução desetJavaScriptEnabled(booleanarg) JavaScript existentes em algumas páginas Web.void setSavePassword(boolean Habilita (true) ou nãoarg) (false) o armazenamento de senhas digitadas. 291
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores10.8) Desenvolvendo uma aplicação que visita páginas WebCrie um novo projeto com os seguintes dados abaixo:Project Name: NavegadorWebPackage Name : br.com.appnevagadorCreate Activity: AppNavegadorApplication Name: NavegadorMin SDK Version: 7O único arquivo que iremos modificar neste projeto é o“AppNavegador.java”, com o seguinte código abaixo:package br.com.appnavegador;import android.app.Activity;import android.os.Bundle;import android.webkit.*;public class AppNavegador extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); WebView w = new WebView(this); WebSettings ws = w.getSettings();292
  • Luciano Alves da Silva ws.setSavePassword(false); ws.setSaveFormData(false); ws.setJavaScriptEnabled(true); ws.setSupportZoom(false); w.loadUrl("http://10.0.2.2"); setContentView(w); } }E para finalizar, no arquivo “AndroidManifest.xml”, coloqueantes da tag “</manifest>”, a seguinte linha : <uses-permissionandroid:name="android.permission.INTERNET" />Para podermos acessar a internet.Vamos executar a nossa aplicação. O resultado você vê nafigura abaixo: 293
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Aplicação que navegada n Internet em execuçãoO próprio componente já oferece uma série de recursos, quepodem ser acessados quando clicamos no botão “Menu” doemulador, como demonstra a figura abaixo:294
  • Luciano Alves da SilvaAplicação que navegada n Internet em execução 295
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores11) Programação com multimídiaA partir deste tópico, iremos aprender a desenvolver aplicações multimídia para a plataforma Android através de componentes que serão descritos agora.11.1) O classe MediaPlayerA classe MediaPlayer do Android reproduz músicas e tambémvídeos mas, aprenderemos a reproduzir músicas nestecomponente.Crie um novo projeto com os seguintes dados abaixo:Project Name: MediaPlayerPackage Name : br.com.appmediaplayerCreate Activity: AppMediaPlayerApplication Name: MediaPlayerMin SDK Version: 7Após criar o projeto, carregue o layout do arquivo “main.xml” eapague o TextView já inserido na tela. Em seguida insira oscomponentes, na sequência :Button Propriedade Valor Id @+id/btplay296
  • Luciano Alves da Silva Layout width fill_parent Text PlayButton Propriedade Valor Id @+id/btstop Layout width fill_parent Text StopSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da tela da aplicaçãoBom, agora no nosso projeto, dentro do diretório “res”, vamoscriar um diretório chamado “raw”, e dentro desse diretóriovamos colocar um arquivo de musica MP3, que deve se chamar“musica1”, para podermos utilizá-lo em nosso projeto.Agora no arquivo “AppMediaPlayer.java”, coloque o seguintecódigo abaixo: 297
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorespackage br.com.appmediaplayer;import android.app.Activity;import android.os.Bundle;import android.media.*;import android.widget.*;import android.view.*;public class AppMediaPlayer extends Activity { /** Called when the activity is first created.*/ Button btplay,btstop; MediaPlayer mp; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btplay = (Button) findViewById(R.id.btplay); btstop = (Button) findViewById(R.id.btstop); mp = MediaPlayer.create(this, R.raw.musica1); try { mp.prepare(); }catch(Exception e) { } btplay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { mp.start(); }298
  • Luciano Alves da Silva }); btstop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { mp.pause(); } }); } }Vamos comentar algumas linhas de código abaixo. A linha: mp = MediaPlayer.create(this, R.raw.musica1); try { mp.prepare(); }catch(Exception e) { }Cria uma instância da classe MediaPlayer e carrega o arquivode música “musica1.mp3” e em seguida prepara a música paraser tocada, através do método prepare.11.2) Desenvolvendo um reprodutor de músicas (primeiraversão)A partir de agora, com o conhecimento do uso da classeMediaPlayer, vamos desenvolver um reprodutor de músicas noAndroid. Essa aplicação vai consistir em um “playlist”, onde 299
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresnele teremos músicas a nossa disposição onde podemosreproduzi-las, de acordo com a musica escolhida.Crie um projeto com os seguintes dados abaixo:Project Name: PlayListMusicasPackage Name : br.com.appplaylistCreate Activity: AppPlayListApplication Name: Reprodutor de músicasMin SDK Version: 7Dentro do diretório “res” do nosso projeto crie uma pastachamada “raw”, e dentro dela, adicione três arquivos de musicaMP3, cujos nomes devem ser, respectivamente : musica1.mp3,musica2.mp3 e musica3.mp3.Vamos carregar o layout do arquivo “main.xml” e em seguidaselecione o TextView já inserido na tela e modifique o conteúdodo texto para “Escolha sua música abaixo:”. Em seguidacoloque os seguintes componentes, na sequência:Spinner Propriedade Valor Id @+id/spnmusicas Layout width fill_parentLinearLayout300
  • Luciano Alves da Silva Propriedade Valor Id @+id/layoutBotoes Layout width fill_parent Orientation horizontal Gravity centerAgora dentro do layout que acabamos de inserir , coloque oscomponentes abaixo:Button Propriedade Valor Id @+id/btplay Layout width wrap_content Layout height wrap_content Text PlayButton Propriedade Valor Id @+id/btstop Layout width wrap_content Layout height wrap_content Text StopSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: 301
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Layout da tela da aplicaçãoAgora no arquivo “AppPlayList.java”, coloque o seguintecódigo abaixo:package br.com.appplaylist;import android.app.Activity;import android.os.Bundle;import android.media.*;import android.widget.*;importandroid.widget.AdapterView.OnItemSelectedListener;import android.view.*;public class AppPlayList extends Activity { /** Called when the activity is first created.*/ Spinner spnmusicas; Button btplay,btstop; private final String[] musicas = {"Musica1","Musica 2","Musica 3"}; MediaPlayer mp; @Override302
  • Luciano Alves da Silva public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); spnmusicas = (Spinner) findViewById(R.id.spnmusicas); btplay = (Button) findViewById(R.id.btplay); btstop = (Button) findViewById(R.id.btstop); ArrayAdapter<String> Itens = newArrayAdapter<String>(this,android.R.layout.simple_spinner_item, musicas); spnmusicas.setAdapter(Itens); spnmusicas.setOnItemSelectedListener(new OnItemSelectedListener(){ public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub if(mp != null) { mp.release(); } if(arg2 == 0) mp = MediaPlayer.create(AppPlayList.this, R.raw.musica1); else if(arg2 ==1) mp = MediaPlayer.create(AppPlayList.this, R.raw.musica2); else 303
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores mp = MediaPlayer.create(AppPlayList.this, R.raw.musica3); try { mp.prepare(); }catch(Exception e) { } } public void onNothingSelected (AdapterView<?> arg0) { // TODO Auto-generated method stub } }); btplay.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub mp.start(); } }); btstop.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub mp.pause(); } }); } }304
  • Luciano Alves da SilvaExecute a aplicação e veja os resultados. Aplicação reprodutora de músicas em execuçãoSe analisarmos a estrutura da aplicação, todas as musicais ficamdentro da pasta “raw”, disponível para serem usados naaplicação porém, tem um detalhe. Essas musicais ficam dentrodo executável do Android ou seja, quando o programa écompilado, as musicas também são armazenadas dentro do“*.apk” e isso, dependendo da quantidade de musicas existentesdentro do projeto, pode atrasar o processo de compilação doprograma.Para solucionarmos esse problema, vamos fazer uma segundaversão desse mesmo programa só que com um detalhe: asmúsicas agora estarão armazenadas no SD-Card (cartão dememória), isso resultará na compilação mais rápida do programapois, as músicas serão carregadas desse cartão e elas não estarãomais dentro do nosso projeto.Para trabalharmos com o SD-Card, precisaremos criar um novoAVD, configurado para trabalhar com SD-Card. Vamos lá : 305
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresNo Eclipse, vamos no menu “Windows” e depois selecione“Android SDK and AVG Manager”, que será aberto a caixa dediálogo conforme mostra a figura abaixo: Android SDK and AVD ManagerSe observarmos acima, já estamos trabalhando com um perfilchamado “Emulador” porém, esse perfil não faz uso do SD-Card. Vamos editar esse perfil, configurando ele para trabalharcom SD-Card. Para isso, Selecione o emulador na lista e emseguida clique no botão “Edit”, será aberta a seguinte caixa dediálogo:306
  • Luciano Alves da Silva Editando o Android Virtual DeviceVamos na seção “SD Card”, com a opção “Size” marcada, paradefinirmos o tamanho do nosso cartão de memória. Vamosespecificar o seu tamanho como 30 Megabytes simplesmentedigitando 30 no campo “Size”, pois automaticamente, otamanho do SD-Card já é em Megabytes.Seguindo os passos acima, as propriedades devem estar deacordo com a imagem abaixo: 307
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Editando o Android Virtual DeviceDepois disso, basta clicar em “Edit AVD” para salvarmos asconfigurações.Se você estiver com o emulador em execução, feche-o para quena próxima vez que você executar a aplicação, o suporte ao SD-Card seja habilitado.11.3) Desenvolvendo um reprodutor de músicas (segundaversão)Bom, agora vamos desenvolver a segunda versão da aplicaçãoreprodutora de músicas, a diferença e que nessa versão as308
  • Luciano Alves da Silvamúsicas estarão em um SD-Card e não mais dentro da pasta“raw”. Crie um novo projeto com os seguintes dados abaixo:Project Name: PlayListMusicasSDCardPackage Name : br.com.appplaylistsdcardCreate Activity: AppPlayListSDCardApplication Name: Reprodutor de músicasMin SDK Version: 7Vamos carregar o layout do arquivo “main.xml” e em seguidaselecione o TextView já inserido na tela e modifique o conteúdodo texto para “Escolha sua música abaixo:”. Em seguidacoloque os seguintes componentes, na sequência:Spinner Propriedade Valor Id @+id/spnmusicas Layout width fill_parentLinearLayout Propriedade Valor Id @+id/layoutBotoes Layout width fill_parent Orientation horizontal Gravity center 309
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresAgora dentro do layout que acabamos de inserir , coloque oscomponentes abaixo:Button Propriedade Valor Id @+id/btplay Layout width wrap_content Layout height wrap_content Text PlayButton Propriedade Valor Id @+id/btstop Layout width wrap_content Layout height wrap_content Text StopSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da tela da aplicação310
  • Luciano Alves da SilvaAgora no arquivo “AppPlayListSDCard.java”, coloque oseguinte código abaixo:package br.com.appplaylistsdcard;import android.app.Activity;import android.os.Bundle;import android.media.*;import android.widget.*;import android.view.*;import java.io.*;import java.util.*;public class AppPlayListSDCard extends Activity { /** Called when the activity is first created.*/ Spinner spnmusicas; Button btplay,btstop; MediaPlayer mp; final String diretorio = "/sdcard/"; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); spnmusicas = (Spinner) 311
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores findViewById(R.id.spnmusicas); btplay = (Button) findViewById(R.id.btplay); btstop = (Button) findViewById(R.id.btstop); File[] files = new File(diretorio).listFiles(); ArrayList arquivos = new ArrayList(); for(int i=0 ; i < files.length ; i++) if(files[i].isFile()) arquivos.add(files[i].getName()); ArrayAdapter musicas = newArrayAdapter(this,android.R.layout.simple_spinner_item,arquivos.toArray()); spnmusicas.setAdapter(musicas); spnmusicas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) { String nome_musica = ((TextView) arg1).getText().toString(); mp = new MediaPlayer(); try { mp.setDataSource(diretorio + nome_musica); mp.prepare();312
  • Luciano Alves da Silva }catch(Exception e) { } } public void onNothingSelected (AdapterView<?> arg0) { // TODO Auto-generated method stub } }); btplay.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub mp.start(); } }); btstop.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub mp.pause(); } }); } }Bom, agora vamos analisar algumas linhas de código abaixo: 313
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresObserve que no nosso programa, é criada uma constantechamada “diretório”, que aponta para o diretório “sdcard”,conforme é mostrado na figura abaixo:final String diretorio = "/sdcard/";Por que apontamos para o diretório do “sdcard” ?, porque oAndroid (tanto o emulador quanto um SmartPhone) possui umdiretório chamado sdcard onde dentro dele, são armazenadosarquivos comuns, que possivelmente serão utilizados por umaaplicação.Observe também que foi necessário a criação de um array dotipo File, que irá armazenar os arquivos contidos dentro dodiretório “sdcard”, conforme mostra o código abaixo:File[] files = new File(diretorio).listFiles();Para obtermos os arquivos dentro do diretório “sdcard“, foinecessário o uso do método “listFiles”, que retorna um array deobjetos do tipo File, onde cada um equivale à um arquivo.Em seguida, é criado um objetivo do tipo “ArrayList”, queconsiste em um array genérico de dimensão aleatória, ou seja, aquantidade de elementos dentro desse objeto pode alterardurante a execução do programa. Qual o objetivo de criar esteobjeto ? Dentro dele iremos armazenar o nome dos arquivos queestão dentro do objeto “files”, conforme você confere no códigoabaixo: for(int i=0 ; i < files.length ; i++) if(files[i].isFile()) arquivos.add(files[i].getName());314
  • Luciano Alves da SilvaDentro do loop do código acima, observe que é feito umaanalise para verificar se o objeto analisado é um arquivo, se for,é adicionado dentro do objeto “arquivo”, caso contrário nãoadiciona.Em seguida, crio um objeto do tipo “ArrayAdapter”, onde neleiremos adicionar os itens armazenados no objeto “arquivo” , dotipo “ArrayList”, conforme mostra o código abaixo:ArrayAdapter musicas = newArrayAdapter(this,android.R.layout.simple_spinner_item,arquivos.toArray());Em seguida, carrego os itens no componente Spinner , pelométodo “setAdapter”, que recebe como parâmetro, um objeto dotipo “ArrayAdapter”, conforme é mostrado abaixo: spnmusicas.setAdapter(musicas);Toda vez que uma música é selecionada, o método“onItemSelected”, que pertence ao evento“onItemSelectedListener”, é disparado executando o código queserá descrito abaixo:A musica selecionada fica armazenada dentro do objeto View,que precisa ser convertido para um objeto do tipo TextView.Após a conversão, o nome da música selecionada é armazenadoem uma variável do tipo string, conforme você confere abaixo: String nome_musica = ((TextView)arg1).getText().toString(); 315
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresEm seguida, crio o objeto MediaPlayer conforme mostra afigura abaixo:mp = new MediaPlayer();Em seguida carrego a música selecionada e preparo para que elaseja tocada, conforme mostra o código abaixo: try { mp.setDataSource(diretorio + nome_musica); mp.prepare(); }catch(Exception e) { }Antes de executarmos a nossa aplicação, vamos no menu“Windows”, “Show View”, “Other...” (do Eclipse) e em seguidaserá aberta a seguinte caixa de diálogo abaixo:316
  • Luciano Alves da Silva Show ViewExpanda o item “Android” e selecione o item “File Explorer”,conforme mostra a figura abaixo: 317
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Show ViewEm seguida, é só clicar em “OK” que a seção “File Explorer”será exibida, como demonstra a figura abaixo: File ExplorerAgora vamos executar a nossa aplicação porém, SIGA OSPASSOS AQUI DESCRITOS.318
  • Luciano Alves da SilvaVamos executar a nossa aplicação. “File Explorer” serve paragerenciar os arquivos que vamos trabalhar dentro da pastasdcard. Durante a execução do Emulador, enquanto ele estivercarregando, será mostrado as seguintes pastas no “FileExplorer”. File ExplorerEnquanto o emulador carrega, não temos nenhuma permissãopara gravar nada na pasta “sdcard”. Quando o emuladorcarregar por completo, as permissões sobre a pasta “sdcard” irãomudar, ficando de acordo com a figura abaixo: File ExplorerIsso significa que você já pode adicionar musicas dentro dapasta “sdcard”. Agora, quando a aplicação iniciar, o componente“Spinner” estará sem itens, por que ? Porque não tem nenhumarquivo na pasta “sdcard”, então vamos adicionar os arquivos 319
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresdentro da pasta. Para adicionarmos um arquivo dentro da pasta“sdcard” selecione a pasta e clique no botão para adicionaros aqruivos. Depois de adicionar os arquivos de música reiniciea aplicação e a execute novamente. Veja o resultado abaixo: Aplicação reprodutora de músicas em execução11.4) Desenvolvendo um reprodutor de vídeoAgora vamos aprender a desenvolver uma aplicação quereproduz vídeos, utilizando o componente VideoView. Essecomponente, além de reproduzir vídeos (no formato .3gp),também reproduz músicas. Vamos demonstrar o uso destecomponente.Antes de nós demonstrarmos o uso deste componente, vamosadicionar um vídeo 3gp dentro da pasta “sdcard”, para que anossa aplicação possa fazer uso deste arquivo.Agora crie um projeto com os seguintes dados abaixo:320
  • Luciano Alves da SilvaProject Name: VideoViewPackage Name : br.com.appvideoCreate Activity: AppVideoApplication Name: Reprodutor de vídeosMin SDK Version: 7Neste projeto NÃO VAMOS MEXER no arquivo “main.xml”,somente no arquivo “AppVideo.java” e nele iremos colocar oseguinte código abaixo:package br.com.appvideo;import android.app.Activity;import android.os.Bundle;import android.widget.MediaController;import android.widget.VideoView;public class AppVideo extends Activity { /** Called when the activity is first created.*/ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); VideoView v = new VideoView(this); v.setVideoPath("/sdcard/video1.3gp"); 321
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores setContentView(v); v.setMediaController(newMediaController(this)); v.requestFocus(); v.start(); } }Vamos analisar algumas linhas de código abaixo:A linha:VideoView v = new VideoView(this);Cria uma instancia da classe VideoView. Na linha seguinte:v.setVideoPath("/sdcard/video1.3gp");Carrego o meu arquivo de vídeo através do método“setVideoPath”. Na próxima instrução:setContentView(v);Carrego o componente na tela dispositivo. Na linha seguinte:v.setMediaController(new MediaController(this));322
  • Luciano Alves da SilvaCarrego os seus controles (os botões play, pause) através dométodo “setMediaController”. Na instrução seguinte:v.requestFocus();Joga o foco para o componente e em seguida, executo o vídeo.Execute a aplicação e veja os resultados: Aplicação que reproduz vídeos em execução11.5) Desenvolvendo um playlist de reprodução de vídeosComo na aplicação de playlist de músicas, vamos repetir omesmo processo para a reprodução de vídeos.Crie um projeto com os seguintes dados abaixo: 323
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresProject Name: PlayListVideosPackage Name : br.com.appplaylistvideosCreate Activity: AppPlayListVideosApplication Name: Reprodutor de vídeosMin SDK Version: 7Após criar o projeto, carregue o layout do arquivo “main.xml” eem seguida selecione o TextView já inserido na tela emodifique o conteúdo do texto para “Escolha seu vídeoabaixo:”. Em seguida coloque os seguintes componentes , nasequência:Spinner Propriedade Valor Id @+id/spnvideos Layout width fill_parentLinearLayout Propriedade Valor Id @+id/layoutbotoes Layout width fill_parent Layout height wrap_content Orientation horizontal Gravity center324
  • Luciano Alves da SilvaAgora dentro da estrutura de layout que acabamos de adicionaracima, coloque dois botões, conforme abaixo:Button Propriedade Valor Id @+id/btplay Layout width wrap_content Layout height wrap_content Text PlayButton Propriedade Valor Id @+id/btstop Layout width wrap_content Layout height wrap_content Text StopBom, logo após a estrutura de layout que nomeados de“layoutBotoes”, adicione o componente VideoView (que seencontra na guia “Images & Media”), e mude as propriedadesdele conforme abaixo:VideoView Propriedade Valor Id @+id/video Layout width wrap_content Layout height wrap_content 325
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSeguindo os passos acima, a tela da aplicação deve estar deacordo com a figura abaixo: Layout da tela da aplicaçãoAgora no arquivo “AppPlayList.java”, coloque o seguintecódigo abaixo:package br.com.appplaylistvideos;import android.app.Activity;import android.os.Bundle;import android.media.*;import android.widget.*;import android.view.*;import java.io.*;import java.util.*;import java.net.*;326
  • Luciano Alves da Silvapublic class AppPlayListVideos extends Activity { /** Called when the activity is first created.*/ Spinner spnvideos; Button btplay,btstop; VideoView video; final String diretorio = "/sdcard/"; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); spnvideos = (Spinner) findViewById(R.id.spnvideos); video = (VideoView) findViewById(R.id.video); btplay = (Button) findViewById(R.id.btplay); btstop = (Button) findViewById(R.id.btstop); File[] files = new File(diretorio).listFiles(); ArrayList arquivos = new ArrayList(); for(int i=0 ; i < files.length ; i++) if(files[i].isFile()) arquivos.add(files[i].getName()); 327
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores ArrayAdapter musicas = newArrayAdapter(this,android.R.layout.simple_spinner_item,arquivos.toArray()); spnvideos.setAdapter(musicas); spnvideos.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) { String nome_video = ((TextView) arg1).getText().toString(); video.setVideoPath(diretorio + nome_video); } public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); btplay.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub video.start(); } }); btstop.setOnClickListener(new View.OnClickListener() {328
  • Luciano Alves da Silva public void onClick(View arg0) { // TODO Auto-generated method stub video.pause(); } }); }}O código acima é similar ao da aplicação de playlist de músicas,o que muda é que nós usamos o componente VideoView parareproduzir vídeos. Execute a aplicação e veja os resultados: Aplicação de playlist de vídeos em execução 329
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores12) Programação com banco de dadosA plataforma Android possui um mecanismo em que podemos trabalhar com banco de dados usando a linguagem SQL, o SQLite. Aqui neste capítulo ireimostrar como trabalhar com banco de dados no Android.Para a criação de banco de dados, não é necessário possuir umSGBD para criar banco de dados no formato SQLite, o Androidjá faz isto.12.1) A linguagem SQLA linguagem SQL (Structured Query Language) é umalinguagem de consulta estruturada que realiza consultas à bancode dados. A SQL é dividida em duas sub-linguagens: LMD(Linguagem de Manipulação de Dados ou Data ManipulationLanguage – DML) e LDD (Linguagem de Definição de Dadosou Data Definition Language – DDL) . A LDD é um conjuntode comandos dentro da SQL usada para a definição dasestruturas de dados, fornecendo as instruções que permitem acriação, modificação e remoção das tabelas, assim como criaçãode índices. Já a LMD é o grupo de comandos dentro dalinguagem SQL utilizado para a recuperação, inclusão, remoçãoe modificação de informações em bancos de dados.Vamos conhecer agora alguns comandos básicos muitoutilizados da linguagem SQL.330
  • Luciano Alves da Silva12.1.1) O comando CREATE TABLEEsse comando serve para criar tabelas em banco de dados. Vejaa sua sintaxe abaixo: create table <tabela>(<campo1> <tipo>[<constraints>] [,<campo2> <tipo>[<constraints>],...,<campon> <tipo> [<constraints>]])Exemplo: Criar uma tabela chamada “cadastro” com osseguintes campos: - codusuario: Do tipo inteiro com propriedades de chaveprimária e auto numeração.- nome : Do tipo texto e requerido- idade : Do tipo inteiro e requerido create table cadastro(codusuario integerprimary key autoincrement, nome text not null,idade integer not null)Outro exemplo : Criar uma tabela chamada “cadastro” (com osmesmos campos do exemplo acima) no banco de dados, se elanão existir. 331
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores create table if not exists cadastro(codusuariointeger primary key autoincrement, nome text notnull, idade integer not null)12.1.2) O comando INSERTEsse comando serve para inserir dados em uma tabela jáexistente. Veja a sua sintaxe abaixo: insert into <tabela>(<campo1>,...<campon>) values(<valor1>,...,<valorn>)Exemplo: Adicionar dados na tabela cadastro (que foi criadacom o comando CREATE TABLE), conforme é mostradoabaixo:nome : Lucianoidade : 23OBS: Como o campo codusuario é do tipo auto-numeração, ovalor dele já é definido automaticamente. insert into cadastro(nome,idade) values(’Luciano’,23)12.1.3) O comando UPDATEEsse comando serve para atualizar dados de uma tabela jáexistente. Veja a sua sintaxe abaixo:332
  • Luciano Alves da Silvaupdate <tabela> set <campo1> = <valor1>[ ,...,<campon> = <valorn>]where <condição>Exemplo: Atualizar a idade do primeiro registro (Luciano) para24 anos.update cadastro set idade = 24where codusuario=112.1.4) O comando DELETEEsse comando serve para remover dados de uma tabela jáexistente. Veja a sua sintaxe abaixo:delete from <tabela> where <condição>Exemplo: Remover o primeiro registro da tabela (Luciano)delete from cadastro where codusuario=112.1.5) O comando SELECTEsse comando serve para fazer consultas a dados em uma tabelajá existente. Veja a sua sintaxe abaixo: 333
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresselect <campo1>[,<campo2>,...,<campon>]from <tabela>where <condição>Exemplos :Mostrar todos os dados cadastrados na tabelaselect codusuario,nome,idadefrom cadastroMostrar todos os nomes cuja idade seja maior que 25.select nomefrom cadastrowhere (idade >= 25)Mostrar todos os nomes cujo prefixo seja ‘David’, ou seja, todosque se chamam David, independente do sobrenome.select nomefrom cadastrowhere (nome like ‘David%’)A partir de agora, vamos ver abaixo algumas funções doAndroid que trabalham com banco de dados.No Android existe um pacote chamado android.sqlite, ondeexiste uma classe chamada SQLiteDataBase, que possui osseguintes métodos:334
  • Luciano Alves da Silva Método Descrição Realiza uma consulta SQL no banco de dados (equivale ao comando SELECT). Essa função retorna uma instância do tipo Cursor. Vamos conhecer os parâmetros que iremos utilizar dessa função:Cursor query(String <tabela> : Neste parâmetro<tabela>, String[]<colunas>, String você informa o nome da<condicao_de_busca>, tabela.String[] <selecionArgs>,String <groupby>, String <coluna> : Neste<having>, String <orderby>) parâmetro a(s) coluna(s) que o banco possui. <condição de busca>: Aqui você informa a condição de busca de dados. Este parâmetro funciona como se fosse a clausula where do SQL, onde é informada a condição de busca. O resto dos parâmetros iremos trabalhar em seu valor null. 335
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Realiza uma inserção de dados na tabela (equivale ao comando INSERT). Essa função possui três parâmetros:long insert(String <tabela>,String <nullColumnHack>,ContentValues <values>) <tabela> : Neste parâmetro você informa o nome da tabela. <nullColumnHack> : O SQL não permite a inserção de linhas em branco, logo, se o valor de uma coluna for vazio, ele será iniciado com o valor null. <values> : Este parâmetro possui os valores a serem adicionados na tabela. Realiza uma atualização de dados na tabela (equivale ao comando UPDATE). Essa função possui trêsint update(String <tabela>, parâmetros:ContentValues <values>,String <condição>, String<whereArgs>) <tabela> : Neste parâmetro você informa o nome da tabela.336
  • Luciano Alves da Silva <values> : Este parâmetro possui os valores a serem adicionados na tabela. <condição de busca>: Aqui você informa a condição para a realização da atualização dos dados. Realiza a remoção de dados na tabela (equivale ao comando DELETE). Essa função possui três parâmetros:int delete(String <tabela>,String <condição>, String<whereArgs>) <tabela> : Neste parâmetro você informa o nome da tabela. <condição>: Aqui você informa a condição para a realização da remoção dos dados da tabela. Executa uma consulta SQL (como CREATE TABLE,void execSQL(String sql) INSERT INTO, UPDATE, DELETE e etc.). Não é possível usar a clausula SELECT nesta função. Para isso, use a função “query”. 337
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresVamos fazer algumas comparações da função “execSQL”, quepermite sintaxes de comando SQL com as demais funções,como “update”,”insert” e “delete” para a realização de umaconsulta SQL.12.2) Exemplos de SQL usando as funções do Android12.2.1) Fazendo uma consulta a tabela (usando SELECT)- Comando SQL : select codusuario, nome, idade from cadastro- Usando a função query : query(“cadastro“, (new String[]{“codusuario“,“nome“,“idade“}), null, null, null,null, null);- Comando SQL : select nome from cadastro where idade > 24- Usando a função query :338
  • Luciano Alves da Silva query(“cadastro“, (new String[] {“nome“}),“ idade > 24“, null, null, null, null);12.2.2) Inserindo dados (usando INSERT)- Comando SQL :insert into cadastro(nome,idade)values(‘Luciano’,23)- Usando a função execSQLexecSQL(“insert into cadastro(nome,idade)values(‘Luciano’,23); “);Usando a função insert :ContentValues valor = new ContentValues();valor.put(“nome“, “Luciano“);valor.put(“idade“, “23“);insert(“cadastro“,null,valor);12.2.3) Atualizando dados (usando UPDATE)- Comando SQL : 339
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresupdate cadastro set idade = 24where codusuario=1- Usando a função execSQLexecSQL(“update cadastro set idade = 24 where(codusuario=1); “);Usando a função update :ContentValues valor = new ContentValues();valor.put(“idade“, “24“);update(“cadastro“,valor, “codusuario=1“);12.2.4) Removendo dados (usando DELETE)- Comando SQL :delete from cadastro where codusuario=1- Usando a função execSQLexecSQL(“delete from cadastro where (codusuario=1);“);340
  • Luciano Alves da SilvaUsando a função delete :delete(“cadastro“, “codusuario=1“,null);12.2.5) Criando uma tabela (usando CREATE TABLE)- Comando SQL :create table cadastro(codusuario integer primarykey autoincrement, nome text not null, idadeinteger not null)- Usando a função execSQLexecSQL(“create table cadastro(codusuario integerprimary key autoincrement, nome text not null,idade integer not null);“);Agora vamos conhecer as funções responsáveis por criar e abrirbanco de dados no Android.SQLDatabase openOrCreateDatabase(Stringnome_do_banco,int mode, CursorFactory cf);Essa função abre ou cria um novo banco de dados. Você deveespecificar o nome do, o modo de abertura (somente leitura ;somente escrita e etc.) e um terceiro parâmetro, quenormalmente é null. Veja um exemplo abaixo: 341
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresSQLDatabase db;db = openOrCreateDatabase("dbbanco",Context.MODE_PRIVATE, null);O comando acima abre ou cria o banco de dados chamado“dbbanco”.Quando realizamos uma consulta do tipo SELECT usando afunção “query”, ela retorna um objeto do tipo Cursor, onde nelaestão armazenados os registros solicitados pela consulta. Vamosver abaixo os métodos da classe Cursor: Método Descrição Move o cursor para oboolean moveToFirst() primeiro registro da tabela. Move o cursor para o registroboolean moveToPrevious() anterior da tabela. Move o cursor para oboolean moveToNext() próximo registro da tabela. Move o cursor para o últimoboolean moveToLast() registro da tabela.int getCount() Retorna o número de registros da tabela.int getColumnIndex(String Retorna o índice da coluna nacolumnName)342
  • Luciano Alves da Silva tabela, através do seu nome, que é passado como parâmetro. Retorna o nome da coluna naString getColumnName(int tabela, através do seu índice,columnIndex) que é passado como parâmetro. Método Descrição Move o cursor para oboolean moveToFirst() primeiro registro da tabela. Move o cursor para o registroboolean moveToPrevious() anterior da tabela. Move o cursor para oboolean moveToNext() próximo registro da tabela. Move o cursor para o últimoboolean moveToLast() registro da tabela.int getCount() Retorna o número de registros da tabela. Retorna o índice da coluna na tabela, através do seu nome,int getColumnIndex(StringcolumnName) que é passado como parâmetro. Lembre-se : o índice do primeiro campo é 0, o índice do segundo campo é 1 e assim por diante. Retorna o valor do campo, tendo como seu parâmetro oString getString(int seu índice, convertido em 343
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedorescolumnIndex) String. Lembre-se : o índice do primeiro campo é 0, o índice do segundo campo é 1 e assim por diante. Retorna o valor do campo, tendo como seu parâmetro oint getInt(intcolumnIndex) seu índice, convertido em int. Lembre-se : o índice do primeiro campo é 0, o índice do segundo campo é 1 e assim por diante. Retorna o valor do campo, tendo como seu parâmetro ofloat getFloat(intcolumnIndex) seu índice, convertido em float. Lembre-se : o índice do primeiro campo é 0, o índice do segundo campo é 1 e assim por diante. Retorna o valor do campo, tendo como seu parâmetro odouble getDouble(intcolumnIndex) seu índice, convertido em double. Lembre-se : o índice do primeiro campo é 0, o índice do segundo campo é 1 e assim por diante. Retorna o valor do campo, tendo como seu parâmetro oshort getShort(int seu índice, convertido emcolumnIndex) short. Lembre-se : o índice do primeiro campo é 0, o índice do segundo campo é 1 e assim por diante.344
  • Luciano Alves da SilvaVou mostrar agora um exemplo para que você tenha um melhorentendimento do mecanismo de banco de dados do Android.Imagine uma tabela chamada “cadastro” com os seguintes dadosabaixo: nome idade Amanda 32 Bianca 30 Bruna 23 Carla 20Agora, observe a linha de código abaixo: SQLDatabase db; db = openOrCreateDatabase("dbbanco",Context.MODE_PRIVATE, null); Cursor c = db.query("cadastro", (new String[]{"nome","idade"}), "idade < 32", null, null, null,null);Observe que a linha acima cria um objeto do tipo Cursor quevai receber o resultado da consulta da função query, que retornauma instância do mesmo tipo. Logo, a instância retornada pelafunção query na verdade, retorna uma tabela resultante daconsulta. Veja esse resultado abaixo: nome idade Bruna 23 Carla 20 345
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresContinuando a codificação. Veja a linha abaixo:c.moveToFirst();A linha acima coloca o ponteiro no primeiro registro da tabela.A linha:String nome = c.getString(0);Retorna o valor do campo “nome” do primeiro registro, no caso,“Bruna”. Veja agora a próxima linha:int idade = c.getInt(1);Retorna o valor do campo “idade” do primeiro registro, noformato int. Neste caso, o valor retornado é 23. A linha:c.moveToNext();A linha acima avança para o próximo registro. A linha:nome = c.getString(0);Retorna o valor do campo “nome” do segundo registro, no caso,“Carla”. Veja agora a próxima linha:int idade = c.getInt(1);Retorna o valor do campo “idade” do segundo registro, noformato int. Neste caso, o valor retornado é 20.346
  • Luciano Alves da SilvaBom, com certeza você entendeu como funciona o mecanismode manipulação de banco de dados no Android. Agora vamospor esse aprendizado na prática.12.3) Desenvolvendo uma aplicação de cadastro (segundaversão)Lembra-se daquele programa de cadastro que nosdesenvolvemos lá no inicio ? Vamos desenvolver agora essemesmo programa (com os mesmos arquivos de layouts doprograma anterior), porém, voltado para banco de dados.Vamos criar um projeto com os seguintes dados abaixo:Project Name: AplicacaoDeCadastroBDPackage Name : br.com.appcadastrobdCreate Activity: AppCadastroBDApplication Name: Aplicação de CadastroMin SDK Version: 7Para acelerar o processo de codificação das telas da aplicação,vamos simplesmente copiar e colar o código XML das telas daaplicação de cadastro anterior. Antes de tudo, coloque umaimagem PNG (pode ser a mesma da aplicação anterior), dentrodo diretório “drawable-mdpi”, ela deve se chamar “profile.png”. 347
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresVamos fazer o seguinte, no arquivo “main.xml” substitua ocódigo dele pelo seguinte código abaixo:<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><ImageView android:id="@+id/ImageView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/profile"></ImageView><TextView android:id="@+id/TextView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Bem vindo a Aplicação de Cadastro dePessoas.Este é um pequeno programa de demonstraçãode cadastro.Selecione uma das opçõesabaixo:"></TextView><Button android:layout_height="wrap_content"android:layout_width="fill_parent"android:text="Cadastrar pessoa"android:id="@+principal/btcadastrarpessoa"></Button><Button android:layout_height="wrap_content"android:layout_width="fill_parent"android:text="Listar pessoas cadastradas"android:id="@+principal/btlistarpessoas"></Button></LinearLayout>Agora dentro do diretório “res/layout”, vamos criar um arquivochamado “cadastro.xml” e substitua o código XML existentedele pelo código XML abaixo:348
  • Luciano Alves da Silva<LinearLayout android:id="@+id/LinearLayout01"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"><ImageViewandroid:id="@+id/ImageView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/profile"></ImageView><TextView android:id="@+id/TextView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Módulo de cadastro. Digite seus dadosabaixo:"></TextView><TextView android:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Nome:"></TextView><EditText android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+cadastro/ednome"></EditText><TextView android:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Profissão:"></TextView><EditText android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+cadastro/edprofissao"></EditText><TextView android:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Idade:"></TextView><EditText android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+cadastro/edidade"></EditText> 349
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores<LinearLayout android:id="@+id/LinearLayout02"android:layout_height="wrap_content"android:layout_width="fill_parent"android:gravity="center"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Cadastrar pessoa"android:id="@+cadastro/btcadastrar"></Button><Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Cancelar"android:id="@+cadastro/btcancelar"></Button></LinearLayout></LinearLayout>Agora dentro do diretório “res/layout”, vamos criar um arquivochamado “listacadastros.xml” e substitua o código XMLexistente dele pelo código XML abaixo:<LinearLayout android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:id="@+id/layoutPrincipal"><ImageViewandroid:id="@+id/ImageView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/profile"></ImageView><TextView android:id="@+id/TextView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff" android:textSize="20sp"android:text="Lista de pessoascadastradas."></TextView><LinearLayout android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/layoutNome"><TextView350
  • Luciano Alves da Silvaandroid:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFF00" android:textSize="20sp"android:text="Nome:"></TextView><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+lista/txtnome"android:textSize="20sp" android:textColor="#ffffff"android:text=" "></TextView></LinearLayout><LinearLayout android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/layoutProfissao"><TextViewandroid:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFF00" android:textSize="20sp"android:text="Profissão:"></TextView><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+lista/txtprofissao"android:textSize="20sp" android:textColor="#ffffff"android:text=" "></TextView></LinearLayout><LinearLayout android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/layoutIdade"><TextViewandroid:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFF00" android:textSize="20sp"android:text="Idade:"></TextView><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+lista/txtidade" 351
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresandroid:textSize="20sp" android:textColor="#ffffff"android:text=" "></TextView></LinearLayout><LinearLayout android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/layoutBotoes"android:gravity="center"android:orientation="horizontal"><Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+lista/btvoltar"android:text="Voltar"></Button><Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Avançar"android:id="@+lista/btavancar"></Button></LinearLayout><Button android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+lista/btmenu" android:text="Menuprincipal"></Button></LinearLayout>No arquivo “AppCadastroBD.java”, substitua o antigo códigopelo novo código abaixo:package br.com.appcadastrobd;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;352
  • Luciano Alves da Silvaimport android.widget.*;import android.view.*;public class AppCadastroBD extends Activity { EditText ednome,edprofissao,edidade; TextView txtnome,txtprofissao,txtidade; String nome; int numreg,pos,numpesq; SQLiteDatabase db; Cursor dados; void CarregaTelaPrincipal () { setContentView(R.layout.main); Button btcadastrarpessoa = (Button) findViewById(R.principal.btcadastrarpessoa); Button btlistarpessoas = (Button) findViewById(R.principal.btlistarpessoas); 353
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores btcadastrarpessoa.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ CarregaTelaCadastro(); }}); btlistarpessoas.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ CarregaListaPessoas(); }}); btcadastrarpessoa.requestFocus(); } void CarregaTelaCadastro() { setContentView(R.layout.cadastro); dados = db.query("cadusuarios",( new String[] {"nome","profissao","idade"}), null, null, null, null, null); numreg = dados.getCount(); Button btcadastrar = (Button) findViewById(R.cadastro.btcadastrar); Button btcancelar = (Button)354
  • Luciano Alves da Silva findViewById(R.cadastro.btcancelar); btcadastrar.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ try { ednome = (EditText)findViewById (R.cadastro.ednome); edprofissao = (EditText)findViewById (R.cadastro.edprofissao); edidade = (EditText)findViewById (R.cadastro.edidade); String nome = ednome.getText() .toString(); String profissao =edprofissao.getText().toString(); String idade =edidade.getText().toString(); //Cadastra numreg++; db.execSQL("insert into cadusuariosvalues(" + String.valueOf(numreg) +"," + nome + "," + profissao +"," + idade + ")"); showMessage("Cadastro efetuado comsucesso", "Aviso"); 355
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores } catch(Exception e) { showMessage("Erro ao cadastrar","Erro"); showMessage(e.toString(), "Erro"); }} }); btcancelar.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ CarregaTelaPrincipal(); } }); } void CarregaListaPessoas() { try { dados = db.query("cadusuarios",( new String[]{"nome","profissao","idade"}), null, null, null,null, null); numreg = dados.getCount(); pos=1; }catch(Exception e) { showMessage(e.toString(), "Erro"); } if(numreg==0) { showMessage("Nenhum registrocadastrado", "Aviso");356
  • Luciano Alves da Silva CarregaTelaPrincipal(); return; } setContentView(R.layout.listacadastrados); dados = db.query("cadusuarios",( new String[]{"nome","profissao","idade"}), null, null, null,null, null); numreg = dados.getCount(); txtnome = (TextView)findViewById(R.lista.txtnome); txtidade = (TextView)findViewById(R.lista.txtidade); txtprofissao =(TextView)findViewById(R.lista.txtprofissao); Button btvoltar = (Button)findViewById(R.lista.btvoltar); Button btavancar = (Button)findViewById(R.lista.btavancar); Button btmenu = (Button)findViewById(R.lista.btmenu); try { dados.moveToFirst(); txtnome.setText(dados.getString(dados.getColumnIndex("nome"))); txtidade.setText(dados.getString(dados.getColumnIndex("idade")));txtprofissao.setText(dados.getString(dados.getColumnIndex("profissao"))); 357
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores btmenu.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ CarregaTelaPrincipal(); } }); btvoltar.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ if(pos==1) return; pos--; dados.moveToPrevious();txtnome.setText(dados.getString(dados.getColumnIndex("nome")));txtidade.setText(dados.getString(dados.getColumnIndex("idade")));txtprofissao.setText(dados.getString(dados.getColumnIndex("profissao"))); } }); btavancar.setOnClickListener(newView.OnClickListener(){ public void onClick(View arg0){ if(pos==numreg) return; pos++;358
  • Luciano Alves da Silva dados.moveToNext();txtnome.setText(dados.getString(dados.getColumnIndex("nome")));txtidade.setText(dados.getString(dados.getColumnIndex("idade")));txtprofissao.setText(dados.getString(dados.getColumnIndex("profissao"))); } }); }catch(Exception e) { showMessage(e.toString(), "Aviso"); } } public void onCreate(Bundle icicle) { super.onCreate(icicle); numreg=0; try { db = openOrCreateDatabase("dbbanco",Context.MODE_PRIVATE, null); db.execSQL("create table if not existscadusuarios(codusuario integer primary keyautoincrement , nome text not null, profissao textnot null, idade integer not null)"); }catch(Exception e) { showMessage(e.toString(), "Erro"); } 359
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores CarregaTelaPrincipal();} public void showMessage(String Caption,StringTitle) { AlertDialog.Builder builder = new AlertDialog.Builder(AppCadastroBD.this); builder.setMessage(Caption); builder.setNeutralButton("OK", null); AlertDialog dialog = builder.create(); dialog.setTitle(Title); dialog.show(); }}Depois de toda a codificação do programa, execute a aplicação eveja os resultados.360
  • Luciano Alves da Silva13) Propriedades e eventos dos componentes trabalhadosN esta seção eu irei mostrar e descrever as propriedades e eventos de todos os componentes que trabalhamos neste livro.Widget TextView- Propriedades Propriedade Em XML Em JavaText android:text setText(CharSequence c)Nessa propriedade, você define o texto a ser exibido na tela. Propriedade Em XML Em JavaText color android:textColor setTextColor(Color c)Nessa propriedade, você define a cor de texto.Proprieda Em XML Em Java deBackgroun android:backgrou setBackGroundColor(Cod nd lor c)Nessa propriedade , você define o cor de fundo do componenteexibido. 361
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresValor: #000000 até #FFFFFF. Propriedade Em XML Em Java setTextSize(float tamanho) ouText size android:textSize setTextSize(int unidade, int tamanho)Define o tamanho do texto. O tamanho da fonte pode serespecificado em várias notações : px (pixels),sp(scaled-pixels) ,mm(milímetros), in (polegadas) e etc.Propriedade Em XML Em Java setTypeface(TypefaceTypeface android:typeface fonte)Essa propriedade serve para definir uma fonte ao texto(normal,sans,serif,monospace).362
  • Luciano Alves da Silva- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,disparando o método onClick.Widget EditText / AutoCompleteTextView- Propriedades Propriedade Em XML Em JavaText android:text setText(CharSequence c)Nessa propriedade, você define o texto a ser exibido na tela. Propriedade Em XML Em JavaText color android:textColor setTextColor(Color c)Nessa propriedade, você define a cor do texto. 363
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresProprieda Em XML Em Java deBackgroun android:backgrou setBackGroundColor(Cod nd lor c)Nessa propriedade , você define o cor de fundo do componenteexibido.Valor: #000000 até #FFFFFF.Propriedade Em XML Em JavaCapitalize android:capitalizeEssa propriedade serve para definir o tipo capitalização daspalavras. Por padrão, o valor e “none”(nenhum). Os possíveisvalores para essa propriedade são : “words”,”sentences” e”characters”Propriedade Em XML Em JavaPassword android:passwordCom essa propriedade você habilita a digitação de senhas. Ovalor padrão desse atributo é “false”.364
  • Luciano Alves da SilvaPropriedade Em XML Em Java setTextSize(float tamanho) ouText size android:textSize setTextSize(int unidade, int tamanho)Define o tamanho do texto. O tamanho da fonte pode serespecificado em várias notações : px (pixels),sp(scaled-pixels) ,mm(milímetros), in (polegadas) e etc.Propriedade Em XML Em JavaTypeface android:typeface setTypeface(Typeface fonte)Essa propriedade serve para definir uma fonte ao texto. Ospossíveis valores são : “normal”,”monospace”,”sans” e “serif”.Propriedade Em XML Em JavaHint android:hint setHint(CharSequence c)define uma mensagem que aparecerá quando a EditText estivervazia. 365
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,disparando o método onClick.Método que define o Evento Métodos evento relacionados ao eventosetOnKeyListener OnKeyListener onKey(View v,int KeyCode, KeyEvent event)Esse evento é disparado toda vez que a tecla é acionada,disparando o método onKey.Método que define o Evento Métodos evento relacionados ao evento onFocusChangesetOnFocusChangeLi OnFocusChangeLis (View v,stener tener boolean hasFocus)Esse método é disparado toda vez quando um componenteEditText ganha ou perde foco.366
  • Luciano Alves da SilvaWidget Button- Propriedades Propriedade Em XML Em JavaText android:text setText(CharSequence c)Nessa propriedade, você define o texto a ser exibido na tela. Propriedade Em XML Em JavaText color android:textColor setTextColor(Color c)Nessa propriedade, você define a cor do texto.Propriedade Em XML Em Java setTextSize(float tamanho) ouText size android:textSize setTextSize(int unidade, int tamanho)Define o tamanho do texto. O tamanho da fonte pode serespecificado em várias notações : px (pixels),sp(scaled-pixels) ,mm(milímetros), in (polegadas) e etc. 367
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresPropriedade Em XML Em JavaTypeface android:typeface setTypeface(Typeface fonte)Essa propriedade serve para definir uma fonte ao texto. Ospossíveis valores são : “normal”,”monospace”,”sans” e “serif”.- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,disparando o método onClick.Método que define o Evento Métodos evento relacionados ao eventosetOnKeyListener OnKeyListener onKey(View v,int KeyCode, KeyEvent event)Esse evento é disparado toda vez que a tecla é acionada,disparando o método onKey.368
  • Luciano Alves da SilvaWidget ToogleButton- PropriedadesPropriedad Em XML Em Java eText Off android:textOf setTextOff(CharSequenc f e c)Nessa propriedade, você define o texto a ser exibido quando obotão estiver desmarcado.Propriedade Em XML Em JavaText On android:textOn setTextOn(CharSequence c)Nessa propriedade, você define o texto a ser exibido quando obotão estiver marcado.Propriedade Em XML Em JavaText color android:textColor setTextColor(Color c)Nessa propriedade, você define a cor do texto.Propriedade Em XML Em JavaText size android:textSize setTextSize(float tamanho) ou 369
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores setTextSize(int unidade, int tamanho)Define o tamanho do texto. O tamanho da fonte pode serespecificado em várias notações : px (pixels),sp(scaled-pixels) ,mm(milímetros), in (polegadas) e etc.Propriedade Em XML Em JavaTypeface android:typeface setTypeface(Typeface fonte)Essa propriedade serve para definir uma fonte ao texto. Ospossíveis valores são : “normal”,”monospace”,”sans” e “serif”. Propriedade Em XML Em Java setChecked(booleanChecked android:checked estado)Nessa propriedade você define o estado do CheckBox, se estarámarcado (true) ou não (false).- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,370
  • Luciano Alves da Silvadisparando o método onClick.Método que define Evento Métodos o evento relacionados ao eventosetOnCheckedCha OnCheckedChang onCheckedChanged(CngeListener eListener ompondButton v, boolean isChecked)Esse evento é disparado toda vez que a propriedade Checked doToggleButton é alteradaMétodo que define o Evento Métodos evento relacionados ao eventosetOnKeyListener OnKeyListener onKey(View v,int KeyCode, KeyEvent event)Esse evento é disparado toda vez que a tecla é acionada,disparando o método onKey. 371
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresWidget CheckBox/RadioButton- Propriedades Propriedade Em XML Em JavaText android:text setText(CharSequence c)Nessa propriedade, você define o texto a ser exibido na tela. Propriedade Em XML Em JavaText color android:textColor setTextColor(Color c)Nessa propriedade, você define a cor do texto. Propriedade Em XML Em Java setChecked(booleanChecked android:checked estado)Nessa propriedade você define o estado do CheckBox, se estarámarcado (true) ou não (false).372
  • Luciano Alves da Silva- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,disparando o método onClick. Método que define o Evento Métodos evento relacionados ao evento onCheckedChsetOnCheckedChangeL OnCheckedChangeLi angedistener stener (CompoundBu tton cb,boolean b)Esse evento será disparado toda vez que o estado do CheckBoxfor modificado, ou seja, marcado ou desmarcado, disparando ométodo onCheckedChanged. 373
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresWidget Spinner / ListView- Propriedades Método Descrição Nesse método você define os elementos quesetAdapter(SpinnerAdapter a) irão compor esse componente através de um vetor (array). Essa função retorna a posição do elemento selecionado. Por exemplo, se for oint getSelectedPosition() primeiro elemento, retorna 0, se for o segundo, retorna 1 e assim sucessivamente. Essa função retorna em um tipo Object, o itemObject getSelectedItem() selecionado. Retorna em um tipo Object o elemento deObject getItemAtPosition(intposicao) uma determinada posição, passada como parâmetro.374
  • Luciano Alves da Silva- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,disparando o método onClick.Método que define o Evento Métodos evento relacionados ao evento onItemClicksetOnItemClickList OnItemClickListe (AdapterViewener ner <?> a, View v, int I, long l)Esse evento será disparado toda vez que um derminado item forclicado, disparando o método onItemClick. Método que Evento Métodos define o evento relacionados ao evento onItemSelected(Ada pterView av, ViewsetOnItemSelect OnItemSelecte v,int posição,longedListener dListener id) 375
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores onNothingSelected( AdapterView av)Esse evento será disparado toda vez que um derminado item forselecionado, disparando o método onItemSelected. Casonenhum item seja selecionado, será disparado o métodoonNothingSelected.Widget ImageView- Propriedades Propriedade Em XML Em JavaSrc android:src setImageResource(int Id)Nessa propriedade, você define a imagem que será exibida natela. Método Descrição Esse método é similar ao método acima, sendosetImageURI(Uri link) que aqui você especifica o Uri (como se fosse um link de internet) como caminho de localização da imagem.376
  • Luciano Alves da Silva- EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado,disparando o método onClick.Widget Gallery - Propriedades Método Descrição Nesse método você define os elementos quesetAdapter(SpinnerAdapter a) irão compor esse componente através de um vetor (array). - EventosMétodo que define o Evento Métodos evento relacionados ao eventosetOnClickListener OnClickListener onClick(View v)Esse evento é disparado toda vez que o componente for clicado, 377
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresdisparando o método onClick.Método que define o Evento Métodos evento relacionados ao evento onItemClicksetOnItemClickList OnItemClickListe (AdapterViewener ner <?> a, View v, int I, long l)Esse evento será disparado toda vez que um derminado item forclicado, disparando o método onItemClick.Widget ProgressBar - Propriedades Propriedade Em XML Em JavaStyle styleNessa propriedade, você define o estilo da progressbar. Essapropriedade assume os seguintes valores:"?android:attr/progressBarStyleHorizontal","?android:attr/progressBarStyle""?android:attr/progressBarStyleLarge""?android:attr/progressBarStyleSmall" Propriedade Em XML Em JavaMax android:max setMax(int378
  • Luciano Alves da Silva valor_maximo)Neste método você define o valor máximo da faixa. Ou seja, se definiro valor máximo como 100, a faixa de progresso será entre 0 e 100. Propriedade Em XML Em Java setProgress(intProgress android:progress progresso)Neste método, você define o valor corrente do progresso.Propried Em XML Em Java adeSecondar android:secondaryPro setSecondaryProgresy gress s(int progresso)progressNeste método, você define o valor corrente do progressosecundário. Método Descrição Neste método você incrementProgressBy(int incr) define o quando o progresso será incrementado. Neste método vocêincrementSecondaryProgressBy(int define o quando o incr) progresso secundário será incrementado. 379
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresWidget SeekBar - Propriedades Propriedade Em XML Em JavaMax android:max setMax(int valor_maximo)Neste método você define o valor máximo da faixa. Ou seja, se definiro valor máximo como 100, a faixa de progresso será entre 0 e 100. Propriedade Em XML Em Java setProgress(intProgress android:progress progresso)Neste método, você define o valor corrente do progresso. Método Descrição Neste método você incrementProgressBy(int incr) define o quando o progresso será incrementado.- EventosMétodo que define o Evento Métodos evento relacionados ao evento onProgressChang ed(setOnSeekBarChangeLi OnSeekBarChangeLi SeekBar sBar, intstener stener progress, boolean fromUser)380
  • Luciano Alves da Silva onStartTrackingT ouch( SeekBar sBar) onStopTrackingTo uch( SeekBar sBar)Esse evento é disparado toda vez que uma alteração no valor deprogresso da SeekBar é ocorrida, tanto por parte do usuáriotanto por parte de comando.Widget DatePicker - Propriedades Método Descrição Neste método você define o valor inicial do ano ,init(int ano, int mês, intdia, mês e dia inclusiveonDateChangedListener também, você define umevento) evento toda vez que uma data for modificada (onDateChangedListener). Neste método você atualiza a data passandoupdateDate(int ano, int mês, como parâmetros o ano, oint dia) mês e o dia. Esse método retorna o anoint getYear() da data. Esse método retorna o mês do ano, sabendo se 381
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores que, para o primeiro mês (janeiro) ele retorna 0,int getMonth() para o segundo mês (fevereiro) retorna 1 e assim por diante. Esse método retorna o dia do mês.int getDayOfMonth()- Eventos Método Evento Métodosque define relacionados ao o evento eventoInit onDateChangedListener onDateChanged(View v, int ano, int mês , int dia)Esse evento é disparado toda vez que a data for alterada,disparando o método onDateChanged.382
  • Luciano Alves da SilvaWidget TimePicker - Propriedades Método Descrição Neste método você define o valor da hora sabendo sesetCurrentHour(int hora) que , uma hora. Neste método você define o valor do minuto entre 0-setCurrentMinute(int minuto) 59. Esse método retorna o minuto corrente.int getCurrentMinute() Esse método retorna a hora corrente.int getCurrentHour()- EventosMétodo que define Evento Métodos o evento relacionados ao eventosetOnTimeChanged OnTimeChangedL onTimeChanged(TiListener istener mePicker tp, int hora, int minuto )Esse evento é disparado toda vez que a hora for alterada,disparando o método onTimeChanged. 383
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresWidget Chronometer - Propriedades Método Descrição Neste método você define uma exibiçãosetFormat(string format) personalizada do tempo decorrido. Neste método você define a base de tempo para osetBase(long base) cronômetro. Retorna a base de tempo do temporizador.long getBase() Esse método inicia astart() contagem do cronômetro. Esse método pára astop() contagem do cronômetro.- Eventos Método que define o Evento Métodos evento relacionados ao evento onChronomet erTicksetOnChronometerTic OnChronometerTick (ChronometekListener Listener r384
  • Luciano Alves da Silva cronometro )Esse evento é disparado toda vez quando o tempo muda, desegundo em segundo.Widget ZoomControls - Eventos Método que define o Evento Métodos evento relacionado s ao eventosetOnZoomInClickList OnZoomInClickList onClick(Viener ener ew v)Esse evento é disparado toda vez que botão “Zoom In” forclicado. Método que define o Evento Métodos evento relacionad os ao eventosetOnZoomOutClickLis OnZoomOutClickLis onClick(Vtener tener iew v)Esse evento é disparado toda vez que botão “Zoom Out” forclicado. 385
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresComponente MediaPlayer- Propriedades Método Descrição Carrega um arquivo de música através do path,setDataSource(String path) passado como parâmetro Esse método prepara a mídia que será executada.prepare() Esse método pausa apause() música que esta em execução. Esse método executa astart() musica. Detalhe : esse método precisa ser executado logo após a invocação do método prepare() ou pause().setLopping(boolean arg) Neste método definimos se uma música estará em lopping (true) ou não (false).int getDuration() Esse método retorna em um int, a duração da musica carregada. Este método retorna a posição corrente daint getCurrentPosition() execução da música.386
  • Luciano Alves da Silva Esse retorna o status da reprodução da música ouboolean isPlaying() seja, se ela está reproduzindo(true) ou não(false).- Eventos Método que Evento Métodos define o evento relacionados ao eventosetOnPreparedL MediaPlayer.OnClic onPrepared(Mediistener kListener aPlayer mp)Esse evento é disparado toda vez que uma música é preparadacom o método “prepare()” .Widget VideoView- Propriedades Método Descrição Carrega um arquivo de vídeo/música através dosetVideoPath(String path) path, passado como parâmetro Esse método pausa apause() vídeo/música que esta em execução. 387
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedores Esse método executa astart() vídeo/musica. Esse método retorna emint getDuration() um int, a duração da vídeo/musica carregada. Este método retorna a posição corrente daint getCurrentPosition() execução da vídeo/música. Esse retorna o status da reprodução daboolean isPlaying() vídeo/música ou seja, se ela está reproduzindo(true) ou não(false).- Evento Método que Evento Métodos define o evento relacionados ao eventosetOnPreparedList MediaPlayer.OnClickLis onPrepared(MediaPlener tener ayer mp)Esse evento é disparado toda vez que uma vídeo/música épreparada com o método “prepare()” .388
  • Luciano Alves da SilvaMétodo que define Evento Métodos o evento relacionados ao evento onCompletion(MedisetOnCompletionL MediaPlayer aPlayer mp)istener .OnCompletionL istenerEsse evento será disparado toda vez que uma vídeo/música emreprodução termina a sua reprodução.Propriedades comuns a todos os componentesPropriedade Em XML Em JavaId android:idNessa propriedade , definimos o nome do nosso componente.Propriedade Em XML Em JavaLayout width android:layout_widthNessa propriedade, você define a largura do componente a serexibido. Normalmente essa propriedade assume dois valores :“fill_parent” (preenche toda a largura restante do dispositivo) e“wrap_content” (a largura do componente será definida deacordo com o seu conteúdo) . Também podem especificarvalores números com suas respectivas escalas, ex:“160px”,”50sp” e etc. 389
  • Aprenda passo a passo a programar em Android - Guia essecial para desenvolvedoresPropriedade Em XML Em JavaLayout android:layout_heigthheightNessa propriedade, você define a altura do componente a serexibido. Normalmente essa propriedade assume dois valores :“fill_parent” (preenche toda a altura restante do dispositivo) e“wrap_content” (a altura do componente será definida deacordo com o seu conteúdo) . Também podem especificarvalores números com suas respectivas escalas, ex:“160px”,”50sp” e etc.Propriedade Em XML Em Java setVisibility(intVisibility android:visibility modo_visibilidade)Essa propriedade serve para definir se o componente estarávisível ou não. Ela assume os seguintes valores :“visible”,”invisible” e “gone”.390
  • Luciano Alves da SilvaApêndice – Links ÚteisG ostaria de aproveitar também e deixar aqui alguns links interessantes, para que você possa ter a oportunidade de se aprofundar a respeito da tecnologia Android.Portal Android• www.portalandroid.orgAndroid Brasil• www.androidbrasil.comAndroid Brasil Projetos• www.androidbrasilprojetos.orgEu, Android• www.euandroid.com.brAndroid Development Community• www.anddev.org 391