Baixe o app para aproveitar ainda mais
Prévia do material em texto
E d i t o r a SÃO PAULO/ SP Desenvolvimento de Aplicativos para Dispositivos Móveis RAFAEL MUNHOZ ALMEIDA DA SILVA Editora: E d i t o r a 1º EDIÇÃO - 2021 | SÃO PAULO/ SP RAFAEL MUNHOZ ALMEIDA DA SILVA DESENVOLVIMENTO DE APLICATIVOS PARA DISPOSITIVOS MÓVEIS DESENVOLVIMENTO DE APLICATIVOS PARA DISPOSITIVOS MÓVEIS EXPEDIENTE COORDENAÇÃO GERAL Nelson Boni COORDENAÇÃO DE REVISÃO ORTOGRÁFICA Esthela Malacrida AUTOR(ES) Rafael Munhoz Almeida da Silva COORDENAÇÃO, PROJETO GRÁFICO E CAPA João Guedes 1º EDIÇÃO - 2021 | SÃO PAULO/ SP Ficha Catalográfica/ ISBN CATALOGAÇÃO ELABORADA POR GLAUCY DOS SANTOS SILVA - CRB8/6353 E d i t o r a 4 Apresentação Prezado Aluno, V ivemos na era dos aplicativos para dispositivos mó-veis, hoje em dia os dispositivos móveis são muito acessíveis economicamente e a maioria da popula- ção possui pelo menos um destes dispositivos, o que gera uma demanda muito alta do mercado por profissionais com a habilidade de desenvolver este tipo de software. Neste livro você vai entrar em contato com o desenvolvi- mento de aplicativos para dispositivos móveis utilizando a plataforma Android. Você verá como instalar o ambiente de desenvolvimento oficial do Android que é o Android Studio. Terá uma introdução sobre a nova linguagem oficial de programação chamada Kotlin, aprenderá a usar o editor de layout para construir interfaces gráficas e ao longo do material irá desenvolver dois aplicativos. Portanto desejo a você estudante, uma ótima leitura, e que você se divirta ao conhecer um pedacinho deste enorme mundo que é o de desenvolvimento de aplicativos para dis- positivos móveis. Bons Estudos! � SUMÁRIO: UNIDADE 1: PROGRAMANDO PARA O ANDROID ���������������������������������1-1 CAPÍTULO 1: INTRODUÇÃO AO ANDROID ��������������������������������������������� 1-2 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 1-10 CAPÍTULO 2: INTRODUÇÃO AO ANDROID STUDIO ������������������������������������ 2-1 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 2-11 UNIDADE 2: INTRODUÇÃO A LINGUAGEM KOTLIN �������������������������������3-1 CAPÍTULO 3: VARIÁVEIS, TIPOS E OPERADORES ������������������������������������ 3-2 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 3-21 CAPÍTULO 4: CONTROLE DE FLUXO���������������������������������������������������� 4-1 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 4-12 UNIDADE 3: APROFUNDANDO NA LINGUAGEM KOTLIN �������������������������5-1 CAPÍTULO 5: LISTAS E FUNÇÕES ������������������������������������������������������ 5-2 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 5-13 CAPÍTULO 6: CLASSES ������������������������������������������������������������������ 6-1 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 6-17 UNIDADE 4: PRIMEIRO APLICATIVO: ÁLCOOL OU GASOLINA �������������������7-1 CAPÍTULO 7: DEFININDO O LAYOUT ��������������������������������������������������� 7-2 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 7-13 CAPÍTULO 8: CODIFICANDO A ACTIVITY ���������������������������������������������� 8-1 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 8-15 UNIDADE 5: SEGUNDO APLICATIVO: LISTA DE COMPRAS ����������������������9-1 CAPÍTULO 9: RECYCLERVIEW E RECYCLERADAPTER ������������������������������� 9-2 EXERCÍCIOS PROPOSTOS ������������������������������������������������� 9-31 CAPÍTULO 10: VISUALIZANDO E ADICIONANDO ITENS ������������������������������ 10-1 EXERCÍCIOS PROPOSTOS ������������������������������������������������ 10-26 UNIDADE 6: PERSISTÊNCIA NO APLICATIVO LISTA DE COMPRAS ����������� 11-1 CAPÍTULO 11: CRIANDO A CAMADA DE PERSISTÊNCIA ���������������������������� 11-2 EXERCÍCIOS PROPOSTOS ������������������������������������������������ 11-12 CAPÍTULO 12: INTEGRANDO A CAMADA DE PERSISTÊNCIA ����������������������� 12-1 EXERCÍCIOS PROPOSTOS ������������������������������������������������ 12-17 REFERÊNCIAS ��������������������������������������������������������� 13-1 GABARITO ������������������������������������������������������������� 14-1 D I S C I P L I N A : Desenvolvimento de Aplicativos para Dispositivos Móveis UNIDADE 1: PROGRAMANDO PARA O ANDROID Caro(a) Aluno(a) Seja bem-vindo(a)! Nesta primeira unidade iremos dar início aos estudos, vere- mos uma breve visão histórica do sistema operacional Android. Nesta unidade também veremos de maneira geral a arquitetura da plataforma. Ótimos estudos! Conteúdos da Unidade: Evolução do sistema operacional Android, Visão geral da ar- quitetura, Instalação do ambiente de desenvolvimento oficial, Desenvolvimento do projeto Hello World. D I S C I P L I N A : Desenvolvimento de Aplicativos para Dispositivos Móveis CAPÍTULO 1: INTRODUÇÃO AO ANDROID 1-3 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > 1�1 O sistema operacional Android No início dos anos 2000, os celulares estavam começando a se popularizar, o tamanho dos aparelhos estava diminuindo, ou- tras funcionalidades estavam sendo embarcadas nos aparelhos, tais como agendas eletrônicas e até mesmo jogos. Com o aumento da produção o custo dos aparelhos começou a diminuir tornando o celular um dispositivo acessível a uma boa parte da população. Porém cada fabricante possuía o seu próprio sistema embar- cado, ou seja, um aplicativo desenvolvido para um celular de um determinado fabricante não seria compatível com outro dispositi- vo de outro fabricante. Ou seja, para que um aplicativo funcionasse em vários dispo- sitivos ele teria que ser reescrito e recompilado, gerando custo de desenvolvimento e manutenção. Já prevendo que o smartphone nasceria em breve o primeiro sistema operacional comum foi criado. Este sistema é o Symbian, que possuía código fechado, os aplicativos escritos para ele deve- riam usar a linguagem C++. Alguns anos mais tarde nasce o Android, que é um sistema operacional aberto, ou seja, os fabricantes poderiam customizá-lo, diferente do Symbian que era fechado. Os aplicativos para o sistema operacional Android podem ser escritos em C++ e Java. Existem várias teorias que descrevem o sucesso do Android sobre o Symbiam, algumas dizem que o Android foi mais aceito pois era mais fácil de desenvolver aplicativos, pois o framework, 1-4 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > que são as ferramentas que usamos para fazer campos de texto, tablets etc, eram mais fáceis de entender. E na época a linguagem Java tinha uma curva de aprendiza- do bem menor que a linguagem C++. Algumas teorias afirmam que o Android, por ser um sistema operacional de código fonte aberto, ou seja, por poder ser custo- mizado pelos fabricantes foi mais bem aceito e se espalhou pela maioria deles. Quando o Android foi lançado para uso público, ele já pos- suía todo um ecossistema para a distribuição dos aplicativos, ou seja, era muito mais fácil encontrar e instalar aplicativos para os dispositivos baseados em Android do que para os dispositivos Symbian, alguns analistas dizem que esse foi o principal fator que fez do Android o sistema operacional mais popular para dispositi- vos móveis. 1.1.1 Evolução do sistema Android O sistema android já possui aproximadamente 13 anos, du- rante este tempo várias versões foram lançadas e cada uma delas possui um apelido, baseado no nome de um doce. Veja na tabela abaixo o resumo com todas as versões lançadas: Tabela 1-1: Evolução das versões do Android Versão Apelido Lançamento API 11 Android 11 (R) 8 de setembro de 2020[231] 30 10 Android 10 (Q) 3 de setembro de 2019 29 9 Pie 6 de agosto de 2018 28 1-5 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > Versão ApelidoLançamento API 8.1 Oreo 15 de dezembro de 2017 27 8.0 21 de agosto de 2017 26 7.1.x Nougat 5 de dezembro de 2016 25 7.0.x 22 de agosto de 2016 24 6.0.-6.0.1 Marshmallow 05 de Outubro de 2015 23 5.1-5.1.1 Lollipop 10 de março de 2015 22 5.0-5.0.2 12 de novembro de 2014 21 4.4-4.4.4 KitKat 31 de outubro de 2013 19 4.3.x Jelly Bean 24 de julho de 2013 18 4.2.x 13 de novembro de 2012 17 4.1.x 9 de julho de 2012 16 4.0.3–4.0.4 Ice Cream Sandwich 16 de dezembro de 2011 15 2.3.3–2.3.7 Gingerbread 9 de fevereiro de 2011 10 2.2-2.2.3 Froyo 20 de maio de 2010 8 2.0-2.1 Eclair 26 de outubro de 2009 5 1.6 Donut 15 de setembro de 2009 4 1.5 Cupcake 27 de abril de 2009 2 1.0-1.1 Petit Four ou Beta 23 de setembro de 2008 1 Fonte: https://pt.wikipedia.org/wiki/Android 1�2 Arquitetura da plataforma Android Podemos dividir a plataforma Android em várias camadas com diferentes níveis de abstração, veja abaixo a figura com essas camadas, começando do nível de abstração maior para o menor: 1-6 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > Figura 1-1: Android Studio 1-7 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > 1.2.1 System Apps Nesta camada encontraremos os aplicativos tais como o Dialer (Aplicativo de telefone), aplicativo de e-mail, aplicativo de calendário entre outros. Como o Android possui o código fonte aberto, podemos modificar estes aplicativos para satisfazer as necessidades de um determinado fabricante, como por exemplo podemos modificar o aplicativo de telefone para que ele recuse chamadas de números considerados indesejáveis. 1.2.2 Java API Framework Quando criamos um aplicativo Android usando tanto a lin- guagem Java quanto a linguagem Kotlin não precisamos nos pre- ocupar com elementos básicos de visualização, como campos de texto, listas entre outros elementos tais como as bibliotecas de no- tificação localização e até mesmo as classes do tipo Activity que representam cada tela da aplicação Android. Mais adiante no material você vai aprender mais sobre o que são classes e o mais importante o que é uma classe do tipo Activity. Durante o desenvolvimento dos projetos deste livro você criará e usará muito as classes do tipo Activity. 1.2.3 Native C/C++ Libraries / Android Runtime É nessa camada que estão as bibliotecas implementadas em C/C++, temos por exemplo nesta camada, a biblioteca OpenGL ES, muito utilizada em computação gráfica. 1-8 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > A biblioteca Webkit utilizada no processamento de páginas html, código javascript entre outras funcionalidades de um browser de internet. As bibliotecas desta camada também podem ser acessadas por meio da linguagem Java, na camada Java API Framework. A Android Runtime (ART) é a máquina virtual que processa o bytecode do Java/Kotlin. Quando um aplicativo é compi- lado para a plataforma Android, tanto na linguagem Java quanto na linguagem Kotlin, teremos como produto um arquivo do tipo .DEX é neste arquivo que teremos o bytecode do código que será lido pela ART. Podemos também desenvolver aplicativos nativos para esta camada utilizando o Android NDK, ou seja, podemos escrever di- retamente código C++ que será compilado pelo NDK. 1.2.4 Hardware Abstraction Layer (HAL) Aqui encontramos as abstrações dos dispositivos do sistema tais como sensores, câmera de vídeo, bluetooth entre outros. Cada um destes dispositivos vai prover nesta camada uma interface para que ele possa ser acessado por código Java ou Kotlin. Um exemplo é quando queremos abrir a câmera em nosso aplicativo, usaremos a linguagem Kotlin ou Java para manipular a interface deste hardware que é fornecida pela camada HAL. 1.2.5 Linux Kernel Como última camada da arquitetura temos o kernel do linux, que fornece a todas as camadas acima, funcionalidades de sistema 1-9 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID 1< / > operacional como gerenciamento de memória, controle de proces- sos entre outras. É nesta camada que os fabricantes também desenvolvem os drivers específicos para o hardware dos dispositivos. Como por exemplo um fabricante desenvolve um telefone novo, com um novo controlador de rede, é na camada do kernel que ele vai imple- mentar o novo driver para este novo hardware. 1-10 � EXERCÍCIOS PROPOSTOS 1) Escolha a alternativa correta sobre o sistema operacional Android: ( ) -a) Este sistema operacional Android não possui código aberto. ( ) -b) Não podemos usar a linguagem C++ para escrever aplicati- vos para o sistema operacional Android. ( ) -c) Um aplicativo escrito para um dispositivo em Android deve- rá ser reescrito para outro dispositivo de hardware diferente e mesma versão do Android. ( ) -d) O Android é um sistema operacional de código aberto e pode ser customizado por qualquer fabricante de celulares. ( ) -e) A linguagem Java não pode ser mais utilizada no desenvolvi- mento de aplicativos Android. 2) Escolha a alternativa correta sobre a API 30 do Android ( ) -a) A API 30 ainda não foi lançada. ( ) -b) A API 30 é da versão 8.1 ( ) -c) A API 30 foi lançada em 21 de agosto de 2017 ( ) -d) A API 30 foi lançada em 8 de setembro de 2020 ( ) -e) N.d.a. 3) Escolha a alternativa correta que afirma por que o sistema operacional Android superou o sistema operacional Symbian: ( ) -a) O sistema operacional Android superou o Symbian pois o Android era um sistema de código fechado e não poderia ser customizado pelos fabricantes, tornando ele muito mais ro- busto pois seu código fonte não poderia ser modificado. ( ) -b) Segundo os desenvolvedores, apesar do framework de de- senvolvimento do Android ser mais complicado pois não possui elementos já prontos como caixas de texto e botões, 1-11 EX ER C ÍC IO S P R O P O S TO S o Android superou o Symbian pois seus aplicativos eram es- critos em java. ( ) -c) O Android superou o Symbian por possuir um framework completo com muitos elementos gráficos e outras bibliote- cas como conexão de rede, acesso ao sistema de arquivos, além de ser de código aberto e de possuir um ecossistema completo para o download de aplicativos. ( ) -d) O Android superou o Symbian apenas por possibilitar o de- senvolvimento dos aplicativos usando a linguagem Java. ( ) -e) Nda. 4) Qual é o nível de software que fornece para as outras camadas gerencia- mento de memória e controle de processos: ( ) -a) É a camada do Kernel do Linux. ( ) -b) É a camada chamada HAL. ( ) -c) É a System Apps. ( ) -d) É a Java API Framework. ( ) -e) É a Android Runtime. 5) Escolha a afirmativa correta sobre o arquivo DEX ( ) -a) É neste arquivo que escrevemos o código fonte do nosso aplicativo em Kotlin ou em Java. ( ) -b) É neste arquivo que o compilador escreve o bytecode origi- nário do código Kotlin ou Java que foi escrito, este arquivo será processado diretamente no Kernel do Linux. ( ) -c) É neste arquivo que o compilador escreve o bytecode origi- nário do código Kotlin ou Java que foi escrito, este arquivo será processado pela Android Runtime que está no nível das bibliotecas de código nativo C/C++. ( ) -d) Arquivos DEX não estão disponíveis na plataforma Android. ( ) -e) N.d.a. 1-12 EX ER C ÍC IO S P R O P O S TO S 6) Quando criamos um aplicativo de lista de compra, para a plataforma Android escrito nas linguagens Java ou Kotlin, em qual camada este apli- cativo pode ser classificado: ( ) -a) Na camada Java API Framework, pois o código Java e o có- digo Kotlin serão executados pela ART. ( ) -b) Será classificado como a camada Android Runtime, pois este código será executado pela máquina virtual implementada neste nível. ( ) -c) Este aplicativo de lista de compras será classificado na ca- mada chamada System Apps. ( ) -d) O aplicativo deverá ser classificado nacamada Native C/C++ pois o código Kotlin ou Java vai virar código C/C++ depois de compilado. ( ) -e) O aplicativo será considerado como sendo da camada HAL pois precisará acessar a tela e portanto terá que fazer uma abstração de hardware. 7) Digamos que um fabricante vai lançar um novo hardware que mede a temperatura do ambiente pelo celular, considere esta situação e escolha abaixo a afirmativa correta ( ) -a) O Fabricante deverá apenas criar um aplicativo na camada System Apps para mostrar a temperatura. ( ) -b) O Fabricante deverá modificar o Android Runtime, para que o arquivo .DEX que possua o código deste novo sensor de temperatura possa ser interpretado. ( ) -c) O Fabricante deverá apenas criar uma abstração no nível HAL e os desenvolvedores poderão acessar este novo sensor em seus aplicativos. ( ) -d) O Fabricante deverá incluir o código do driver no nível do kernel do Linux e criar uma abstração na camada HAL. Com isso já será suficiente para que um desenvolvedor crie um aplicativo escrito em Java ou Kotlin para mostrar de forma gráfica a temperatura do ambiente. ( ) -e) O Fabricante deverá esperar o Google implementar o driver do novo sensor de temperatura, pois o código do Android é fechado. 1-13 EX ER C ÍC IO S P R O P O S TO S 8) Sobre a Android Runtime (ART) escolha a alternativa verdadeira. ( ) -a) A Android Runtime fica na camada JAVA API Framework pois é a máquina virtual que executa os aplicativos compila- dos em Java ou Kotlin. ( ) -b) A Android Runtime fica no mesmo nível da camada Native C/C++ e é responsável por executar o código compilado dos aplicativos escritos em Java ou Kotlin. ( ) -c) A Android Runtime executa apenas código compilado que foi escrito na linguagem C/C++ ( ) -d) A Android Runtime não acessa as bibliotecas escritas em C/ C++ ( ) -e) A Android Runtime não processa arquivos do tipo .DEX 9) Sobre a Java API Framework, escolha a alternativa verdadeira ( ) -a) Quando precisamos de um elemento gráfico, como por exemplo um campo texto, utilizamos a Java API Framework. ( ) -b) A Java API Framework é responsável pelo controle de me- mória de baixo nível. ( ) -c) A Android Runtime fica na camada da Java API Framework. ( ) -d) Um aplicativo escrito em Kotlin não pode usar as classes da Java API Framework. ( ) -e) É na Java API Framework onde estão implementados os dri- vers de controle do hardware. 10) Qual camada fornece uma abstração para o acesso do hardware que con- trola a câmera de um dispositivo. ( ) -a) A camada do Linux Kernel, pois é nela que os drivers estão escritos. ( ) -b) É na Java API Framework, pois a abstração está escrita em Java. ( ) -c) É na camada Hardware Abstraction Layer. ( ) -d) As classes de abstração para o acesso ao hardware estão es- critas na camada de System Apps. ( ) -e) N.d.a. D I S C I P L I N A : Desenvolvimento de Aplicativos para Dispositivos Móveis CAPÍTULO 2: INTRODUÇÃO AO ANDROID STUDIO 2-2 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > 2�1 Instalando e utilizando o Android Studio No início a plataforma Android não possuia uma IDE (In- tegrated Development Environment), ou seja, cabia ao de- senvolvedor baixar todas as ferramentas necessárias, tais como o Java, o SDK do Android, o Emulador do Android, e alguma outra ferramenta que integrava todas essas, geralmente era utilizado o Eclipse com um plugin para o desenvolvimento Android. Isso tudo mudou quando o Android Studio foi criado, basea- do no IntelliJ, o Android Studio baixa automaticamente todas as ferramentas necessárias para o desenvolvimento de aplicati- vos Android. O Android Studio pode ser instalado nos sistemas operacio- nais Windows, Mac OS e Linux, para isso acesse o link https:// developer.android.com/studio e baixe o executável de instalação do sistema operacional que você está utilizando e siga os passos da instalação. Quando a instalação terminar, execute o aplicativo do An- droid Studio, você deverá ver algo similar a figura abaixo no mo- mento da execução: 2-3 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > Figura 2-1: Android Studio 2.1.1 Primeiro projeto Android Agora que temos o Android Studio instalado e rodando, te- mos tudo o que precisamos para criar o nosso primeiro projeto, este projeto será bem simples pois apenas mostrará na tela do dis- positivo móvel o texto: “Olá Mundo”. Para isso, clique no botão New Project, escolha a opção Phone and Tablet e em seguida a opção Empty Activity, com as duas opções selecionadas clique no botão Next, como mostrado na figura abaixo: 2-4 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > Figura 2-2: Criando novo projeto Na próxima tela você deverá dar um nome ao seu aplicativo, vamos chamá-lo de OlaMundo, este texto vai no campo Name. O próximo campo chamado Package Name, é o nome do pacote básico do seu projeto, o texto que vai aqui é geralmente o in- verso de um domínio, que pode ser o domínio de uma página do seu aplicativo, no meu caso eu vou colocar um possível domínio inver- tido para o meu aplicativo, que vai ser com.munhra.olamundo. Vamos deixar o campo Save Location, do jeito que ele está, certamente o do projeto que você criou é bem diferente do valor da imagem, mas não se preocupe, não precisa modificar esse campo, a não ser que você deseje colocar o aplicativo em outro local. O campo Language é importante, no capítulo anterior disse- mos que os aplicativos escritos para a plataforma Android podem 2-5 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > ser escritos em C++ e Java, porém desde 2017 a linguagem Kotlin foi anunciada como sendo a linguagem oficial do Android, por isso vamos deixar o campo Language com o valor Kotlin. Falaremos muito mais sobre a linguagem Kotlin nos próximos capítulos. Por fim, vamos usar como SDK mínimo a API 21, portanto basta deixar o campo Minimum SDK com esse valor ou modificá-lo caso este não seja o seu valor. Depois de revisarmos todas estas informações podemos cli- car no botão Finish, para que o Android Studio crie o esqueleto da nossa primeira aplicação. Figura 2-3: Configurando o novo projeto 2-6 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > 2.1.2 Conhecendo o Android Studio Quando clicamos no botão Finish, o Android Studio nos leva para tela de projeto, perceba que basicamente esta tela é divi- dida em duas grandes partes, do lado esquerdo temos o navegador de projeto, por meio dessa interface podemos navegar pelos arqui- vos do projeto. Do lado direito será mostrado o conteúdo de um arquivo que foi selecionado do lado esquerdo. A figura abaixo mostra a tela do Android Studio. Figura 2-4: Tela principal do Android Studio. No canto superior esquerdo temos a perspectiva do projeto configurada para a opção Android, vamos manter essa opção pois é a melhor quando vamos desenvolver aplicativos. Logo abaixo temos a pasta app, é nesta pasta que estão as in- formações necessárias para a construção do aplicativo, tais como, 2-7 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > os arquivos que implementam a sua lógica, os recursos gráficos como layout de tela e imagens etc. Bem no final temos a pasta Gradle Scritps, o Gradle é um gerenciador de construção e de bibliotecas utilizado no Android Studio e nessa pasta temos os arquivos que fazem a sua configuração. 2.1.3 O arquivo MainActivity Vamos dar uma atenção especial ao arquivo MainActivi- ty, este é o arquivo responsável por ler o código do layout da tela que está definido no arquivo activity_main.xml e desenhar a tela principalbaseado nos componentes deste arquivo. Além disso, é o arquivo MainActivity que é responsável pelo ciclo de vida do nosso primeiro projeto. Você não vai entender tudo o que este arquivo faz, mas vale a pena começarmos aqui uma explicação alto nível, considere abaixo o código deste arquivo: 1| package com.munhra.olamundo 2| 3| import androidx.appcompat.app. AppCompatActivity 4| import android.os.Bundle 5| 6| class MainActivity : AppCompatActivity() { 7| override fun onCreate(savedInstanceS- tate: Bundle?) { 8| super.onCreate(savedInstanceState) 2-8 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > 9| s e t C o n t e n t V i e w ( R . l a y o u t . activity_main) 10| } 11| } Na linha 1 declaramos o package ao qual pertence o arquivo, por hora vamos pular a linha 3. Na linha 4 importamos a classe Bundle que é usada pela Activity para recuperar seu estado, não se preocupe, pois o Android cuida disso automaticamente. A declaração mais importante deste arquivo acontece na li- nha 6, pois é nessa linha que é declarada a classe MainActivi- ty, classe é um conceito de Programação Orientada a Objetos, este conceito será introduzido nos capítulos posteriores. Veja que a classe MainActivity, herda as propriedades e métodos da classe AppCompatActivity, essa classe foi importa- da na linha 3. Podemos pensar que a classe AppCompatActivity é uma activity porém ela mantém possibilita ao aplicativo, usar recur- sos novos em versões anteriores da API. Quando tocamos no ícone da aplicação, o Android, procura na MainActivity o método onCreate, e executa ele, por isso na linha 7 este método foi sobrescrito. Toda a vez que sobrescrevemos um método devemos, logo na primeira linha fazer uma chamada para o mesmo método da classe mãe por isso utilizamos a palavra chave super, para fazer referên- cia a classe mãe e deste modo chamamos o método onCreate da classe mãe, isto foi feito na linha 8. A linha mais importante da sobrescrição do método onCre- ate é a linha 9, Veja que chamamos o método setContentView 2-9 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > da classe MainActivity, este método é responsável por de- senhar os elementos da tela que estão definidos no parâmetro R.layout.activity_main. Este parâmetro é uma referência para o arquivo activity_ main.xml que está na pasta res/layout. É neste arquivo que os elementos gráficos estão definidos, no caso deste primeiro aplicati- vo temos apenas um componente do tipo TextView, que será res- ponsável por mostrar o texto “Hello World!” na tela do dispositivo. 2.1.4 Executando o arquivo no emulador Agora que passamos a principal parte do código, vamos exe- cutar o aplicativo e ver o que acontece, não é necessário um dispo- sitivo real, precisamos apenas baixar e instalar uma das versões do AVD (Android Virtual Device) para rodar nosso aplicativo. Figura 2-5: Ícone do AVD. Feito isto uma tela de gerenciamento dos dispositivos virtu- ais vai se abrir, clique no botão Create Virtual Device, e siga as instruções. Isso pode levar um tempo, pois o Android Studio 2-10 Desenvolvimento de Aplicativos para Dispositivos Móveis I N TR O D U Ç Ã O A O A N D R O ID S TU D IO 2< / > vai fazer o download dos arquivos necessários e depois instalar. Quando este processo terminar, vamos finalmente executar o nos- so primeiro programa, para isso clique no botão indicado na fi- gura abaixo: Figura 2-6: Ícone para rodar o aplicativo. Após clicar no ícone play, o emulador do Android executará o aplicativo e poderemos ver na tela o texto “Hello World!” na tela do emulador. 2-11 � EXERCÍCIOS PROPOSTOS 1) Qual é a IDE oficial para o desenvolvimento de software para a plataforma Android? ( ) -a) Eclipse ( ) -b) Visual Studio ( ) -c) XCode ( ) -d) Android Studio ( ) -e) Unity 2) Qual é a linguagem oficial para o desenvolvimento de aplicativos para a plataforma Android? ( ) -a) Java ( ) -b) Java Script ( ) -c) C/C++ ( ) -d) C# ( ) -e) Kotlin 3) Escolha a afirmativa correta sobre o arquivo MainActivity.kt ( ) -a) O arquivo MainActivity é responsável apenas por armazenar o layout da tela principal do aplicativo. ( ) -b) Dentro do arquivo MainActivity está escrita a classe de mes- mo nome que é responsável por controlar o ciclo de vida da tela principal deste aplicativo. ( ) -c) Não devemos nunca sobrescrever o método onCreate, utili- zando a palavra chave override, pois desta maneira estare- mos quebrando o ciclo de vida da MainActivity. ( ) -d) A classe MainActivity, escrita dentro do arquivo de mesmo nome, deverá sempre ser escrita em Java. 2-12 EX ER C ÍC IO S P R O P O S TO S ( ) -e) O arquivo de Layout nunca deverá ser utilizado no código sobrescrito do método onCreate. 4) Escolha a afirmativa correta sobre o arquivo activity_main.xml ( ) -a) É neste arquivo que está escrito o código que define o layout da tela. ( ) -b) É neste arquivo que escrevemos o código em Java que con- trola o ciclo de vida da MainActivity do aplicativo. ( ) -c) Arquivos .xml não podem ser usados em projetos de aplica- tivos Android. ( ) -d) Quando damos o mesmo nome que o arquivo MainActivity não precisamos sobrescrever o método onCreate para ins- tanciar os elementos do layout. ( ) -e) Quando chamamos o método setContentView, devemos pas- sar uma String, ou seja, um valor entre aspas duplas indican- do o caminho absoluto para o arquivo activity_main.xml. 5) Considere o código abaixo e escolha a afirmativa correta 6| class MainActivity : AppCompatActivity() { 7| override fun onCreate(savedInstanceS- tate: Bundle?) { 8| super.onCreate(savedInstanceState) 9| setContentView(R.layout.activity_main) 10| } 11| } ( ) -a) A definição da classe MainActivity está errada pois deve ser escrita em Java. ( ) -b) A declaração da classe MainActivity está errada pois ela não pode herdar os atributos e métodos da classe AppCompatActivity. ( ) -c) A declaração da linha 6 está correta, pois a MainActivity her- da os atributos e métodos da classe AppCompatActivity. 2-13 EX ER C ÍC IO S P R O P O S TO S ( ) -d) Não podemos sobrescrever o método onCreate, pois ele não existe na classe AppCompatActivity. ( ) -e) Não podemos sobrescrever o método onCreate passando como parâmetro o tipo Bundle?. 6) Considere o código abaixo e escolha a alternativa incorreta: 7| override fun onCreate(savedInstanceS- tate: Bundle?) { 8| super.onCreate(savedInstanceState) 9| setContentView(R.layout.activity_main) 10| } ( ) -a) Precisamos sobrescrever o método, pois ele é executado as- sim que o usuário abre o aplicativo. ( ) -b) Na linha 9 utilizamos o método setContentView, para ins- tanciar os elementos definidos no arquivo de layout activi- ty_main.xml ( ) -c) Podemos omitir a palavra-chave override da declaração do método onCreate ( ) -d) A referência para o arquivo activity_main fica armazenada na constante R.layout.activity_main ( ) -e) O parâmetro savedInstanceState é controlado automatica- mente pelo Android para restaurar o estado da aplicação. 7) Escolha a afirmativa correta sobre o método onCreate ( ) -a) Não podemos sobrescrever o método onCreate pois ele não faz parte da classe MainActivity. ( ) -b) O método onCreate é apenas chamado quando fechamos a aplicação ( ) -c) Para sobrescrevemos o método onCreate precisamos de in- cluir mais um parâmetro além do savedInstanceState ( ) -d) Não podemos chamar o método super.onCreate, pois a classe mãe da MainActivity não possui este método implementado. 2-14 EX ER C ÍC IO S P R O P O S TO S ( ) -e) Temos que sobrescrever o método onCreate pois ele é cha- mado assim que o aplicativo é aberto, e é neste momento que iremos criar os elementos de layout. 8) Qual a utilidade do Gradle ? ( ) -a) O Gradle é o compilador do Android. ( ) -b) O Gradle é o gerenciador de construçãoe de bibliotecas do projeto Android. ( ) -c) O Gradle gerencia apenas a versão do Android do projeto. ( ) -d) O Gradle precisa ser executado em linha de comando pois não pode ser acessado pelo Android Studio. ( ) -e) O Gradle apenas gerencia as bibliotecas do projeto, mas o processo de build (construção) do aplicativo é feito interna- mente pelo Android Studio. 9) Sobre o AVD escolha a afirmativa correta: ( ) -a) O AVD é um gerenciador de versões do sistema operacional Android que podem ser carregadas em um dispositivo real. ( ) -b) A sigla AVD significa Android Virtual Device e é o simulador da plataforma Android. ( ) -c) A sigla AVD significa Android Virtual Device e é o emulador da plataforma Android. ( ) -d) O AVD não pode ser criado pelo Android Studio. ( ) -e) É necessário pagar uma licença para utilizar o AVD. 10) Como podemos executar o projeto Android sem um dispositivo real? ( ) -a) Não é possível executar o aplicativo Android sem um dispo- sitivo real. ( ) -b) Devemos criar um AVD ou seja um Android Virtual Device, utilizando o gerenciador disponibilizado pelo kit de desen- volvimento que vem junto com o Android Studio. E instalar o executável do projeto pela linha de comando. ( ) -c) Podemos usar o simulador do Android. 2-15 EX ER C ÍC IO S P R O P O S TO S ( ) -d) No Android Studio, devemos criar um AVD, e depois clicar no botão verde de play. ( ) -e) N.d.a D I S C I P L I N A : Desenvolvimento de Aplicativos para Dispositivos Móveis UNIDADE 2: INTRODUÇÃO A LINGUAGEM KOTLIN Caro(a) Aluno(a) Seja bem-vindo(a)! Na unidade 2 veremos os conceitos fundamentais da lingua- gem Kotlin que são necessários para darmos os primeiros passos no desenvolvimento de aplicativos móveis para o sistema opera- cional Android. Ótimos estudos! Conteúdos da Unidade: Declaração de variáveis, Tipos de variáveis, Variáveis imu- táveis e mutáveis, Operadores aritméticos, Operadores de com- paração, Expressões condicionais com if e else, Expressões condicionais com when, Estruturas de repetição com while, Estruturas de repetição com for. D I S C I P L I N A : Desenvolvimento de Aplicativos para Dispositivos Móveis CAPÍTULO 3: VARIÁVEIS, TIPOS E OPERADORES 3-3 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 3�1 Introdução Desde 2017 a linguagem oficial para desenvolvimento na plataforma Android mudou de Java para Kotlin, mas a linguagem Kotlin existe desde 2010. Ao compararmos a linguagem Kotlin com a linguagem Java, podemos dizer que a linguagem Kotlin possui uma sintaxe limpa e expressiva, ponto e vírgula não são mais necessários, getters/ setters são opcionais, o que reduz em muito a verbosidade do código. Neste capítulo vamos introduzir os conceitos necessários da linguagem Kotlin para que possamos, mais a frente, trabalhar com as bibliotecas necessárias para o desenvolvimento de aplica- tivos Android. Nos próximos capítulos veremos vários exemplos escri- tos na linguagem Kotlin, que servirão de apoio na compreensão dos conceitos. É muito interessante que o leitor possa digitar estes exem- plos e fazer alguns experimentos, mudar algumas coisas e ver o que acontece, para isso não precisamos do Android Studio, podemos usar algumas ferramentas online que processam código Kotlin de maneira muito rápida. Uma destas ferramentas é a https://play.kotlinlang.org/, é só acessar o site e escrever o código dentro da função main e clicar no botão run. A saída do programa irá aparecer na parte inferior da tela. 3-4 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 3�2 Declarando variáveis Durante a programação de um aplicativo é muito comum termos que armazenar, por exemplo, os dados que o usuário for- nece em um campo texto, para que posteriormente algum cálculo seja relacionado. Utilizamos a ferramenta https://play.kotlinlang.org/, e en- tramos com o código abaixo: 1| fun main() { 2| var quantidade = 3 3| var preco = 2.50 4| var custoTotal = preco * quantidade 5| println(custoTotal) 6| } Na primeira linha, declaramos a função main, mais adian- te você aprenderá como escrever funções, mas por hora lembre-se apenas que todo o código dentro das chaves, ou seja todo o código das linhas 2 até 4 será executado. Vamos agora para a linha 2, veja que usamos a palavra-chave var, é por meio desta palavra chave que definimos uma variável, na sequência inserimos um espaço em branco e escrevemos o nome dessa variável, neste caso chamamos de variável quantidade. Logo após o nome da variável utilizamos o operador =, que podemos chamar de operador de atribuição, pois estamos indi- cando que queremos armazenar o valor inteiro 3 na variável cha- mada quantidade. 3-5 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Note que na definição da variável quantidade, não deixa- mos explícito o tipo da variável, isso acontece, pois a linguagem Kotlin é capaz de fazer inferência de tipo, ou seja, ela é capaz de adi- vinhar qual o tipo da variável baseando-se no valor de inicialização. No caso da linha 2 a variável quantidade será do tipo Int, pois o Kotlin considera o valor 3 como sendo do tipo Int. Já na linha 3, novamente utilizamos a palavra-chave var e definimos a variável preço, veja que agora, atribuímos a essa va- riável o valor 2.5, ou seja, um valor não inteiro, neste caso a lin- guagem Kotlin fará a inferência e o tipo de variável escolhido será o Double. Atente para o fato de que, na linguagem Kotlin, casas decimais são definidas usando o símbolo ponto, e não a vírgula, pois a linguagem segue a notação do inglês. Chegando na linha 4, definimos mais uma variável chamada custoTotal, veja que nesta variável utilizamos o padrão camel- Case, este é o padrão de escrita de código utilizado na linguagem Kotlin, começamos com uma letra minúscula e na posição onde teríamos o espaço, colocamos uma letra maiúscula e assim suces- sivamente, pois não podemos ter espaços em branco no nome de uma variável. A variável custoTotal armazenará o valor da multiplica- ção das duas variáveis preço e quantidade, para isso utiliza- mos o operador * que é o operador de multiplicação na linguagem Kotlin, mais a frente veremos todos operadores aritméticos defini- dos nesta linguagem. Novamente a linguagem Kotlin infere que o tipo da variável custoTotal será Double, pois na expressão aritmética temos um valor Double, e para que as informações das casas decimais não sejam perdidas a inferência de tipo define a nova variável tam- bém com valor Double. 3-6 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Por fim, utilizamos a função println, para exibir o valor da variável custoTotal, a saída deste programa será então 7.5, pois 3 vezes 2.5 é igual a 7.5 Mas se por algum motivo tivermos que definir o tipo de uma variável “manualmente”, isso também é possível, considere o códi- go abaixo como exemplo. 1| fun main() { 2| var quantidade = 3 3| println(quantidade::class.simpleName) 4| var preco = 2.50 5| println(preco::class.simpleName) 6| var desconto: Int = 1 7| println(desconto::class.simpleName) 8| var custoTotal = preco * quantida- de - desconto 9| println(custoTotal::class.simpleName) 10| println(custoTotal) 11| } Este programa faz o mesmo que o anterior, porém agora te- mos a definição da variável desconto, veja que utilizamos o sím- bolo dois pontos, e após um espaço definimos o tipo da variável como sendo Int, desta maneira estamos deixando explícito que o tipo desta variável é Int. 3-7 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Depois na linha 8 apenas subtraímos o valor do desconto, e neste caso o resultado doprograma será 6.5 pois 3 vezes 2.5 menos 1 é igual 6.5. Neste código também inserimos alguns comandos println, veja que usamos como parâmetro na linha 3 a expressão quanti- dade::class.simpleName, por hora, entenda que código mos- tra o tipo da classe ou seja o retorno dessa linha será Int, pois a linguagem Kotlin inferiu isso na linha 2. Já na linha 5, a função println, irá mostrar na tela, o tipo Double, pois neste caso o valor atribuído foi 2.5, e assim por diante para as demais linhas, resultando na seguinte saída do programa. Int Double Int Double 6.5 3�3 Declarando variáveis imutáveis Quando sabemos que o valor de uma variável não vai mudar, devemos usar a palavra chave val, no lugar de var, isso faz com que o Kotlin, otimize memória, pois não será necessário, alocar a quantidade máxima para o tipo inferido. É considerado uma boa prática no desenvolvimento de sof- tware, sempre que possível, evitarmos o uso de um valor em sua forma literal, portanto neste caso utilizamos constantes para 3-8 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > armazenar esses números. Veja o programa anterior reescrito uti- lizando variáveis imutáveis: 1| fun main() { 2| val quantidade = 3 3| val preco = 2.50 4| val custoTotal = preco * quantidade 5| println(custoTotal) 6| } Veja que mudamos a palavra chave var, para a palavra chave val, o programa irá rodar como anteriormente a saída será o valor 7.5, porém agora o programa atende às boas práticas e consome menos memória. Vamos fazer uma experiência, tentaremos modificar a cons- tante custoTotal na linha 5, para isso considere o código abaixo: 1| fun main() { 2| val quantidade = 3 3| val preco = 2.50 4| val custoTotal = preco * quantidade 5| custoTotal = custoTotal - 1 6| println(custoTotal) 7| } 3-9 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Quando executamos este programa, um erro que mostrará a mensagem: “Val cannot be assigned”, vai acontecer pois esta- mos tentando, na linha 5, atribuir um novo valor a uma variá- vel imutável. 3�4 Tipos numéricos A linguagem Kotlin, possui os seguintes tipos numéricos Tabela 3-1: Tipos Numéricos Tipo Descrição Byte Armazena inteiros de até 8 bits com sinal, os valores podem ir de -128 até 127. Short Armazena inteiros de até 16 bits com sinal, os valores podem ir de -32768 até 32767. Int Armazena inteiros de até 32 bits com sinal, os valores podem ir de -2,147,483,648 (231) até 2,147,483,647 (231- 1). Long Armazena inteiros de até 64 bits com sinal os valores pode ir de -9,223,372,036,854,775,808(261) até 9,223,372,036,854,775,807 (261- 1). Float Ocupa 32 bits e armazena números com casas decimais. Double Ocupa 64 bits e armazena números com casas decimais. 3-10 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 3�5 O tipo String O tipo String é muito utilizado e serve para armazenar os valores do tipo texto, veja sua utilização no código abaixo: 1| fun main() { 2| val nome = “Roberto” 3| val sobreNome = “Morais” 4| println(“Bem vindo $nome $sobreNome”) 5| } Na linha 2 definimos a variável nome atribuído como valor a literal o texto “Roberto”, na linha 3 definimos a variável sobreNo- me, atribuindo o valor “Morais”. A linguagem Kotlin entende que o texto entre aspas duplas é uma String e por isso infere que o tipo de ambas as variáveis nome e sobreNome será String. Por fim na linha 4 usamos a função println, note que usa- mos o operador $, para fazer a interpolação com as duas variáveis definidas anteriormente, podemos chamar o operador $ de inter- polador, pois ele irá inserir o conteúdo das strings definidas nos lugares marcados no parâmetro da função println. Quando rodamos este programa teremos como resposta a seguinte saída: Bem vindo Roberto Morais 3-11 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 3�6 O tipo Boolean É muito comum na programação termos que tratar situações que possuem dois estados, como ligado ou desligado, visível ou in- visível, conectado ou desconectado entre outros, para isso existe o tipo Boolean, que define uma variável que pode receber apenas dois valores chamados True ou False, respectivamente em por- tuguês significam verdadeiro ou falso. O exemplo abaixo mostra a declaração de duas variáveis do tipo Boolean: 1| fun main() { 2| val ligado = true 3| val conectado = false 4| println(ligado::class.simpleName) 5| println(ligado) 6| println(conectado) 7| } Na linha 2 definimos a variável imutável chamada ligado, e atribuímos o valor true, isso faz com que a linguagem Kotlin infira que o tipo desta variável será Boolean. Da mesma maneira na linha 3 definimos a variável imutá- vel chamada conectado, e atribuímos o valor false, o que fará com que a linguagem Kotlin defina o tipo desta variável como sendo Boolean. Para confirmar que o tipo da variável ligado é Boolean, usa- mos o código da linha 4 e o valor mostrado na tela será Boolean, 3-12 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > na sequência mostramos os valores das variáveis ligado e conecta- do, ambas serão true e false respectivamente, portanto a saída do programa acima será: Boolean true false 3�7 Operadores aritméticos Os operadores aritméticos da linguagem Kotlin são respon- sáveis por realizar operações matemáticas básicas com valores lite- rais ou valores armazenados em variáveis e em variáveis imutáveis, a tabela abaixo relaciona os operadores aritméticos da linguagem: Tabela 3-2: Operadores aritméticos Símbolo Descrição + Operador de soma - Operador de subtração * Operador de multiplicação / Operador de divisão % Operador de resto Veja o código abaixo, que demonstra o uso dos operadores descritos na tabela acima: 1| fun main() { 2| 3-13 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 3| val x = 5 4| val y = 2 5| 6| val soma = x + y 7| val subtracao = x - y 8| val multiplicacao = x * y 9| val divisaoInteira = x / y 10| val restoDaDivisao = x % y 11| 12| println(“Soma $soma”) 13| println(“Subtração $subtracao”) 14| println(“Multiplicação $multiplicacao”) 15| println(“Divisão inteira $divisaoInteira”) 16| println(“Resto da divisão $restoDaDivisao”) 17| } Nas linhas 3 e 4 definimos duas variáveis imutáveis, uma de- las chamada x e a outra chamada y, na linha 6 utilizamos o opera- dor de soma e armazenamos na variável soma o valor resultante da operação, que será 7. Na sequência, efetuamos a subtração das duas variáveis, utilizando o operador menos, fazendo 5 - 2, o que resultará no valor 3, que será armazenado na variável imutável cha- mada subtração. 3-14 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Logo na linha 8 utilizamos o operador de multiplicação *, efetuando a operação 2 vezes 5 resultando no valor 10, que será armazenado na variável imutável multiplicação. Fazemos o mesmo para o operador de divisão, veja que como ambas as variáveis x e y são do tipo Int, a divisão será inteira ou seja o valor 2 será o resultado da divisão, e será armazenado na variável imutável de nome divisaoInteira. Por fim utilizamos o operador de resto da divisão, para cal- cular o valor do resto da divisão inteira de 5 por 2, ou seja, este va- lor será 1. Após a execução do programa teremos a seguinte saída na tela: Soma 7 Subtração 3 Multiplicação 10 Divisão inteira 2 Resto da divisão 1 3�8 Operadores de comparação Durante o desenvolvimento de um aplicativo, é muito prová- vel que tenhamos que comparar algumvalor, suponha um aplica- tivo que dirá se o aluno foi aprovado numa determinada matéria onde a média de aprovação é 5, neste caso deveremos comparar se a nota do aluno é maior que a média ou não. Para isso existem os operadores de comparação, atente ao fato de que o resultado de uma operação de comparação é um valor Booleano, pois uma comparação pode retornar apenas 2 3-15 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > valores, verdadeiro ou falso. A tabela abaixo relaciona os operado- res de comparação. Tabela 3-3: Operadores de comparação Operador Descrição == Este operador compara se o operando da direita é igual ao operando da esquerda, retornando true se isso for verdade ou false caso contrário. != Este operador verifica se o operando da direita é diferente do operando da esquerda, se isso for verdade o resultado da ope- ração será true, caso contrário será false. > Este operador compara se o operando da esquerda é maior que o operando da direita, se isso for verdade então a operação retorna true, caso contrário retorna false. < Este operador compara se o operando da esquerda é menor que o operando da direita, se esse for o caso então o valor retorna- do pela expressão será true, caso contrário será false. >= Este operador compara se o operando da esquerda é maior ou igual ao operando da direita, se isso for verdade então a opera- ção retornará o valor true caso contrário retornará false. <= Este operador compara se o operando da esquerda é menor ou igual operando da direita, se esse for o caso então o resultado da operação será o valor true, caso contrário será o valor false. O código abaixo, mostra o caso de uso de alguns operadores descritos na tabela acima: 1| fun main() { 2| var comparacao = 3 == 3 3| println(“3 é igual a 3 ? $comparacao”) 4| comparacao = 3 != 3 3-16 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 5| println(“3 é diferente de 3 ? $comparacao”) 6| comparacao = 3 > 5 7| println(“3 é maior que 5 ? $comparacao”) 8| comparacao = 3 < 8 9| println(“3 é menor que 8 ? $comparacao”) 10| comparacao = 3 >= 3 11| println(“3 é maior ou igual a 3 ? $comparacao”) 12| } Na linha 2, definimos a variável comparação, e atribuímos a ela o valor da expressão 3 == 3, veja que utilizamos o operador ==, que compara se o valor 3 é igual a 3, neste caso o valor armazenado na variável comparação será true, pois 3 é igual a 3. Na sequência na linha 4 fizemos a comparação oposta, ou seja, estamos calculando o resultado da expressão 3 != 3, lem- brando que o operador != verifica se ambos os operandos são di- ferentes, então neste caso o valor armazenado na variável compa- ração será false, pois 3 é igual a 3. Agora chegou a vez do operador >, maior que, veja que 3 não é maior que 5 ou seja, o valor armazenado na variável comparação na linha 6 será false. Vamos agora usar o operador <, menor que, neste caso o ope- rando da esquerda que é o 3 é menor que o operando da direita que é o 8, ou seja, o resultado desta expressão é true, e isso é armazenado na variável comparação na linha 8. Por fim utilizamos o operador >=, maior ou igual, neste caso o operando da esquerda é o valor 3 e o operando da direita também 3-17 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > é o valor 3, ou seja, ambos são iguais, como esse operador testa se os operandos são maiores ou iguais, o valor retornado pela expressão será true, pois 3 é igual a 3. Ao executarmos o programa, teremos a saída abaixo, confor- me o que foi descrito: 3 é igual a 3 ? true 3 é diferente de 3 ? false 3 é maior que 5 ? false 3 é menor que 8 ? true 3 é maior ou igual a 3 ? true 3�9 Operadores lógicos Por meio dos operadores lógicos podemos construir expres- sões onde os operandos são do tipo Boolean, veja abaixo os ope- radores e o que cada um realiza numa expressão lógica. Para isso vamos utilizar uma ferramenta muito útil que chamamos de ta- bela verdade. Por meio da tabela verdade escrevemos todos os possíveis resultados entre dois operandos e os operadores lógicos, vamos co- meçar pelo operador, ou seja, podemos chamar este operador de e. Tabela 3-4: Tabela verdade operador && Operando 1 Operando 2 Resultado true True true false True false 3-18 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Operando 1 Operando 2 Resultado true False false false False false Segundo a tabela acima, o operador && apenas retornará o valor true quando o valor de ambos operandos forem true, para todos os outros casos o valor retornado será false. Veremos agora a tabela verdade para o operador ||, chama- mos esse operador de ou: Tabela 3-5: Tabela verdade operador || Operando 1 Operando 2 Resultado true true true false true true true false true false false false No caso do operador || ou, o resultado será false apenas se ambos os valores dos operandos forem iguais a false, para to- dos os outros casos o valor retornado pela operação será true. Por fim vamos para a tabela do operador !, ou seja, o opera- dor não, este operador tem uma particularidade, podemos chamá- -lo de operador unário pois ele precisa de apenas um operando: Tabela 3-6: Tabela verdade operador ! Operando Resultado true False false True Veja o código abaixo, que mostra o uso dos operadores lógicos: 3-19 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > 1| fun main() { 2| var senhaValida = false 3| var usuarioValido = false 4| var acessoLiberado = senhaValida && usuarioValido 5| println(“Acesso liberado $acessoLiberado”) 6| senhaValida = true 7| usuarioValido = false 8| acessoLiberado = senhaValida && usuarioValido 9| println(“Acesso liberado $acessoLiberado”) 10| senhaValida = false 11| usuarioValido = true 12| acessoLiberado = senhaValida && usuarioValido 13| println(“Acesso liberado $acessoLiberado”) 14| senhaValida = true 15| usuarioValido = true 16| acessoLiberado = senhaValida && usuarioValido 17| println(“Acesso liberado $acessoLiberado”) 18| } Vamos considerar o caso a variável acessoLiberado, só terá o valor true se ambas as variáveis senhaValida usuario- Valido possuírem o valor true. Para isso utilizaremos o opera- dor &&, pois veja que na tabela verdade deste operador o resultado retornado apenas será true se ambos os valores dos operandos for true. 3-20 Desenvolvimento de Aplicativos para Dispositivos Móveis V A R IÁ V EI S , TI P O S E O P ER A D O R ES 3< / > Nas linhas 2 e 3 definimos ambas as variáveis acessoLibe- rado e senhaValida, com o valor false. Em seguida na linha 4 efetuamos a operação senhaValida && usuarioValido, armazenando na variável acessoLiberado o valor false, pois neste caso ambas as variáveis possuem o valor false. Na sequência mostramos na tela o valor da variável aces- soLiberado, mostrando que ele é false. Agora vamos mudar o valor da variável senhaValida, para true simulando que o usuário entrou com a senha correta, porém o valor da variável usuarioValido, continuará sendo false, desta maneira nossa simulação dirá que a variável acessoLibe- rado ainda possui o valor false. Desta vez vamos simular a situação onde o usuário entrou com a senha incorreta, ou seja, o valor da variável senhaValida, será false, porém neste caso, o usuário entrou com a sua identi- ficação correta, ou seja, o valor da variável usuarioValido ago- ra é true. Ainda sim neste caso a variável acessoLiberado deverá possuir valor false, pois uma das informações está errada, e pelo operador && é exatamente isso que acontece, pois um dos operan- dos possui o valor false. Agora vamos ao caso onde ambas as variáveis possuem o va-lor true, neste caso simulamos a situação onde o usuário entrou corretamente com os valores da senha e da sua identificação, neste caso a expressão senhaValida && usuarioValido, irá retor- nar o valor true. 3-21 � EXERCÍCIOS PROPOSTOS 1) O que é uma variável ? ( ) -a) Um elemento no código que não podemos prever o valor ( ) -b) Um elemento no código que não sabemos qual é o tipo ( ) -c) Um espaço alocado em memória RAM baseado em um tipo específico utilizado para armazenar valores que podem variar. ( ) -d) Um elemento no código que quando inicializado com um va- lor específico nunca mais poderá ter esse valor modificado. ( ) -e) Um espaço alocado em memória de disco baseado em um tipo específico utilizado para armazenar valores que podem variar. 2) Qual a diferença entre val e var ? ( ) -a) Quando definimos uma variável com var sabemos que o seu valor vai mudar, quando definimos uma variável com val sa- bemos que o seu valor não vai mudar, ou seja estamos defi- nindo uma variável imutável. ( ) -b) Quando definimos uma variável com val sabemos que o seu valor vai mudar, quando definimos uma variável com var sabemos que o seu valor não vai mudar, ou seja, estamos definindo uma variável imutável. ( ) -c) Não existe diferença entre o uso das duas palavras chaves val e var. ( ) -d) Quando definimos uma variável com val sabemos que o seu tipo vai mudar, quando definimos uma variável com var sa- bemos que o seu tipo não vai mudar, ou seja estamos defi- nindo uma variável imutável. ( ) -e) N.d.a. 3-22 EX ER C ÍC IO S P R O P O S TO S 3) Quando devemos usar o tipo Byte ? ( ) -a) Para armazenar valores monetários que usam apenas duas casas decimais. ( ) -b) Para armazenar valores inteiros da ordem de grandeza dos milhares. ( ) -c) Para armazenar valores que representam medidas de com- primento com até 4 casas decimais. ( ) -d) Para armazenar o número de alunos em uma sala de aula, suponho que esse número não seja maior que 30. ( ) -e) Para armazenar o número de moléculas em um composto orgânico. 4) Quando devemos usar o tipo Double ? ( ) -a) Para armazenar o número de moléculas em um composto orgânico. ( ) -b) Para armazenar o valor da constante Pi com o máximo de casas decimais que a linguagem Kotlin permite. ( ) -c) Para armazenar os valores de um sensor de temperatura de ambiente. ( ) -d) Para armazenar valores inteiros que representam as popu- lações de países. ( ) -e) N.d.a. 5) Quando devemos usar o tipo String? ( ) -a) Para representar uma situação onde podemos ter dois esta- dos, verdadeiro ou falso. ( ) -b) Armazenar os valores numéricos de 1 até 10. ( ) -c) Quando temos que armazenar o nome de um usuário. ( ) -d) Armazenar os valores da constante Pi com o máximo de ca- sas decimais. ( ) -e) Armazenar valores monetários para realizar o cálculo do im- posto devido. 3-23 EX ER C ÍC IO S P R O P O S TO S 6) Quando devemos usar uma variável do tipo Boolean? ( ) -a) Quando temos uma situação onde o resultado será apenas 0 ou 1. ( ) -b) Quando queremos armazenar o resultado de uma operação lógica. ( ) -c) Quando temos uma situação, onde teremos apenas os valo- res em texto “verdadeiro” ou “falso”. ( ) -d) Quando temos uma situação onde queremos armazenar o texto que representa as unidades celsius “°C” ou fahrenheit “°F” ( ) -e) N.d.a 7) Considere o código abaixo que utiliza o operador % e escolha a alterna- tiva correta 1| fun main() { 2| val x = 9 3| val y = 7 4| val resultado = x % y 5| println(“Resultado $resultado”) 6| } ( ) -a) O resultado mostrado na tela será 1, ou seja, o valor da divi- são inteira do valor 9 pelo valor 7. ( ) -b) O resultado mostrado na tela será o valor de 9% de 7, ou seja, 0.63. ( ) -c) O resultado mostrado será o valor da divisão com duas casas de decimais de 9 / 7 ou seja 1.28 ( ) -d) O resultado será 2 pois o operador % retorna o resto da divi- são inteira de 9 / 7. ( ) -e) O resultado será 0 pois o resto da divisão entre x e y é 0. 3-24 EX ER C ÍC IO S P R O P O S TO S 8) Considere o código abaixo que utiliza os operadores de comparação e escolha a alternativa correta. 1| fun main() { 2| val resultado1 = 9 <= 7 3| val resultado2 = 5 >= 5 4| val resultado3 = 7 > 7 5| println(“Resultado1 $resultado1”) 6| println(“Resultado2 $resultado2”) 7| println(“Resultado3 $resultado3”) 8| } ( ) -a) O programa vai retornar um erro pois não podemos armaze- nar o resultado de uma operação relacional. ( ) -b) O programa vai retornar um erro pois as variáveis imutáveis definidas nas linhas 2, 3 e 4 não foram definidas com o tipo correto. ( ) -c) O tipo das variáveis resultado1, resultado2 e resultado 3 é Int. ( ) -d) O programa irá mostrar na tela os valores true, false e true. ( ) -e) O programa irá mostrar na tela os valores false, true e false. 9) Considere o código abaixo que utiliza os operadores lógicos && e || e escolha a alternativa correta. 1| fun main() { 2| val x1 = true 3| val x2 = false 4| val x3 = true 5| val x4 = true 6| val resultado1 = (x1 && x2) || (x3 && x4) 7| val resultado2 = x1 || x2 || x3 8| val resultado3 = x1 && x2 && x3 && x4 9| val resultado4 = x1 || x4 || x3 && x2 3-25 EX ER C ÍC IO S P R O P O S TO S 10| val resultado5 = (x1 && x2 && x3) || (x1 || x4) 11| println(“$resultado1, 12| $resultado2, 13| $resultado3, 14| $resultado4, 15| $resultado5”) 16| } ( ) -a) False, false, false, false, false ( ) -b) True, true, false, true, true ( ) -c) False, true, false, true, false ( ) -d) True, true, false, false, true ( ) -e) True, true, true, true, true 10) Considere o código abaixo que utiliza os operadores de lógicos e de com- paração e escolha a alternativa correta. 1| fun main() { 2| val x1 = false 3| val x2 = 10 <= 10 4| val x3 = 1 > 2 5| val x4 = 7 != 7 6| val resultado1 = (x1 && x2) || (x3 && x4) 7| val resultado2 = x1 || x2 || x3 8| val resultado3 = x1 && x2 && x3 && x4 9| val resultado4 = x1 || x4 || x3 && x2 10| val resultado5 = (x1 && x2 && x3) || (x1 || x4) 11| println(“$resultado1, 12| $resultado2, 13| $resultado3, 14| $resultado4, 15| $resultado5”) 16| } 3-26 EX ER C ÍC IO S P R O P O S TO S ( ) -a) False, true, false, false, false ( ) -b) True, true, false, false, true ( ) -c) False, false, false, false, false ( ) -d) True, true, true, true, true ( ) -e) False, false, true, true, false D I S C I P L I N A : Desenvolvimento de Aplicativos para Dispositivos Móveis CAPÍTULO 4: CONTROLE DE FLUXO 4-2 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > 4�1 Introdução Toda linguagem de programação possui estruturas que con- trolam o fluxo do programa. As estruturas de repetição são respon- sáveis por fazer com que um determinado bloco de código se repita até que uma condição seja ou satisfeita. Fazem parte deste grupo as estruturas declaradas com as palavras chaves while e for. É muito comum chamarmos essas estruturas de laços de repetição. A outra categoria de estruturas de controle de fluxo são as expressões condicionais, estas estruturas executam um determi- nado bloco de código se uma condição for satisfeita, fazem parte destas estruturas as que são declaradas pelas palavras chaves if, else e when. 4�2 Expressões condicionais com if e else Imagine a situação onde queremos fazer um programa que diz ao usuário se ele foi aprovado numa determinada disciplina onde a média de aprovação é 5, ou seja, caso a média do usuário seja superior ou igual a 5 o programa irá mostrar uma mensagem dizendo que o usuário foi aprovado, caso contrário, ou seja a média do usuário foi inferior a 5 o programa irá mostrar uma mensagem dizendo ao usuário que ele não foi aprovado. Para construir esse programa precisaremos usar uma expres- são condicional utilizando a palavra-chave if e a palavra-chave else, veja abaixo, de maneira genérica, como construir uma ex- pressão condicionalna linguagem Kotlin: 1| if (expressão lógica) { 4-3 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > 2| bloco de código executado quando o re- sultado da expressão lógica for true 3| } else { 4| bloco de código executado quando o re- sultado da expressão lógica for false 5| } Quando a expressão lógica, entre os parênteses da palavra- -chave if retornar o valor true, o bloco de código entre as chaves será executado. Caso contrário, se a expressão lógica entre os parênteses da palavra-chave if retornar o valor false, o bloco de código das chaves do else, será executado. Usando a forma genérica com guia, vamos construir o pro- grama que resolve o problema da média exposto no começo deste capítulo. 1| fun main() { 2| val media = 3.0 3| if (media >= 5.0) { 4| println(“O aluno foi aprovado na matéria”) 5| } else { 6| println(“O aluno foi reprovado na matéria”) 7| } 8| } 4-4 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > Começamos o programa definindo a variável imutável media com valor 3.0, esta variável vai armazenar a média na disciplina que o usuário possui. Na sequência, na linha 3 utilizamos a palavra-chave if, e dentro dos parênteses escrevemos a expressão condicional media >= 5.0, veja que utilizamos o operador de comparação maior ou igual e como operandos a variável media, e o valor 5.0, ou seja, sempre que a variável média possuir valor maior que 5.0 está ex- pressão lógica irá retornar o valor true, caso contrário, se o valor da variável média for menor que 5.0 então a expressão lógica irá retornar false. No caso deste programa, sabemos que o valor da variável imutável é 3, ou seja 3 é menor que 5, logo o valor da expressão media >= 5.0, vai ser false e como dito anteriormente, neste caso o bloco de código dentro das chaves após a palavra else vai ser executado e a mensagem informando que o usuário foi repro- vado irá aparecer na tela. Agora reescreva o código de modo que o valor da variável media seja 7.5, neste caso a expressão condicional media >= 5.0, retornará o valor true, fazendo com que o bloco de código das chaves que seguem a expressão condicional seja executado e portanto neste caso, uma mensagem informando que o usuário foi aprovado, irá ser exibida na tela. Faça mais alguns experimentos com esse código, mude o va- lor para 5.0, e para outros valores até que você se familiarize com essa estrutura. Atente para o fato de que a estrutura else é opcional, con- sidere o programa abaixo que mostra uma mensagem quando o número armazenado na variável numeroA for maior que o número armazenado na variável numeroB. 4-5 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > 1| fun main() { 2| val numeroA = 30 3| val numeroB = 17 4| 5| if (numeroA > numeroB) { 6| println(“Número $numeroA é maior que $numeroB”) 7| } 8| } Nas linhas 2 e 3 definimos respectivamente as variáveis imu- táveis numeroA com valor 30 e numeroB com valor 17. Logo na linha 5 construímos a estrutura condicional baseada na expressão lógica numeroA > numberoB, note que usamos o operador maior que, neste caso esta expressão lógica irá retornar o valor true se o valor da variável numeroA, for maior que o valor da variável nu- meroB, e como o valor da variável numeroA é 30 e o valor da variá- vel numeroB é 17 então a expressão lógica numeroA > numberoB retornará o valor true, e o bloco de código definido na linha 6 será executado e a mensagem informando que o número 30 é maior que o número 17 será exibida na tela. Veja que como não temos uma implementação para o else, então se o valor da variável numeroA for menor que o valor da va- riável numeroB nada será mostrado na tela. Podemos também escrever estruturas condicionais usando a palavra-chave else if, veja abaixo um exemplo de como pode- mos fazer isso: 4-6 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > 1| fun main() { 2| val tipoCafe = 3 3| if (tipoCafe == 1) { 4| println(“Café Latte”) 5| } else if (tipoCafe == 2) { 6| println(“Expresso”) 7| } else if (tipoCafe == 3) { 8| println(“Café Coado”) 9| } else { 10| println(“Opção não encontrada”) 11| } 12| } Iniciamos declarando a variável imutável chamada tipo- Cafe com o valor 3, logo abaixo na linha 3, utilizamos a palavra chave if para verificar se o valor da variável tipoCade é igual a 1, como o resultado desta operação retorna o valor False, a men- sagem da linha 4 não será mostrada na tela, pois a linha 4 não será executada. O fluxo do programa será então desviado para a linha 5, e agora a expressão else if, vai checar se o valor da variável ti- poCafe é igual a 2, e novamente o resultado da expressão lógica será o valor False. Ou seja, a linha 6 não será executada e o fluxo do programa será desviado para a linha 7, onde novamente utiliza- mos a expressão else if, porém agora, como o valor da variável tipoCafe é igual a 3 a linha 8 será executada e a mensagem: Café Coado vai aparecer na tela. 4-7 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > Note que a linha 10 não será executada pois o fluxo do pro- grama saiu do bloco condicional pela linha 10. Caso o valor da variável tipoCafe, não fosse 1, 2 ou 3 então apenas nesse caso a linha 10 seria executada. 4�3 Expressões condicionais com when Outra maneira de escrevermos expressões condicionais em Kotlin é usando a palavra-chave when, considere o código abaixo como exemplo: 1| fun main() { 2| 3| val x = 5 4| 5| when (x) { 6| 1 -> println(“X possui o valor 1”) 7| 2 -> println(“X possui o valor 2”) 8| 5 -> println(“X possui o valor 5”) 9| else -> { 10| println(“X possui qualquer outro valor”) 11| } 12| } 13| } 4-8 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > Começamos declarando a variável imutável x com valor igual a 5, e logo na linha 5 utilizamos a palavra-chave when, para marcar a estrutura condicional, note que queremos testar qual é o valor da variável x, neste caso ela foi incluída entre os parênteses logo na sequência da palavra-chave when. Após declarada a variável que será testada pela expressão condicional when abrimos a chave e na linha 6 verificamos se o valor da variável é igual a 1, caso for o código na frente da marca -> será executado. O mesmo é verdade para as linhas 7 e 8, note que o valor da variável x é 5, portanto o código que será executado está na linha 8, fazendo com que a mensagem informando que x possui o valor 5 será exibida. Nessa estrutura podemos também utilizar a palavra-cha- ve else, com o objetivo de desviar o fluxo do programa para o código entre as chaves do else, caso nenhuma condição acima seja satisfeita. Aproveite para mudar o valor da variável x e fazer algumas experiências com o código do when, por exemplo mudando seu va- lor para 10 ou mesmo para 2. 4�4 Estrutura de repetição com while Imagine que precisamos construir um programa que mostre na tela os números e 1 até 1000, será que teremos que escrever 1000 linhas de código para isso? A resposta é não, pois neste caso devemos usar uma estrutura de repetição, veja abaixo a forma ge- nérica de uma estrutura de repetição utilizando a instrução while. 4-9 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > 1| while (expressão lógica) { 2| bloco de código que será repetido enquanto a expressão lógica retornar o valor true 3| } O modelo genérico descrito acima diz que enquanto a ex- pressão lógica entre os parênteses da palavra-chave while retornar o valor true então todo o bloco de código escrito entre chaves será executado. Vamos retomar o problema da contagem até 1000, vamos es- crever o código que faz isso utilizandoa expressão while. 1| fun main() { 2| var x = 1 3| while (x <= 1000) { 4| println(x) 5| x = x + 1 6| } 7| } Já na linha 2 declaramos a variável chamada x, veja que usa- mos a palavra-chave var ao invés da palavra chave val, fizemos isso pois o valor da variável x vai ser modificado, na linha 3 escre- vemos a palavra-chave while e na sequência entre os parênteses colocamos a expressão lógica que vai controlar a estrutura de re- petição, veja que como queremos mostrar na tela os números de 1 até 1000, construímos uma expressão lógica que verifica se x é menor ou igual a 1000, ou seja, quando o valor de x for 1001 o 4-10 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > fluxo do programa não vai executar o bloco de código definido nas linhas 4 e 5. Como inicializamos a variável chamada x com o valor 1, da primeira vez a expressão lógica x <= 1000, retornará o valor true, e as linhas 4 e 5 serão executadas, na linha 4 uma mensagem será mostrada com valor da variável que neste primeiro caso será 1 e na linha 5 incrementamos este valor somando 1, ou seja, após a execução da linha 5 o valor da variável x mudará para 2. O valor 2 é menor do que 1000, portanto a expressão lógica x <= 1000 retornará o valor true, ou seja, novamente as linhas 4 e 5 serão executadas, portanto o valor 2 será mostrado na tela e a variável x será incrementada em 1, e ao fim da execução da linha 5 esta variável possuirá o valor 3. Vamos avançar no tempo, e assumir que a variável x chegou ao valor 1000, neste caso a condição x <= 1000, ainda será válida e as linhas 4 e 5 serão executadas, portanto o valor 1000 será mos- trado na tela e na linha 5 o valor da variável x que agora é de 1000, será incrementado em 1, ou seja, o valor da variável x agora é 1001. Veja que agora a expressão x <= 1000, é inválida, pois x é igual a 1001 e 1001 é maior que 1000, portanto esta expressão irá retornar false e a estrutura de repetição não irá mais executar as linhas 4 e 5, consequentemente o programa vai terminar e os números de 1 até 1000 foram mostrados na tela como queríamos. 4�5 Estrutura de repetição com for Além da instrução while podemos usar utilizar a instru- ção for para construir laços de repetição, veja no exemplo abaixo 4-11 Desenvolvimento de Aplicativos para Dispositivos Móveis C O N TR O LE D E FL U X O 4< / > como utilizar a instrução for para fazer o laço de repetição que re- solve o problema de mostrar todos os números de 1 até 1000 na tela 1| fun main() { 2| for (x in 1..1000) { 3| println(x) 4| } 5| } Já na linha 2 utilizamos a palavra chave for e dentro dos parênteses definimos uma variável chamada x e usamos a palavra chave in e o intervalo definido por 1.1000, ou seja, com esta nota- ção estamos criando uma estrutura de repetição que vai fazer com que x possua todos os valores entre 1 e 1000 inclusive. Esta estrutura de repetição irá executar o código da linha 3, 1000 vezes, ou seja, os valores de 1 até 1000 serão mostrados na tela. A instrução for é indicada quando queremos percorrer itens em uma lista, veremos o conceito de lista nos próximos capítulos. 4-12 � EXERCÍCIOS PROPOSTOS 1) Considere o código abaixo, e escolha a alternativa correta: 1| fun main() { 2| val temperatura = 28 3| if (temperatura > 24) { 4| println(“Baixar Temperatura”) 5| } 6| } ( ) -a) O código acima está errado pois não podemos usar os parên- teses na linha 3. ( ) -b) O código acima está errado pois a variável temperatura foi declarada sem um tipo. ( ) -c) O tipo da variável temperatura é Double. ( ) -d) O código está correto e como resultado mostrará a mensa- gem: Baixar Temperatura. ( ) -e) O comando if, na linha 3 vai gerar um erro, pois este coman- do não está definido na linguagem Kotlin. 2) Considere o código abaixo, e escolha a alternativa correta: 1| fun main() { 2| val opcao = 2 3| if (opcao == 1) { 4| println(“Sabor morango”) 5| } else if (opcao == 2) { 6| println(“Sabor chocolate”) 7| } else if (opcao == 3) { 4-13 EX ER C ÍC IO S P R O P O S TO S 8| println(“Sabor limão”) 9| } else { 10| println(“Sabor não encontrado”) 11| } 12| } ( ) -a) O código acima não compila, pois não podemos escrever a instrução else if, apenas else. ( ) -b) Como o valor da variável opcao é igual a 2 já na linha 3 a expressão condicional vai retornar o valor False, e o fluxo do programa será desviado para a linha 10, portanto será mos- trado na tela a frase: Sabor não encontrado. ( ) -c) A variável da linha 2 chamada opção foi declarada errada, pois o tipo Int não foi especificado. ( ) -d) Aparecerá na tela, depois da execução do programa a frase: Sabor limão. ( ) -e) Como o valor da variável opção é 2, a primeira expressão condicional da linha 3 vai retornar False, e o fluxo será redi- recionado para a linha 5, neste caso esta expressão condicio- nal vai retornar True e portanto a mensagem mostrada na tela será: Sabor chocolate 3) Escolha a afirmativa correta sobre a palavra-chave while na linguagem Kotlin: ( ) -a) A palavra-chave while, não está definida na linguagem Kotlin. ( ) -b) A palavra-chave while, seguida de uma expressão lógica vai executar a próxima linha uma única vez apenas se o valor retornado pela expressão lógica for True. ( ) -c) A palavra-chave while, seguida de uma expressão lógica vai executar a próxima linha uma única vez apenas se o valor retornado pela expressão lógica for False. ( ) -d) A palavra-chave while, seguida de uma expressão lógica vai executar o código definido entre chaves enquanto o resulta- do da expressão lógica for igual a True. ( ) -e) A palavra-chave while, seguida de uma expressão lógica vai executar o código definido entre chaves enquanto o resulta- do da expressão lógica for igual a False. 4-14 EX ER C ÍC IO S P R O P O S TO S 4) Escolha a afirmativa correta sobre as palavras chave if e else na lingua- gem Kotlin: ( ) -a) Podemos omitir os parênteses na definição da expressão ló- gica da palavra-chave if. ( ) -b) Sempre que escrevermos uma expressão com a palavra-cha- ve if somos obrigados a usar a palavra-chave else. ( ) -c) Se a expressão lógica que segue a palavra-chave if, retornar o valor True, então o código que estiver definido entre as cha- ves logo abaixo da expressão lógica será executado. ( ) -d) Se a expressão lógica que segue a palavra-chave if, retornar o valor True, então o código que estiver definido entre as cha- ves logo abaixo da expressão else será executado. ( ) -e) Todo código definido entre chaves logo abaixo da palavra chave else, sempre será executado. 5) Considere o código abaixo, e escolha a alternativa correta: 1| fun main() { 2| var x = 1 3| while ( x < 20 ) { 4| if (x == 10) { 5| println(“Uma dezena”) 6| } else { 7| println(x) 8| } 9| x = x + 1 10| } 11| } ( ) -a) Podemos declarar a variável x na linha 2 como sendo val. ( ) -b) Nada será mostrado na tela pois as linhas 4 até 9 só serão executadas se x for maior que 20, porém x é igual a 1. ( ) -c) Todas as linhas de 4 até 9 serão executadas 20 vezes. ( ) -d) O programa vai mostrar na tela os números de 1 até 19. 4-15 EX ER C ÍC IO S P R O P O S TO S ( ) -e) O programa vai mostrar na tela os valores de 1 até 19 porém no valor 10 será mostrada a mensagem: Uma dezena. 6) Considere o código abaixo, e escolha a alternativa correta: 1| fun main() { 2| var x = 1 3| while ( x <= 5 ) { 4| println(x) 5| } 6| } ( ) -a) O código acima exibe na tela os números de 1 até 5 e pode- mos mudar a variável mutável x para ser uma variável imu- tável utilizando a palavra-chave val, que o resultado será o mesmo. ( ) -b) A linha 4 do código acima nunca será executada pois a ex- pressão lógica que controla a repetição só será válida se x for maior que 5, porém como o valor de x é 1 a condição nunca irá retornar o valor True. ( ) -c) O código acima vai se repetir infinitas vezes pois o valor
Compartilhar