Baixe o app para aproveitar ainda mais
Prévia do material em texto
SUMÁRIO Sobre o Autor Antes de Começar Para quem é este livro 1 Introdução As Gerações de Celulares Dispositivos Móveis e seus Nomes Market Share Mundial 2 Introdução ao Android A Plataforma Versões do Android Como desenvolver O Mercado de Aplicativos 3 A Ferramenta Android Studio Instalando Configurando Explorando Testando 4 Interface Gráfica Layouts Widgets Comuns Containers Dialogs Menus 5 Entendendo as Activities Mas o que é uma Activity? Criando uma Activity Eventos Iniciando e Finalizando Activities 6 Acesso à Dados Locais Arquivos Banco de Dados 7 Acesso a Dados Remotos Usando APIs Criando APIs API JSON com PHP API JSON com ASP.NET API JSON com Java Servlets API JSON com NodeJS 8 Considerações Finais Projetos de Apps para empresas Publicação na Google Play Política de Privacidade Seguindo em frente SOBRE O AUTOR Luiz Fernando Duarte Júnior é Bacharel em Ciência da Computação pela Universidade Luterana do Brasil (ULBRA) e Especialista em Desenvolvimento de Aplicações para Dispositivos Móveis pela Universidade do Vale do Rio dos Sinos (UNISINOS). Carrega ainda um diploma de Reparador de Equipamentos Eletrônicos pelo SENAI e duas certificações Scrum para trabalhar com Métodos Ágeis: Professional Scrum Developer e Professional Scrum Master. Atuando na área de TI desde 2006, na maior parte do tempo como desenvolvedor, é apaixonado por dispositivos móveis desde que teve o primeiro contato com celulares em 1998, mexendo em um Gradiente Skyway de sua mãe. De lá para cá teve oportunidade de lidar com dispositivos móveis em diferentes oportunidades, incluindo um emprego na área desenvolvendo para a finada plataforma Palm OS, fora centenas de projetos solitários em J2ME, até que conheceu Android em 2011. Foi amor à primeira vista. Trabalhando com Android desenvolveu diversos projetos para empresas, incluindo grandes marcas como Embelleze, LG, Ford e Renault, além de ministrar cursos de Android para alunos do curso superior de várias universidades. Um grande entusiasta da plataforma, espera que com esse livro possa ajudar ainda mais pessoas a criarem seus apps e aumentar a competitividade das empresas brasileiras. Além de desenvolvedor de apps, atua como professor do ensino superior no curso tecnológico de Análise e Desenvolvimento de Sistemas na Faculdade de Tecnologia de Porto Alegre (RS), é autor do blog http://www.luiztools.com.br, onde fala sobre empreendedorismo e desenvolvimento de software, especialmente mobile. Conheça meus outros livros: Programação Web com Node.js Scrum e Métodos Ágeis: Um Guia Prático Java para Iniciantes Hackeando sua Carreira MongoDB para Iniciantes Criando aplicações móveis com Corona http://www.luiztools.com.br http://www.luiztools.com.br/livro-nodejs http://www.luiztools.com.br/livro-agile http://www.luiztools.com.br/livro-java-i http://www.luiztools.com.br/livro-marketing-pessoal http://www.luiztools.com.br/livro-mongodb http://www.luiztools.com.br/livro-corona ANTES DE COMEÇAR Antes de começarmos, é bom você ler esta seção para evitar surpresas e até para saber se este livro é para você. Para quem é este livro Primeiramente, este livro não vai lhe ensinar a programar, ele exige que você já saiba isso, ao menos em um nível básico (final do segundo semestre da faculdade de computação, por exemplo). Segundo, este livro exige que você já tenha conhecimento técnico prévio sobre smartphones, que ao menos saiba mexer em um e que preferencialmente possua um. Parto do pressuposto que você é ou já foi um estudante de Técnico em informática, Ciência da Computação, Sistemas de Informação, Análise e Desenvolvimento de Sistemas ou algum curso semelhante. Usarei diversos termos técnicos ao longo do livro que são comumente aprendidos nestes cursos e que não tenho o intuito de explicar aqui. O foco deste livro é em ensinar o básico de programação de aplicativos para smartphones Android focando nas pessoas jurídicas, ou seja, apps para empresas, que sempre foi o meu foco. Simples assim. Não vou ensinar nada de iOS ou Windows Phone, apenas Android. Darei foco aos smartphones, muito embora tudo o que foi visto aqui possa ser aplicado à tablets, sem problemas. Novamente, ensinarei o básico. Nenhum tópico avançado será tratado aqui e nenhuma API muito específica, apenas o que já é nativo da plataforma Android e completamente focado para empresas, novamente, apps para empresas pequenas e profissionais liberais. Não faremos um Instagram ou um Angry Birds, mas muitos conceitos podem ser aplicados para criar um app profissional de mensagens semelhante ao WhatsApp ou jogos simples no estilo Quiz. Novamente, ensinarei a construir aplicativos. Nenhum game será exemplificado no decorrer do livro e sugiro que busque livros específicos sobre o assunto se é isso que deseja fazer (em meu blog você encontra outro livro que fala de games: http://www.luiztools.com.br). Como o foco não é multimídia ou entretenimento, tão poucos os apps serão muito bonitos, focando na simplicidade e sobriedade. Deixo o design por conta de quem está lendo, enquanto construímos as interfaces de maneira simples e funcional. Ao término deste livro você estará apto a construir aplicativos simples para smartphones Android, com componentes de interface, transições de telas, layouts personalizados, integração com APIs externas, banco de dados local e podendo testar tudo isso no seu próprio smartphone ou no simulador Android que vem junto com a ferramenta de desenvolvimento que utilizaremos. Além disso, terá uma noção abrangente do cenário mobile atual e do mercado em que está se inserindo. Atenção: se você não sabe o básico de Java, leia esse livro primeiro Java para Iniciantes, do mesmo autor. http://www.luiztools.com.br/livro-java-i 1 INTRODUÇÃO Estamos vivendo uma Revolução Mobile. Ninguém tem dúvidas disso. A pergunta é: você está preparado para surfar esta onda? A teoria dos celulares é de 1947, mas somente em 1973 que a Motorola se tornou a pioneira desse mercado ao construir o primeiro protótipo funcional de um telefone celular que, dizem as histórias, foi utilizado pelo diretor da Motorola na época para realizar uma ligação para seu rival da AT&T avisando que ele havia ganho a corrida tecnológica pelo primeiro celular. Entretanto, ainda levou 10 anos para os primeiros aparelhos celulares chegarem ao mercado com tamanho em torno de 30cm e pesando 1kg. O preço? Módicos U$4.000 que tornavam este um item de luxo tanto quanto os carros que eram equipados com estes aparelhos, como Rolls Royces e Bentleys. Sim, ou você acha que as pessoas carregavam aparelhos de 1kg no bolso? No início os celulares eram usados somente para realizar ligações telefônicas. Somente em 1993 que surgiu o SMS, o sistema de envio de mensagens que até o surgimento recente do WhatsApp dominava a mensageria telefônica mundial, pondo bilhões no bolso das operadoras. Ainda nesse ano não tão longe do início da década de 90, surgiram os primeiros celulares com funções PDA, como agenda de contatos, calendário de compromissos, alarmes, etc quando a IBM passou a investir mais forte neste mercado. Os celulares estavam se tornando cada vez mais úteis. Em 1996, este artefato tecnológico começou a ganhar uma conotação de status. Não exatamente neste ano que ter um celular se tornou motivo de status, mas foi em 1996 que a Motorola novamente foi pioneira lançando o famoso Motorola StarTac, com design inspirado na nave espacial da série Star Trek. Sim, design. Estávamos entrando em uma era onde os celulares eram quase peças do vestuário como os relógios. Na verdade, mais à frente os celulares acabaram substituindo parcialmente os relógios de pulso, e de certa forma tem de combinar com a personalidade e vestes do seu dono, não é mesmo? Avançando no tempo, em 2001, a Kyocera, uma fabricante não tão famosa no Brasil, lançou o primeiro smartphone do mercado. Ok, não era tão “smart” assim, não tinha tantos recursos quanto os atuais, mas tinha um sistema operacional de verdade e não um firmware embarcado em um hardware. Ele podia ser formatado, podiater aplicativos instalados. Não tínhamos à essa altura uma loja de aplicativos ou sequer a liberdade de desenvolvê-los, mas abriu as portas para as inovações que surgiram mais tarde. Selfie tem sido a palavra mais usada atualmente nas redes sociais. Mas você parou para pensar o que gerou essa onda de narcisismo digital? Foi em 2002 que a Sanyo, outra fabricante de celulares pouco conhecida aqui no ocidente teve a ideia de lançar um celular que viesse com uma câmera digital embutida. Claro, era uma câmera VGA de 0.3MP, mas que gerou uma revolução na fotografia digital, permitindo que fabricantes como a Nokia se tornasse a maior vendedora de câmeras digitais do mundo no ano seguinte, devido ao sucesso de seus smartphones, principalmente a linha N Series. Mas e a Internet? Hoje todos vivemos conectados à ela com nossos smartphones, certo? Apenas em 2003 que o primeiro smartphone se conectou à web real, o HTC Danger. Além disso ele foi o primeiro smartphone com comandos por voz algo que hoje é muito popular com o Siri da Apple e o Google Now do Google. E a revolução continuou em 2003 com a Nokia lançando o primeiro smartphone focado em games, o Nokia N-Gage, que inclusive tinha um formato peculiar de console portátil, plataforma de games e até algum tipo de rede social para os jogadores. Nokia Arena ou algo assim. Foi em 2004 que a Motorola voltou a inovar com seus celulares-design, lançando o famosíssimo Motorola Razr, mais conhecido como V3, que durante 3 anos consecutivos se manteve na lista dos celulares mais vendidos no mundo inteiro, e aqui no Brasil não foi exceção. Ter um V3 era chamar a atenção toda vez que tinha de tirá-lo do bolso para tirar uma foto, atender uma ligação ou...praticamente apenas isso. O V3 não era um celular de ponta mesmo na sua época, seu apelo era mais social, com design ultra fino, teclado no melhor estilo Tron e duas câmeras de diferentes qualidades dependendo da versão. E quantas versões, hein! Tinha V3 padrão (prata), Black, Pink, Dolce & Gabanna (dourado) e muitas outras, sendo que o hardware variava pouco e o design mudava basicamente a cor. Curioso não?! Foi em 2005 que a Motorola lançou outro marco da indústria com a série Rokr que eram celulares focados em ser os melhores tocadores de música do mercado. Com enorme capacidade de armazenamento, um bom player e caixas estéreo de alta potência, os Rokrs eram junto com os Sony Walkman os melhores celulares para se escutar música na época, fazendo a alegria de quem tinha grana para comprá-los e escutar no caminho para a faculdade ou trabalho. Foi praticamente o início da morte dos MP3 Players, que duraram no mercado mais alguns anos até se extinguirem completamente. Afinal, para quê carregar um celular e um MP3 no bolso, se um bom Rokr resolve os dois problemas? Em 2007 temos o maior marco da indústria mobile moderna. Algo como a Revolução Francesa dos dispositivos móveis, uma vez que toda uma indústria nova foi criada neste ano, a indústria dos apps. Foi com a Apple, que em seu princípio era uma empresa de computadores, que virou uma empresa de tocadores de música com iPod, que criou o mais incrível de todos os smartphones até então, o iPhone. Mas o mais incrível de 2007 não é o lançamento do iPhone em si, que era um excelente telefone e trazia um conceito completamente novo , com uma experiência completamente focada no touchscreen (que não era uma tecnologia nova, diga-se de passagem), mas no ecossistema que a Apple criou junto ao iTunes e a App store. Agora, qualquer desenvolvedor em qualquer lugar do mundo podia escrever seu próprio aplicativo e distribuí-lo em um marketplace, alcançando clientes do mundo inteiro. O desenvolvimento de apps, até então centralizado nas mãos das empresas credenciadas junto às fabricantes, agora estava aberto a qualquer desenvolvedor com um computador na mão e uma ideia na cabeça. Se você hoje está pensando em desenvolver um app para colocar na Apple Store ou na Google Play, agradeça à Apple por ter criado este modelo de distribuição de apps que forçou toda a indústria a se reinventar. Não demorou muito até o Google se manifestar e querer entrar nesta briga, lançando junto com a HTC o primeiro smartphone Android, seu novíssimo sistema operacional, em 2008, o HTC Dream. Enquanto que o mercado esquentou absurdamente em 2010 com a Samsung se tornando a maior fabricante de celulares do mundo, com a Nokia perdendo a liderança com seu defasado sistema Symbian, com a BlackBerry entrando em colapso e perdendo seu lugar até mesmo para a Microsoft, a Apple não se acomodava e antes do lendário Steve Jobs dizer adeus à empresa (e ao mundo), o iPad foi lançado, iniciando todas em uma nova corrida por tablets de todos os tipos, tamanhos e fabricantes. Os tablets não eram algo novo, fizeram parte de um passado não tão distante, mas um passado desconectado que fez com que não fossem bem sucedidos. Hoje, um tablet conectado à Internet é tão útil quanto um notebook ou computador para 90% das pessoas, e muito mais conveniente. A história não termina aqui, mas acho que você já entendeu, não é mesmo? Market Share Mundial Os números de 2017 mostram uma supremacia do sistema operacional Android sobre todos os outros. Se esse livro tivesse sido escrito na década de 90 com revisões a cada 10 anos, mostraria o quanto esse mercado mudou com o passar dos anos, com o surgimento e desaparecimento de sistemas operacionais e fabricantes. Esses números são de uma pesquisa da IDC e mostra que o Android reina no mundo inteiro, com variações em cada continente, mas sempre com alguma folga, como nos EUA onde tem 60% do mercado e na China, onde tem 90%. 2 INTRODUÇÃO AO ANDROID Você sabia que não foi o Google que criou o Android? O sistema operacional Android foi criado em 2005 por uma startup chamada Android Inc. Que foi comprada pela empresa de Mountain View e se tornou a equipe que criou este fantástico SO. Apenas em outubro de 2008 que tivemos o lançamento oficial do Android no mercado com o primeiro smartphone Android, o HTC Dream. Mais tarde, em 2010 tivemos o lançamento do Samsung Galaxy Tab, o primeiro tablet com Android. Talvez a maior inovação trazida pelo Android não tenha sido suas APIs, suporte a múltiplos hardwares, não somente celulares, mas sim o fato de ser uma plataforma aberta, com todos seu código fonte disponível para download e customização, inclusive para fins comerciais como bem tem feito a Samsung nos últimos anos, que hoje fatura mais com o Android do que o próprio Google. A Plataforma O Android é um sistema operacional que compartilha o mesmo kernel do Linux, escrito em C e C++ com um pouco de linguagem de montagem Assembly. Ao contrário do que se pensa o Android não é escrito em Java, o que na verdade o faria muito lento se fosse verdade. Outro mito relacionado ao Android é de que ele é de propriedade do Google. Embora o Google seja o principal mantenedor da plataforma, o Android é propriedade da Open Handset Alliance, um consórcio de empresas criado pelo Google e com participantes das principais fabricantes de celulares do mundo como Motorola, Samsung e LG. Curiosamente, em 2012 o Google comprou a divisão de mobilidade da Motorola, seja para aumentar seu poder sobre o mercado ou apenas pensando em capitalizar melhor a plataforma. Além do sistema operacional, a plataforma engloba uma camada de aplicação ou middleware, em Java, onde a maioria dos aplicativos reside, conforme mostra a imagem abaixo. Nesta camada o Android já entrega alguns apps genéricos como um browser webkit, um alarme, uma agenda de contatos, uma calculadora e mais alguns. A plataforma Android oferece suporte nativo à biblioteca gráfica OpenGL ES 2D e 3D para renderização de apps e games, além de suporte nativo ao banco de dados SQLite. Versões do Android Desde seu lançamento em versões Alfa e Beta, o Android teve diversas versões, sempre com nomes de sobremesas e em ordem alfabética, começando na letra C uma vez que já tivemos a A (Alfa) e B (Beta). O número de API entre parênteses é o número da biblioteca dedesenvolvimento, que usaremos mais tarde. ● Versão 1.5 Cupcake (API 3) ● Versão 1.6 Donut (API 4) ● Versão 2.0 a 2.1 Eclair (API 7) ● Versão 2.2 Frozen Yogurt (ou FroYo, API 8) ● Versão 2.3 Ginger Bread (API 9 e 10) ● Versão 3.0 Honeycomb (API 11 a 13) ● Versão 4.0 Ice-cream Sandwich (API 14 e 15) ● Versão 4.1 à 4.3 Jellybean (APIs 16, 17 e 18) ● Versão 4.4 Kit Kat (API 19 e 20) ● Versão 5.0 Lollipop (API 21 e 22) ● Versão 6.0 Marshmallow (API 23) ● Versão 7.0 Nougat (API 24 e 25) ● Versão 8.0 Oreo (API 26) Até a versão 2.3 o Android era praticamente 100% focado para smartphones e o uso destas versões do Android em tablets era sofrível, embora existente até os dias atuais em dispositivos de segunda linha do mercado chinês. Somente na versão 3.0 que o Android passou a atender de verdade o mercado de tablets com a versão Honeycomb, que era exclusiva para esse tipo de dispositivo. No entanto, essa nova versão trouxe à tona outro problema da plataforma: a fragmentação. No mundo inteiro diversos fabricantes lançaram celulares e tablets com versões diferentes do Android, o que gera problemas até hoje para os usuários, vendedores, fabricantes e nós, desenvolvedores. A OHA e principalmente o Google tentou consertar essa fragmentação com a versão 4.0, a Ice- cream Sandwich que visava unificar as vantagens da versão 2.3.3 com o suporte à tablets da versão 3.0 em uma versão completamente reescrita e reestilizada. Mais recentemente em 2014, o Google deu um novo empurrão em sua plataforma anunciando no Google IO, seu evento global para os desenvolvedores, que estaria lançando versões do Android para automóveis e wearables, ou seja, em breve teremos Android em nossos carros, óculos, relógios e até mesmo roupas! E a empresa californiana não está para brincadeira, junto com grandes montadoras como a Hyundai, o Google montou em analogia à OHA a Open Automotive Alliance, com o intuito de definir os padrões e escrever o futuro dos computadores de bordo e centrais multimídias dos carros usando a plataforma Android. Não obstante, o próprio Google Glass, óculos de realidade aumentada do Google que ainda engatinha nas vendas, usa a plataforma Android. E por fim, o suporte à Smart TVs e a aparelhos da linha branca como as geladeiras inteligentes da Brastemp, mostram que o Android veio para ficar. Como desenvolver A dita plataforma Android não é apenas um sistema operacional. O Google não nos presenteou apenas com um grande e gratuito sistema operacional para smartphones e tablets, mas com todo um set de recursos para desenvolver para ele. Para desenvolver para Android você precisa ter instalado em sua máquina o JDK (Java Development Kit) e o Android SDK (Software Development Kit), que está disponível publicamente aos desenvolvedores desde setembro de 2008. Isto considerando o desenvolvimento nativo tradicional, com a linguagem Java. Neste post em meu blog falo de outras possibilidades de desenvolvimento para Android: http://www.luiztools.com.br/post/conheca-os-frameworks-de-desenvolvimento-mobile/ Como ambientes de desenvolvimento pode-se utilizar Eclipse, Netbeans ou IntelliJ, entre outras. O SDK oficial engloba o ADT ou Android Development Toolkit, um kit de desenvolvimento que pode ser instalado em IDEs compatíveis que fornece recursos de compilação e de conexão, como o ADB, a Android Debug Bridge, e de simulação, como o AVD ou Android Virtual Device. Mas nem só de plugins e componentes vive o SDK, ele possui todas as bibliotecas e APIs para manipular os apps nativos da plataforma e os recursos de hardware do dispositivo, como GPS, acelerômetros, tela sensível ao toque, redes de dados, etc. Mas o desenvolvimento para Android, que é um sistema tradicional escrito em C, não está restrito a esta linguagem. Pode-se desenvolver em Android com a plataforma .NET, com HTML+CSS+JS, com a própria linguagem C e C++ (usando o NDK, o Native Development http://www.luiztools.com.br/post/conheca-os-frameworks-de-desenvolvimento-mobile/ Kit), com a linguagem brasileira Lua e com muitas outras, com diferentes níveis de performance, compatibilidade e sets de recursos. Apesar dos aplicativos Android em sua maioria serem escritos em Java, a máquina virtual Java (JVM) que roda nos dispositivos Android não é a tradicional que roda em desktops. E desde a versão Kit Kat, existem variações: alguns dispositivos mais antigos usam a VM Dalvik, enquanto outros mais novos usam a VM ART (Android Runtime). Ambas são máquinas virtuais reduzidas, com seu próprio set de instruções (compatível entre elas) e que não lê os mesmos bytecodes do Java desktop, ou seja, não há compatibilidade entre os binários de ambas plataformas, e mesmo através de recompilação, nem todas bibliotecas Java tradicionais funcionam no Android. Tenha isso em mente, principalmente se quiser converter alguma aplicação desktop para mobile. Se quiser mais sobre a Dalvik especificamente, recomendo a leitura deste post em meu blog: http://www.luiztools.com.br/post/tudo-sobre-maquina-virtual-dalvik-do-android/ O Mercado de Aplicativos O mercado de apps irá movimentar U$77 bilhões em 2017 segundo a Gartner, devido a um volume de 268 bilhões de downloads de apps. São 2 milhões de apps para download na App Store e mais 2.2 milhões na Google Play. A empregabilidade de desenvolvedores de aplicativos está entre as mais altas do mundo, mesmo dentro de um setor como a TI que já impressiona pelos números. Nos EUA os salários beiram os U$100/h e mesmo dentro do Brasil não é raro encontrar empresas pagando salários de R$5.000 a R$12.000 para bons desenvolvedores de aplicativos, conforme mostrado pelo site Glassdoor: https://www.glassdoor.com/Salaries/brazil-android-developer-salary- SRCH_IL.0,6_IN36_KO7,24.htm O mais impressionante de tudo isso é que para entrar nesse mercado não é preciso muito. Você pode desenvolver para Android com qualquer plataforma e com uma infinidade de ferramentas gratuitas. Ao contrário do iOS, você pode distribuir e vender seus aplicativos livremente sem pagar royalties a ninguém. Caso queira publicar na Google Play existe uma taxa única de U$25 contra os U$99 anuais da Apple. Ou seja, todo o investimento é o de um computador e do seu tempo. Claro, se você está lendo isso é porque comprou este livro também, então teve mais algum investimento ☺. Devido a isso de vez em quando aparecem grandes cases de sucesso surpreendentes, como caso de Robert Nay que aos 14 anos, estudante da 8a série da escola elementar, criou o game Bubble Ball que com 9 milhões de downloads desbancou o trono de Angry Birds à época. Tudo isso com um livro de programação mobile que encontrou na biblioteca de sua escola. Mas que tipos de aplicativos movem este mercado? Muitas são as opções de aplicativos para desenvolver, mas algumas categorias lideram em números: Consumo de API Basicamente um app de consumo de conteúdo é um app que não possui conteúdo próprio, que se conecta a alguma API ou feed para carregar seu conteúdo, como os apps de redes sociais, leitores http://www.luiztools.com.br/post/tudo-sobre-maquina-virtual-dalvik-do-android/ https://www.glassdoor.com/Salaries/brazil-android-developer-salary-SRCH_IL.0,6_IN36_KO7,24.htm de feed RSS, revistas digitais, mobile bankings, entre outros. Utilitários Um app utilitário é um app que lhe ajuda a realizar outras tarefas como ver o saldo da sua conta bancária, escrever e-mails, ou os discos virtuais. Entram aqui também os diversos apps de fotografia e compartilhamento de imagem e os apps mensageiros e de localização. Advergames Advergames são os jogos associados a grandes marcas de produtos, como os jogos da Pepsi, Toddynho, Doritos, Axe, Boticário e Rexona, só para citar alguns. As grandes marcas estão cada vez mais investindo em jogos para engajar seu público de uma maneira mais lúdica e alguns projetos de jogos que chegam nas agências digitais e estúdios desenvolvimento chegam na casa dos R$100 mil. Casual Games Jogos casuais existem há décadas, divertindo seus jogadores nas horaslivres, nas filas dos bancos, no ônibus e nas longas viagens. Um jogo casual é aquele que é simples de jogar mas extremamente viciante. Geralmente um jogo casual tem muitos níveis com pouca variação, para lhe manter o maior tempo possível jogando, mas sem uma história geralmente. Em celulares, onde a jogabilidade é limitada, os jogos casuais reinam absoluto. Títulos como Clash Royale, Bejeweled e Candy Crush são exemplos de jogos casuais sendo que a Supercell, empresa criadora do Clash Royale, vale bilhões no mercado de capitais. Adaptações de Grandes Games Grandes empresas de games como a Electronic Arts (EA) atualmente investem mais nas plataformas móveis do que nos consoles e PCs. Em parte isso se deve ao baixo índice de pirataria dos jogos mobile e ao custo de produção menor que o dos jogos tradicionais. Seja lá o motivo, as adaptações de grandes games como FIFA e Pro Evolution Soccer para celulares tem rendido milhões às contas de suas produtoras, só para citar dois exemplos. Futilidades Nesta categoria encontram-se todos apps que não possuem uma utilidade prática mas que ainda assim fazem enorme sucesso. Exemplos incluem um ventilador que não faz vento, um app que zumbifica as fotos dos seus amigos, flatulência digital e por aí vai. Ganhando dinheiro com apps Diversos são os valores destes aplicativos e 80% de todo o faturamento do mercado de apps mobile vem de games gratuitos, que mais tarde vendem bens dentro do jogo ou usam de publicidade. Os demais games possuem valores entre U$0,99 e U$12, sendo que a imensa maioria se encontra na extremidade de menor valor. Seja qual for o gênero ou preço, o fato é que o mercado de apps está bombando. Empresas como a Evernote, possuem 100 milhões de usuário que geram mais de U$150 milhões ao ano. O Waze, popular app de mapas e rotas possui mais de 40 milhões de usuário e foi comprado pelo Google por U$1,3 bilhões. A Supercell, criadora de sucessos como Hay Day e Clash of Clans teve 51% de suas ações compradas por U$1,5 bilhões por um banco japonês. Outra notória compra foi a do Instagram, que com 260 milhões de usuários foi comprado pelo Facebook, no valor de U$1 bilhão entre dinheiro e ações da própria empresa. A Google Play possui atualmente mais de 2.2 milhões de apps e por dia são ativados 850 mil dispositivos Android no mundo. O que você está esperando para ter o seu lugar ao sol? Se quiser saber mais sobre como ganhar dinheiro com apps, recomendo este post do meu blog http://www.luiztools.com.br/post/fiz-um-app-e-agora-como-ganho-dinheiro/ http://www.luiztools.com.br/post/fiz-um-app-e-agora-como-ganho-dinheiro/ 3 A FERRAMENTA ANDROID STUDIO Existem diversas ferramentas possíveis de se usar para desenvolver aplicativos para Android. Nenhuma delas supera a criatividade e competência de um bom desenvolvedor, mas todas ajudam a aumentar sua produtividade e lhe permitem criar apps cada vez mais profissionais. Escolher uma boa ferramenta é uma boa maneira de começar na frente no desenvolvimento de apps, uma vez que uma má ferramenta pode lhe atrasar em demasia ou mesmo fazer com que perca tempo com configurações ou mesmo falhas de software ao invés de apenas programar. Recomendo e uso no desenvolvimento deste livro a ferramenta oficial do Google, chamada de Android Studio, uma IDE construída sobre o IntelliJ, outra IDE de código aberto assim como o famoso Eclipse. O Android Studio encontra-se, na época de escrita deste livro, na sua versão 3 e tem se mostrado bem estável e com atualizações mensais, o que é uma boa vantagem, mostrando que o Google realmente está investindo tempo e dinheiro no seu desenvolvimento. Usaremos esta ferramenta durante os estudos do livro e pode baixá-la neste link (não instale ainda): https://developer.android.com/studio/index.html . Caso deseje usar outra ferramenta, em meu blog ensino como usar: ● Eclipse: http://www.luiztools.com.br/post/como-programar-apps-android-no-eclipse/ ● NetBeans: http://www.luiztools.com.br/post/como-programar-apps-android-no- netbeans/ Instalando Antes de instalar o Android Studio você irá precisar ter o JDK instalado em sua máquina, que pode ser baixado no site oficial da Oracle (na época de escrita deste livro a versão mais recente é a Java 8): http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- 2133151.html No site da Oracle existirão uma dezena de versões do JDK para baixar, procure o seu sistema operacional na lista e baixe a versão mais recente. Baixe e instale o JDK apenas avançando durante o instalador, para somente depois mandar instalar o Android Studio. Caso você não instale nessa ordem, o Android Studio não irá encontrar sozinho o JDK e exigirá que você configure seu sistema operacional manualmente, definindo uma variável de ambiente JAVA_HOME para a pasta do seu JDK. Assim que estiver com o JDK instalado, baixe a última versão do Android Studio (que na época em que escrevo este livro é a 2.2) no site oficial: https://developer.android.com/studio/index.html Baixe e instale o Android Studio apenas avançando durante o instalador. Após a instalação, siga em frente executando pela primeira vez o Android Studio, seja pelo menu Inicializar do Windows, pela pasta de aplicativos no Mac OSX ou como quer que chamem o “Inicializar do Linux”. Atenção: certifique-se de instalar o Android Studio em um caminho que não contenha espaços em branco ou acentos, para evitar problemas de compatibilidade mais tarde. https://developer.android.com/studio/index.html http://www.luiztools.com.br/post/como-programar-apps-android-no-eclipse/ http://www.luiztools.com.br/post/como-programar-apps-android-no-netbeans/ http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html https://developer.android.com/studio/index.html Configurando Ao abrir o Android Studio você deve visualizar a seguinte tela, logo após a splash screen. Clique na opção Configure (no rodapé à direita) e depois em SDK Manager. No SDK Manager você gerencia a versão das ferramentas do Android SDK que está usando com o Android Studio, bem como quais versões de Android você tem instaladas na sua máquina. Por padrão junto com a instalação já vem com a versão mais recente instalada e a menos que vá desenvolver para alguma versão específica, essa será o suficiente para os exemplos deste livro. Caso queira baixar alguma versão específica, ou tenha de atualizar alguma coisa no SDK, marque as opções que deseja e clique no botão Ok que tudo será baixado e talvez você tenha que reinicializar o Android Studio para que tudo volte a funcionar normalmente. Mais tarde, já com a IDE aberta no modo de edição de código, caso deseje abrir o SDK Manager, você pode clicar no ícone do mesmo que fica no lado direito da barra de ferramentas, com a seta para baixo no Android (indicando download). Evite a tentação de sair marcando todas opções e prefira as versões mais genéricas do Android para trabalhar, como a versão 4.0.3, que atende a boa parte das exigências. Você deve estar se perguntando: “Mas e as demais versões?”. O Android tem uma característica peculiar que se você está desenvolvendo um software para a versão 4 da plataforma, todas as versões mais recentes conseguirão usar este app, mas o contrário não é válido. Então não seria uma boa desenvolver sempre para a 1.5? NÃO! Isso porque a versão de SDK que escolhemos, também chamada de Minimum SDK restringe as bibliotecas a que temos acesso. Por exemplo, se queremos usar algum recurso de comunicação NFC, só encontraremos API para isso na versão 4.0 do Android. Explorando O Android Studio é uma IDE bem completa. Possui um editor de código com code complete (ele vai te dando dicas conforme vai escrevendo as palavras) e highlight syntax (ele colore as palavras reservadas conforme suas funções, bem como comentários). Possui ferramentas de depuração muito boas e já vem 100% integrado com o Android SDK, incluindo alguns botões exclusivos e projetos para os apps que podemos querer criar. Para explorar a IDE melhor vamos criar nosso primeiro projeto comela. Para isso, clique em Start a New Android Project na tela inicial, ou se já estiver dentro da ferramenta, vá no menu File > New Project. Mantenha as informações iniciais que indicam o nome da aplicação (My Application), o domínio da empresa e a pasta do projeto (dentro da pasta do seu usuário) e clique em Next. Na tela que se abrir, a Target Android Devices, selecione a opção “Phones e Tablets”, informe versão 4.0.3 do Android na opção Minimum SDK, ou a mais próxima que tiver disso. O Android Studio vai lhe informar a porcentagem de dispositivos Android que seu app irá funcionar, o que para a 4.0.3 é 100% dos dispositivos mundiais (ninguém usa mais a 2 ou 3). Next e poderá escolher qual modelo de app irá usar para criar o seu. Escolha a opção Empty Activity, que explicaremos do que se trata mais tarde. Atenção: se você selecionar uma versão de Android que ainda não tenha baixado para sua máquina, o Android Studio irá começar o download por conta própria agora mesmo, o que pode demorar um pouco. Avance e chegará à última tela, que lhe pede o nome da Activity (nem sabemos o que é isso ainda), o nome do Layout e o Título da Activity. Deixe tudo como está e mande encerrar clicando no botão de Finish. Agora sim podemos explorar a ferramenta! Atenção: o Android Studio é uma ferramenta bem pesada e com uso constante de Internet. Você verá que muitas vezes ele poderá estar um pouco lento, principalmente nesta primeira etapa de criação e configuração do projeto e mais para frente em etapas de compilação. Nesse post do meu blog eu dou várias dicas de como melhorar a performance dele: http://www.luiztools.com.br/post/como-deixar-o-android-studio-mais-rapido/ Project Na imagem acima temos a seção Project, que lista toda a estrutura de pastas e arquivos do projeto. Mais tarde iremos estudar exatamente para que servem cada uma destas pastas e arquivos. Por ora, apenas note que os fontes do nosso aplicativo ficam em app/java/ e por fim o pacote das suas classes Java, onde estão a lógica do seu app. No meu caso é o pacote com o nome de com.example.luizfduartejr.myapplication Atenção: Se você não estiver vendo algo muito parecido com isso na sua ferramenta pode estar com uma configuração de visualização do projeto diferente da minha. Note um botão “Android” logo acima da pasta app, clicando nele você pode mudar a forma de ver e gerenciar o projeto. O Menu View Caso perca esta seção (Project) ou outra qualquer, você pode facilmente exibi-las novamente usando o menu View > Tool Windows e escolhendo a janela ou seção que “perdeu” durante o desenvolvimento. É no menu View que temos também dois recursos muito interessantes para pessoas como eu, que tem de dar cursos de Android: Enter Presentation Mode e Enter Full Screen. A primeira opção otimiza toda área de trabalho do Android Studio para exibição em um telão, com foco no editor de código em si. A segunda opção maximiza a área de trabalho e é indicado para trabalhar em projetos com grande quantidade de código Java a ser analisado, e até mesmo para aumentar o foco do desenvolvedor no projeto sem ser distraído com outras janelas. Qualquer uma destas opções pode ser revertida acessando o mesmo menu View novamente e clicando em Exit Presentation Mode ou Exit Full Screen, respectivamente. Editor de Código No centro da IDE, desde que uma classe Java esteja aberta (como MyActivity.java), você verá o editor de código, organizado em abas para melhorar a navegabilidade entre os documentos que estão sendo editados no momento, com a possibilidade de fechar quaisquer documentos que não http://www.luiztools.com.br/post/como-deixar-o-android-studio-mais-rapido/ estão sendo usados no botão ‘x’ no canto direito de cada aba. Cada um desses documentos pode ser aberto através da seção Project à esquerda, que foi vista no tópico anterior. Por ora vamos nos ater às funcionalidades e não ao código que foi gerado automaticamente durante a criação do projeto com o modelo Empty Activity. Código 1: disponível em luiztools.com.br/livro-android-fontes public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } O editor de código possui recursos de autocomplete e de highlight syntax, o que aumenta e muito a produtividade e legibilidade do código, respectivamente. A IDE também irá lhe avisar em tempo real sobre erros de codificação grifando as palavras em vermelho, além de dicas de melhorias no seu código grifando as palavras em amarelo. Na margem esquerda do editor temos algumas setas que permitem ocultar ou exibir pequenos trechos do código, geralmente delimitados por chaves, indicando escopos isolados (ou seja, grupos de comandos com um objetivo comum). Outra característica do editor é que quando digitamos o nome de uma classe ainda não referenciada, ele pode sugerir que você crie a classe automaticamente ou que importe uma classe já existe com esse nome. Editor de Layout Com um arquivo de layout aberto, como activity_main.xml que foi gerado e deve estar em outra aba do editor, o editor de código é substituído pelo Editor de Layout no centro da IDE, conforme mostra a figura abaixo: Neste Editor temos duas formas de visualização, que podem ser acessadas pelas abas no rodapé do editor: “Design” e “Text”. Clique em cada uma delas e veja a diferença. Com o modo Text selecionado, vemos basicamente o conteúdo do arquivo XML em si, permitindo que toda a interface seja construída apenas através do uso correto das tags XML permitidas e interpretadas pelo Android. É dessa maneira que as interfaces gráficas são construídas em Android, o interpretador da máquina virtual Java reduzida do Android lê o arquivo XML, sabendo exatamente o quê, onde e como devem ser renderizados cada um dos elementos da interface. Note que mesmo com a aba Text selecionada, ainda temos uma ferramenta visual à direita para nos ajudar a entender o que estamos criando. Quando alteramos o texto de algum controle na esquerda, o mesmo é automaticamente exibido no simulador à esquerda. Não obstante, o editor de código XML é muito bom e conta também com recursos como code complete (vai dando sugestões enquanto você escreve) e highlight syntax (colore as palavras de acordo com sua função), tornando muito produtiva a tarefa de construção de interfaces em modo texto. Ainda assim, se você preferir, pode utilizar a aba Design para construir sua interface visualmente, arrastando componentes da Palette, que fica à esquerda do simulador. A cada componente arrastado, um trecho novo de código é adicionado em background ao arquivo XML de interface, ou seja, no fundo, só existe uma forma de construir o layout, sendo que a Palette é apenas um recurso gráfico para facilitar sua vida. O mais comum é que seja utilizado uma mescla das duas abordagens, utilizando a Palette para criar o componente na interface e usando a aba Text para configurar o layout e suas propriedades e às vezes até para copiar e colar alguns trechos. Falando em propriedades, cada um dos atributos do nó XML do arquivo de layout é considerado uma propriedade do componente. Além disso, quando selecionamos um componente no modo de edição visual, na direita aparece uma seção Properties, com as propriedades passíveis de configuração daquele componente, conforme mostra a imagem abaixo, quando selecione com o mouse um TextView (rótulo de texto): Estas propriedades tanto podem ser manipuladas visualmente pela seção Properties quanto em modo texto. Note que as mesmas propriedades aparecem nesse trecho de código do arquivo XML de layout: Código 2: disponível em luiztools.com.br/livro-android-fontes <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello world!" /> E com isso terminamos nossa exploração inicial da interface da IDE Android Studio. A seguir, testaremos esse app de teste, rodando nossa primeira simulação! Testando Para testar o AndroidStudio vamos criar nosso primeiro app, que na verdade será apenas um app que exibirá a frase Olá Mundo na tela do simulador do smartphone. Seguindo os passos da seção anterior, teremos um app de Hello World já pronto e basta configurarmos um dispositivo virtual de testes, os chamados AVDs (Android Virtual Devices). Para isso, com o Android Studio aberto, clique no ícone do AVD Manager, localizado na Toolbar, com o ícone de um smartphone com o Android no cantinho. Isso irá abrir a janela AVD Manager, como mostrado abaixo. O AVD Manager serve para gerenciar as máquinas virtuais Android que usaremos para a maioria dos testes e exemplos práticos deste livro. Obviamente nada é melhor do que testar seus aplicativos em um dispositivo de verdade, o que ensinaremos mais à frente, mas por ora, é importante conhecermos as ferramentas nativas para teste. No exemplo acima eu já possuo dois dispositivos virtuais de teste configurados. Para criar um novo, clique no botão Create Virtual Device, que abrirá o wizard de configuração do dispositivo. Neste wizard definimos todas as características de hardware e software do nosso aparelho virtual. Na primeira tela escolhemos a plataforma, “Phone”, o modelo de exemplo, “Nexus One” e avançamos com o botão “Next”. Na tela seguinte escolhemos a imagem do sistema que vamos utilizar no emulador. Por padrão o Android Studio vem com a imagem do Android mais recente instalado, mas esta janela do wizard irá lhe listar mesmo as imagens que você ainda não baixou, o que forçará o seu download automaticamente se escolher alguma delas. Se você tem um computador antigo ou sem CPU Intel (+5 anos), sugiro usar a versão 4.0.3 com chip ARM (armeabi ou arm-v7). Se seu computador for mais novo e possuir chip Intel, selecione o Android Lollipop com chip Intel (x86). Na última janela do wizard temos a opção de definir o nome da máquina virtual (que deve ser único e preferencialmente sem acentos), a escala da tela (para que seja melhor exibido no seu computador, uma vez que alguns dispositivos podem ter resoluções maiores que a do seu monitor). Existem outras opçòes mais avançadas que não vem ao caso agora. Antes de finalizar você pode ainda querer definir algumas configurações avançadas clicando em “Show Advanced Settings”, como memória RAM do dispositivo (sugiro 1GB para Android 4+), câmera frontal/traseira (que pode ser configurada para usar sua webcam ou uma imagem pré- definida), memória interna, cartão SD, teclado físico e por aí vai. Conforme necessitarmos de tais recursos de hardware voltaremos nesta parte para configurá-los. Clique em Finish e nossa VM será criada em poucos minutos, bastando clicar no botão de Play para iniciar a emulação. Atenção: A inicialização do Android pode demorar bastante dependendo das configurações da sua máquina, então não é algo que irá querer vivenciar a cada vez que fizer uma alteração em seu código. A dica é: após inicializar uma vez um AVD completamente, não o feche, até que não tenha mais nada para programar em Android por hoje. Deixe a janela do AVD aberta, inclusive podendo a fechar a janela do AVD Manager. Quando for testar seu código Java no dispositivo virtual, ele já estará pronto e irá executar mais rapidamente. Agora voltando ao Android Studio, com nosso app de Olá Mundo pronto de fábrica, vamos clicar no botão de executar nosso aplicativo (Run), que é um ícone de Play na toolbar. Quando clicamos neste botão uma compilação é realizada em nosso projeto e quaisquer erros de compilação que existirem serão apresentados para que você resolva antes de continuar. Caso não existam erros de compilação (o que não quer dizer que seu app está necessariamente funcionando) o Android Studio irá perguntar em qual dispositivo o app será instalado para testes. Note que ele lista tanto os dispositivos virtuais quanto os reais, caso algum esteja plugado via USB no computador. Ao marcar a opção “Use same device for future launches” fará com que o Android Studio não lhe questione mais sobre qual dispositivo irá usar para testes, usando sempre o mesmo. Como resultado, veremos nosso aplicativo rodando no simulador Android recém-criado. Caso você queira testar no seu smartphone e ele não esteja aparecendo na lista de dispositivos certifique-se que: ● a opção Depuração USB está habilitada (USB Debugging). Ela fica dentro de Opções do Desenvolvedor, um menu secreto em alguns aparelhos, mas que geralmente abre quando tocamos várias vezes no item Versão do Android. ● a opção Fontes Desconhecidas está habilitada (Unknown Sources). Ela fica dentro da área de Segurança do Android. ● o cabo USB está devidamente conectado e o smartphone foi reconhecido corretamente pelo seu sistema operacional. Muitos modelos exigem instalação do driver de depuração, chamado ADB Interface, que pode ser obtido no Google pesquisando juntamente com o nome do seu modelo de smartphone Várias são as razões pelas quais vale o esforço de realizar os passos acima e testar seus apps diretamente no smartphone, mas a principal delas é a performance. É muito, mas muito mais rápido usar o smartphone para testes do que as máquinas virtuais Android. 4 INTERFACE GRÁFICA Vimos no capítulo anterior todo o básico para começarmos a utilizar o Android Studio para criação e testes de apps simples. Neste capítulo veremos o essencial sobre a construção da interface gráfica de nossos apps e o funcionamento de seus controles para criar os efeitos desejados. Toda Activity (imagine uma tela por enquanto) que possui interface gráfica deve carregar um arquivo de layout logo que é criada, como uma de suas primeiras ações. Isso é feito usando o método setContentView, que esperar o identificador único do layout que será usado, que fica em R.layout (basicamente o nome do arquivo de layout sem a extensão .xml). Código 3: disponível em luiztools.com.br/livro-android-fontes public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } Com isso dizemos que vamos exibir o layout activity_main.xml durante a execução da Activity MainActivity.java e a partir da linha imediatamente abaixo à esta chamada, passa a ser possível manipular todos os aspectos da interface desta tela do app. Layouts Um layout define a estrutura visual para sua interface com o usuário. Cada “tela” de um aplicativo Android possui um arquivo de layout. Na plataforma Android, a aparência dos layouts são descritas em arquivos XML que ficam na pasta res/layout do seu projeto, sendo que inicialmente o próprio Android Studio já cria um layout padrão para você. Em geral os layouts estão associados a uma classe Activity de nome semelhante, mas também é possível criar layouts independente de código Java, clicando com o botão direito do mouse sobre a pasta layout e selecionando a opção New > Layout resource file. Assim como na biblioteca Swing para criação de aplicações gráficas desktop em Java, os arquivos de layout definem os elementos de maneira relativa, e não absoluta como em plataformas visuais de desenvolvimento como Delphi e Visual Basic. Toda a organização dos componentes na tela, chamados em Java de widgets e em Android de views, respeita a ordem prevista pelo gerenciador (ou gerenciadores) de layout que estivermos utilizando. Voltando ao exemplo da aplicação MainApplication que apenas imprime um Hello World na tela, note como o arquivo XML de layout inicia com a definição de um nó ConstraintLayout. Código 4: disponível em luiztools.com.br/livro-android-fontes <ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> </ConstraintLayout> Todo arquivo XML de layout deve começar indicando qual o gerenciador de layout que irá utilizar e, por padrão, o Android Studio cria com o gerenciador ConstraintLayout, que é o que possui a maior responsividade de layout entre diferentes resoluções de dispositivo. Isso garante que seu app irá se ajustar dinamicamente a cada tela sem precisar reescrever seu código. De qualquer forma, dentro do nó raiz do Layout temos seus atributos, iniciados com “android:”, a saber: ● layout_width: largura do layout. O valor match_parent garante que ele irá ocupar toda a largura da tela do dispositivo. ● layout_height: o mesmo que o anterior, mas para altura do app. ● paddingLeft: a margem interna esquerda que os componentes dentro desse layout terão de respeitar. ● paddingRight, paddingTop, paddingBottom: o mesmo anterior, só que para a direita, para cima e para baixo, respectivamente. Outras propriedades úteis ainda incluem: ● background: define uma imagem ou cor de fundo para a tela do aplicativo. As cores são definidas através de constantes do Android, como @android:color/black e @color/holo_blue_dark. Caso opte por uma imagem, a mesma deve estar na pasta res/drawable do seu projeto, e é referenciada aqui com a sintaxe @drawable/nomeDaImagem, sem a extensão da mesma. Esses atributos são independentes do tipo de layout que escolhemos para nossa tela e recomenda- se que você fique apenas com o ConstraintLayout, que é o mais atual e mais responsivo (se ajusta melhor aos diferentes dispositivos).. Atenção para unidades de medida: embora estejamos muito acostumados com o uso de pixels (px) para medidas de resolução, em Android recomenda-se o uso de pixels independentes de densidade (dp). Isso se deve ao fato de que diferentes dispositivos possuem resoluções diferentes com densidade de pixels por polegada também diferente. O uso de dp ao invés de px torna o dimensionamento dos componentes mais relativo e menos absoluto, evitando que alguns componentes fiquem muito grandes ou pequenos em dispositivos com resoluções muito diferentes do que as originais dos testes. Constraint Layout Constraint Layout é o gerenciador de layouts mais recente da plataforma Android. Ele é o resultado das melhores características existentes nos layouts Relative e Linear, juntos em um layout só. Ele baseia-se no conceito de posicionamento relativo de elementos (assim como o Relative), onde cada componente está relativo à outro; e também possui preenchimento proporcional de espaços (assim como no Linear), onde podemos definir de maneira semelhante a porcentagem, o quanto de espaço cada componente vai ocupar. Atenção: Apesar de ser um recurso novo da plataforma, ele é distribuído como uma biblioteca que oferece suporte às versões de Android 2.3 ou superiores (API 9+). Caso esta opção de Layout não esteja aparecendo para você, certifique-se de estar com as opções "ConstraintLayout for Android" e "Solver for Contraint Layout" instaladas no seu SDK Manager (na seção SDK Tools). Depois de instalar esses pacotes, você deve reiniciar o Android Studio e a partir de então terá a opção de criar layouts com esse recurso. Constraints significa algo como "restrições" ou "limitações", e são essas restrições que são o cerne por trás do funcionamento deste layout manager, sendo fundamentais para sua utilização entender elas primeiro. Para definir a posição de um componente no ConstraintLayout você deve adicionar ao menos uma constraint horizontal e uma vertical para a view. Cada constraint representa uma conexão ou alinhamento em relação à outra view, o layout parent ou mesmo uma linha-guia invisível (??). Cada constraint define a posição da view a partir de seus eixos vertical e horizontal; motivo pelo qual temos de definir no mínimo essas duas constraints, embora seguidamente precisaremos de mais de duas para conseguir os comportamentos desejados. Quando você arrasta e solta uma view no Layout Editor, ela fica exatamente onde você deixar ela, mesmo que não possua constraint alguma. No entanto, isso é apenas para tornar o seu trabalho mais fácil quando estiver posicionando os elementos; se uma view não possui constraints, ela ficará no canto superior esquerdo da tela automaticamente (0,0). Embora a falta de uma constraint não cause um erro de compilação, o Layout Editor indicará a falta de constraints como um erro na toolbar. Para ajudar você a não esquecer de constraints, o Layout Editor pode automaticamente adicionar as constraints para você com os recursos Autoconnect e "Infer Constraints" que são novidades na ferramenta e que mostrarei mais adiante. Na imagem abaixo, eu arrastei um Button para o editor visual de interfaces. Quando você solta o componente ele exibe bordas ao seu redor com ícones quadrados para redimensionamento nos cantos do componente e ícones circulares para constraints nas laterais dele. Clique no componente para selecioná-lo. Então clique e segure um dos ícones circulares (constraint handle) arrastando até um ponto de ancoragem disponível (a face de outro componente, do parent layout ou uma linha-guia). Quando você soltar, a constraint será criada, com uma margem default separando os dois componentes, como mostra abaixo. Outra alternativa é simplesmente arrastar seus componentes e usar os recursos Autoconnect (ícone U) e Infer Constraints (ícone de estrelas amarelas), acessíveis na toolbar logo acima do Layout Editor. O resultado, independente do método utilizado, vai ancorar o seu Button em alguma(s) extremidade(s) da tela ou ainda em outros componentes. Quando estiver criando constraints, lembre-se das seguintes regras: ● Cada componente deve ter ao menos duas constraints: uma vertical e uma horizontal. ● Você pode criar constraints somente entre um constraint handle (o ícone circular na lateral) e um ponto de ancoragem que compartilhem o mesmo plano, ou seja, vertical com vertical e horizontal com horizontal. ● Cada constraint handle pode ser usado para apenas uma constraint, mas você pode criar várias constraints (de diferentes componentes) para um mesmo ponto de ancoragem. Para remover uma constraint, selecione o componente e então clique no constraint handle. Ou remova todas constraints selecionando a view e depois clicando em "Clear Constraints" na toolbar (ícone do x vermelho). Quando adicionamos outros componentes à este layout, podemos ancorar estes novos componentes em outros já existentes, como fazíamos com RelativeLayout no passado. No exemplo abaixo, ancorei o plano vertical do segundo botão logo abaixo do primeiro botão. Você notou que a linha da constraint fica "serrilhada" quando adicionamos constraints às duas laterais do componente? Neste caso elas atuam como âncoras opostas, cada uma puxando o componente para o seu lado, o que resulta, por padrão, em uma centralização mesmo, como podem ver na imagem anterior. Quando temos vários componentes no mesmo plano (horizontal ou vertical) podemos adicionar pesos à eles, bem como remover as margens default e muito mais técnicas avançadas que veremos ao longo do livro. Por ora, exercite o posicionamento de componentes na tela tentando montar uma "cruz" com Buttons. Será que você consegue? Calma, eu não puxei todas essas constraints aí na mão, apenas posicionei os Buttons onde gostaria que eles ficassem e usei o recurso Infer Constraints da toolbar do Layout Editor. Fácil, não?! É bem comum a necessidade de fazer um ajuste fino depois de utilizar esse recurso, pois ele tenta criar as constraints para posicionar os elementos de maneira muito eficiente, mas não consegue acertar 100% das vezes. Outros Gerenciadores de Layout Existem outros gerenciadores de layout como RelativeLayout, LinearLayout, etc. Entretanto, devido à fragmentação da plataforma Android e flexibilidade do ConstraintLayout apresentado acima, aconselha-se o uso do mesmo paraconstrução de seus apps. Widgets Comuns Durante os estudos do ConstraintLayout na seção anterior tivemos que criar um layout básico e com isso você já deve saber o básico de arrastar e soltar componentes usando o editor visual. Mas agora vamos realmente estudar os componentes do Android! Widget é o nome dado aos componentes utilizados para compor uma interface gráfica em Java. O termo vem de Windows + Gadgets, ou seja, “bugigangas de janelas”. A seguir iremos ver alguns dos principais widgets disponíveis para a plataforma Android e como utilizá-los em nossos apps. Cada widget possui uma responsabilidade específica dentro dos aplicativos Android e conhecer os essenciais lhe dará um conjunto poderoso de ferramentas para a construção de apps corporativos. Todo Widget possui uma série de propriedades que podem ser configuradas para que ele aparente e se comporte da maneira desejada. Você pode configurá-las pelo editor visual ou pelo editor XML, sendo este último bem preciso e fácil de usar, por causa do recurso de code complete que permite ao desenvolvedor digitar apenas parte do nome da propriedade e a ferramenta já completa para você. Todo widget possui essencialmente duas propriedades obrigatórias: ● layout_width: largura do componente, podendo ser fixa em dps ou relativa como match_parent (preenche toda largura do container externo) e wrap_content (expande conforme o conteúdo do widget) ● layout_height: altura do componente, que se comporta de maneira análoga ao layout_width Caso você deseje manipular (inclusive ler) este widget no seu código Java, mais tarde, deverá também definir um ID único para cada um dos seus componentes, usando a propriedade android:id com a seguinte sintaxe @+id/widgetId, substituindo widgetId pelo identificador único que deseje (como de praxe, sem acentos, espaços ou hífem). Atenção com Ids: além das regras básicas de que um id não pode ter acentos, espaços ou hífem é interessante que além de não se repetirem na mesma tela que eles não se repitam na mesma aplicação, para evitar confusões depois. Outra dica é adotar um padrão de nomenclatura como prefixo + função, muito comum entre diversos programadores. Por exemplo, se trocarmos a visualização do Layout Editor para Text ao invés de Design, veremos o código XML que gera aquela aparência dos botões que posicionamos no exercício anterior. Código 5: disponível em luiztools.com.br/livro-android-fontes <Button android:id="@+id/btnNorte" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" tools:layout_constraintTop_creator="1" tools:layout_constraintRight_creator="1" app:layout_constraintRight_toRightOf="parent" android:layout_marginTop="16dp" tools:layout_constraintLeft_creator="1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> Note como boa parte deste código não foi escrita por mim, mas na verdade gerado pelo editor visual. Aqui, a única alteração que fiz foi na propriedade android:id, que defini como @+id/btnNorte, representando o botão mais ao norte no layout. Coloquei esse nome para ser fácil de entender onde está cada componente mesmo que você esteja visualizando o XML ao invés de estar vendo o Design. A maioria dessas propriedades são idênticas à todos componentes que estudaremos neste capítulo. Passaremos por cada um dos componentes principais da plataforma estudando suas principais propriedades. TextView O TextView é o componente padrão para exibição de textos estáticos (que não permitem edição do usuário) em apps Android. Chamado de Label na maioria das outras plataformas, possui essencialmente a propriedade text, que define o texto a ser exibido e as propriedades iniciadas por ‘font’ que definem as configurações visuais do texto, como tamanho, cor, família, etc. Para colocar um TextView em um formulário, você deve arrastá-lo da paleta para dentro do seu layout, obtendo o código XML que segue (neste exemplo foi usado um Large Text): Código 14: disponível em luiztools.com.br/livro-android-fontes <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Texto Grande" android:id="@+id/lblTeste" /> Note que defini a propriedade text como “Texto Grande” e a propriedade id como “@+id/lblTeste”. O resultado esperado é bem simples, como segue: Para manipular este TextView através do nosso código Java, devemos criar uma variável do tipo TextView em nossa Activity, carregando-a com o método findViewById, que mostra a importância de definirmos bons ids para nossos controles, visando nos lembrarmos deles depois. Esse tipo de carregamento somente funciona se o controle existir no XML que foi carregado pelo setContentView, bem como se chamarmos o controle após o carregamento do setContentView, como no exemplo. Código 15: disponível em luiztools.com.br/livro-android-fontes @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); TextView lblTeste = (TextView)findViewById(R.id.lblTeste); String teste = lblTeste.getText().toString(); lblTeste.setText("Outro teste"); } Neste exemplo, carregamos a lblTeste e depois lemos seu conteúdo, para em seguida trocarmos ele usando os métodos getText (leitura) e setText (escrita). Note que o método getText() do TextView não retorna uma String, mas sim um CharSequence. Basta convertermos o mesmo com o bom e velho toString() e o problema está resolvido. EditText Tão comum e útil quanto os TextViews, os controles EditText são campos de texto que podem ser manipulados tanto via código quanto pelo usuário. O que diferem os EditText do Android dos TextBox tradicionais de outras plataformas é o uso do teclado virtual. Muito comum em smartphones, os teclados virtuais possibilitam que dispositivos touch exibam um teclado completo para digitação nos campos, poupando custos de hardware (com teclados físicos) e proporcionando uma experiência mais intuitiva. Código 16: disponível em luiztools.com.br/livro-android-fontes <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:text="" android:id="@+id/txtTeste"/> Uma vez que a digitação em teclados virtuais nem sempre é tão prática quanto em teclados convencionais, onde temos mais espaço para posicionar as teclas (e mãos), o Android fornece a opção de definir o tipo de entrada que vai ser disponibilizada para o usuário, como textos numéricos, nomes próprios, senhas, etc, o que muda automaticamente o comportamento do teclado virtual, que passa a exibir primariamente os números ou letras, por exemplo. Na paleta de componentes estão disponíveis uma série de componentes EditText pré- configurados e você deve usá-los conforme a necessidade, sendo que suas configurações básicas não mudam. Arraste um para um layout XML e veja o que acontece com o teclado virtual quando você executa esse app no emulador Android: ele se ajusta para a digitação ser mais coerente com o campo. Esse efeito é da propriedade inputType que define o tipo de texto que planejamos colocar nesse EditText. No caso do inputType estar com o valor textPersonName, o próprio teclado virtual vai gerenciar o uso de maiúsculas e minúsculas nas palavras que irão compor o nome próprio que será escrito, sem a necessidade de Shift ou Caps-Lock. Outros inputTypes possíveis incluem numberDecimal, que faz com que o teclado virtual já venha com os números à mostra. Independente do inputType do EditText, a sua manipulação através de código Java é idêntica. Sempre que quiser definir o texto presente no EditText ou ler a informação que o usuário inseriu lá, use o seguinte código Java: Código 17: disponível em luiztools.com.br/livro-android-fontes EditText txtTeste = (EditText)findViewById(R.id.txtTeste); String texto = txtTeste.getText().toString(); txtTeste.setText("Novo teste"); Nesteexemplo, carregamos o EditText usando método findViewById, disponível em todas Activities do seu projeto, passando o id do controle que estamos carregando. Imediatamente abaixo podemos manipular qualquer propriedade do EditText, incluindo a notória propriedade text, através dos métodos get e set definidos na especificação Java. Atenção sobre foco: é possível colocar no editor XML uma marcação (tag) especial para dizer que um EditText requer o foco da tela (i.e. será o primeiro a ser preenchido), conforme mostrado abaixo. Código 18: disponível em luiztools.com.br/livro-android-fontes <EditText android:layout_width="match_parent" android:layout_height="wrap_content"> <requestFocus /> </EditText> Entretanto, caso o EditText seja o primeiro campo do formulário, ele automaticamente será o foco da tela. Algumas vezes não queremos isso, como em barras de pesquisa, e para desabilitar este recurso automático basta definirmos no layout imediatamente acima as propriedades focusable=true e focusableInTouchMode=true. Em geral você irá usar TextViews como rótulos e EditTexts como entradas de texto, em uma combinação muito comum de ser vista em formulários de qualquer plataforma (web, desktop e mobile). Entretanto, o controle EditText também lhe permite incluir um rótulo temporário dentro do mesmo, como os populares placeholders da web, usando a propriedade android:hint. Um hint fica visível com o texto que você definir até que o usuário toque no campo e preencha o seu valor personalizado. Isto pode ser utilizado tanto para dar mais informações ao usuário quanto para eliminar por completo o uso de rótulos e criar formulários que usem melhor dos espaços da tela, como no exemplo abaixo. Button e ImageButton Nenhum formulário está completo sem botões. Seja para salvar, cancelar, limpar ou validar um formulário, o widget Button pode ser usado. A diferença crucial entre o Button tradicional e o ImageButton é que o segundo pode possuir uma imagem criada por você ao invés do tradicional formato retangular com texto dentro. No mais, são exatamente iguais. Arraste um Button para seu formulário (sendo que o Android define alguns tamanhos pré- definidos de botões na paleta que podem lhe ajudar) e teremos o seguinte código no editor XML. Código 19: disponível em luiztools.com.br/livro-android-fontes <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Botão" android:id="@+id/btnTeste" /> Não há muito o que configurar em um botão tradicional. Você pode definir seu layout_width e layout_height (largura e altura do botão), seu text, seu id (para ser usado depois no código Java) e talvez até seu background (cor de fundo). Independente de qualquer configuração, é certo que você irá querer que seu botão dispare algum código Java quando clicado. Para fazer isso, vamos modificar levemente o código apresentado acima para incluir uma propriedade muito importante, a onClick: Código 20: disponível em luiztools.com.br/livro-android-fontes <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Botão" android:id="@+id/btnTeste" android:onClick="exibirMensagem" /> Na propriedade onClick definimos o nome do método público da Activity que será executado quando este botão for clicado. Caso este método não exista, isso irá gerar um erro no app, então vamos até o código de nossa Activity para programar este método, que deve conter o mesmo nome colocado na propriedade onClick, bem como apenas um parâmetro, do tipo View (essa é uma obrigação do Android). Código 21: disponível em luiztools.com.br/livro-android-fontes @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cadastro); } public void exibirMensagem(View v){ Toast.makeText(this, "Exemplo!", Toast.LENGTH_LONG).show(); } O trecho de código que foi colocado dentro do método exibirMensagem é o chamado Toast em Android. Um Toast (“torrada”) é uma mensagem de alerta que aparece e some sozinha, sem interação do usuário. Os três parâmetros do método estático makeText são o contexto de execução, a mensagem e o tempo de duração do Toast na tela. Quando botão for clicado, irá exibir o Toast, como na imagem a seguir. Como você já deve ter entendido, para cada botão que eu quiser que seja disparado em minha Activity, terei de criar um método para tratar o evento onClick dele. Embora essa não seja a única maneira de fazer a ligação do evento onClick como código Java, sem sombra de dúvida é a mais fácil. Também é possível criar apenas um método para tratar todos os botões, pois o parâmetro view contém todas as informações sobre qual o botão que disparou este método. Entretanto esta abordagem não é usual, a menos que muitos botões tenham comportamentos muito parecidos, como em uma calculadora. Atenção com o Toast: é muito comum os programadores esquecerem que o Toast exige a chamada do método show() para que apareça de fato na tela do app. Para finalizar, com relação ao ImageButton, a única alteração a ser feita é a exibição de uma imagem que já deve estar em seu projeto, na pasta de res/drawable, como esta abaixo, por exemplo (vip.png). Cada imagem deve ter um nome único (como de praxe, não pode conter acentos, hífen ou espaços) e este nome servirá como identificador único da mesma na aplicação. Configuramos a imagem no botão da seguinte maneira: Código 22: disponível em luiztools.com.br/livro-android-fontes <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/salvar" android:onClick="salvar" android:id="@+id/btnImagem"/> Note que a propriedade src define qual a imagem que vai ser utilizada, sem a sua extensão (neste caso, salvar.png). Note também que o ImageButton também possui uma propriedade onClick, que define o método Java a ser executado na Activity que carregar este layout, assim como o botão tradicional. Atenção sobre imagens: imagens de botões geralmente são ícones que ilustram o que aquele botão faz, como um disquete para salvar ou uma lixeira para excluir. Um bom site para baixar ótimos ícones gratuitos é o http://www.iconfinder.com e outro é o http://www.findicons.com. Você também pode carregar a imagem dinamicamente a partir da web ou a partir do cartão SD do dispositivo do usuário, em tempo de execução. Para isto, veja mais à frente o funcionamento do carregamento dinâmico de imagens como o widget ImageView, que é idêntico ao ImageButton, com exceção de que não dispara eventos ao ser clicado. Spinner Muitas vezes precisamos exibir diversas opções aos usuários mas temos um espaço limitado para tal. Um Spinner é um widget que permite que o usuário selecione apenas uma opção dentre inúmeras disponíveis, como uma lista de estados ou de profissões. Em alguns frameworks este controle também é chamado de ComboBox ou DropDownList. Arraste um Spinner para um layout XML e vamos configurá-lo! Código 23: disponível em luiztools.com.br/livro-android-fontes <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content" http://www.iconfinder.com http://www.findicons.com android:id="@+id/spinner" /> As opções que serão listadas no Spinner podem ser configuradas via arquivo XML ou via código Java. Para configurar via arquivo XML (maneira mais fácil) você deve criar dentro da pasta res/values um novo arquivo XML (Values resource files) com o nome de estados.xml (por exemplo). Coloque o seguinte conteúdo dentro dele: Código 24: disponível em luiztools.com.br/livro-android-fontes <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="estados"> <item>RS</item> <item>SC</item> <item>PR</item> </string-array> </resources> Neste exemplo coloquei apenas os 3 estados do sul do país para não ficar tão extenso, mas você deve ter entendido a ideia. Aqui criamos um array de Strings com o nome de “estados”, contendo diversos itens, sendo cadaitem a sigla de um estado. Agora no Spinner, para linkarmos o XML de estados com o widget, usamos a propriedade entries, como segue: Código 25: disponível em luiztools.com.br/livro-android-fontes <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/spinner" android:entries="@array/estados"/> Com isso, carrega-se o conteúdo do arquivo estados.xml para dentro do Spinner durante a criação da tela no app, automaticamente, como mostra na imagem abaixo. A outra maneira de carregarmos os itens do Spinner é através de código Java. A primeira opção é ótima quando sua lista possui um número pré-definido de elementos e isto não será alterado no decorrer do uso do app. Entretanto, em alguns casos é necessário carregar os dados de alguma fonte externa, ou gerá-los dinamicamente por algum motivo. A criação de um spinner dinâmico é idêntico ao que foi mostrado antes, exceto que não definimos a propriedade entries do mesmo no XML e nem precisamos criar um arquivo XML como feito com os estados. A grande mágica se dá no código Java onCreate da Activity, como segue: Código 26: disponível em luiztools.com.br/livro-android-fontes @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cliente); String[] array = {"RS","SC","PR"}; ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, array); Spinner spinner = (Spinner)findViewById(R.id.spinner); spinner.setAdapter(adapter); } Note que carregamos o spinner através do método findViewById buscando pelo id definido no XML de layout. Logo abaixo, temos um array estático de Strings com os estados do sul/sudeste do Brasil. Note que este array pode ser gerado dinamicamente ou mesmo criado através de uma fonte externa, para que na linha de baixo, possamos inseri-lo em um ArrayAdapter. O Android trabalha com ArrayAdapters para adequar cada elemento de um array a um layout de item e usamos para isso um layout padrão do Android denominado android.R.layout.simple_spinner_item, embora existam diversas outras opções e inclusive podemos criar o nosso próprio layout de item para spinner. O efeito é o mesmo do método anterior, como mostrado a seguir. Caso a gente queira descobrir qual item que foi selecionado, no clique de um botão Salvar, por exemplo, basta utilizarmos o método getSelectedItem() do Spinner, que retorna um object que facilmente pode ser convertido para String usando toString(). O exemplo abaixo também mostra como podemos definir, via código Java, qual será o elemento selecionado do Spinner. Código 27: disponível em luiztools.com.br/livro-android-fontes //carrega o spinner em uma variável local Spinner spinner = (Spinner)findViewById(R.id.spinner); //pega o item selecionado do Spinner em formato texto String uf = spinner.getSelectedItem().toString(); //muda o item selecionado do spinner passando a posição spinner.setSelection(1); E por último, mas não menos importante, existem ocasiões em que você quer que alguma ação seja realizada toda vez que um item for selecionado (imediatamente). Nestes casos, você deve linkar o controle spinner com um código Java em sua Activity. Não há qualquer alteração a ser realizada no XML do exemplo de carregamento do Spinner, apenas no código Java da Activity, como segue. Código 28: disponível em luiztools.com.br/livro-android-fontes @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cliente); String[] array = {"RS","SC","PR"}; ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, array); final Spinner spinner = (Spinner)findViewById(R.id.spinner); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String uf = spinner.getSelectedItem().toString(); Toast.makeText(getBaseContext(), "UF selecionado: " + uf, Toast.LENGTH_LONG).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } Note como foi criado uma variável Spinner no escopo da classe mas fora do evento onCreate. Isso garante que a variável seja carregada apenas uma vez no onCreate e chamada quantas vezes precisar dentro a activity. Este evento será disparado toda vez que um item do spinner for selecionado. Para o código a ser executado, apenas um Toast exibindo o estado que foi selecionado. Note que poderia ser a chamada Java que você quisesse, como por exemplo carregar outro spinner na sequência com as cidades daquele estado, por exemplo, ou ocultar/exibir outro campo. O Spinner é um componente muito poderoso e ele permite inclusive que possamos criar layouts inteiramente personalizados. Claro, essa não é uma tarefa muito trivial e é de necessidade duvidosa uma vez que listagens complexas deveriam ser ListViews (ver mais adiante, na seção de Containers). Entretanto, existe mais uma coisa “avançada” que devemos aprender antes de avançar para o próximo widget: Spinners com chave-valor! Basicamente queremos que o Spinner exiba um texto, como o nome do estado, mas quando a gente quiser ler o que foi selecionado, queremos pegar um código, como a sigla do estado. Como fazer isso? É mais fácil do que parece e primeiramente iremos precisar criar uma classe Estado no package principal do nosso app. Nossa classe Estado, que está ilustrada abaixo, possui apenas dois atributos (nome e sigla), um construtor e a sobrecarga do método toString forçando os objetos de Estado a retornarem o seu nome quando forçados a se tornarem Strings. Por quê? Veremos daqui a pouco, apenas confie em mim por enquanto! Código 29: disponível em luiztools.com.br/livro-android-fontes public class Estado { private String nome; private String sigla; public Estado(String nome, String sigla){ this.nome = nome; this.sigla = sigla; } public String getNome(){ return this.nome; } public String getSigla(){ return this.sigla; } @Override public String toString(){ return this.nome; } } A seguir, o código de carregamento do nosso ArrayList de estados, que obviamente poderia ser carregado a partir de um banco de dados ou webservice. Por ora, deixaremos estático dentro do evento onCreate de uma Activity qualquer (a mesma que terá o Spinner de estados). Após carregarmos os estados, criamos nosso ArrayAdapter, mas desta vez ao invés de usarmos Strings simples usaremos um ArrayAdapter<Estado> que permite que coloquemos o nosso List<Estado> dentro, para em seguida carregar nosso Spinner e definirmos o adapter com setAdapter. Código 30: disponível em luiztools.com.br/livro-android-fontes List<Estado> array = new ArrayList<>(); array.add(new Estado("Rio Grande do Sul", "RS")); array.add(new Estado("Santa Catarina", "SC")); array.add(new Estado("Paraná", "PR")); ArrayAdapter<Estado> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, array); final Spinner spinner = (Spinner)findViewById(R.id.spinner); spinner.setAdapter(adapter); Como pode ter notado, este trecho é praticamente idêntico ao do Spinner normal que usa apenas Strings. A diferença maior se dará em seu comportamento, então vamos programar o evento de item selecionado do Spinner: Código 31: disponível em luiztools.com.br/livro-android-fontes spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Estado uf = (Estado)spinner.getSelectedItem(); Toast.makeText(getBaseContext(), "UF selecionado: " + uf.getSigla(), Toast.LENGTH_LONG).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); Note que ao usar o método getSelectedItem() sobre o objeto spnEstados conseguimos obter acesso ao objeto Estado original e com isso podemos
Compartilhar