Escolar Documentos
Profissional Documentos
Cultura Documentos
Dispositivos Móveis
Gilson de Oliveira
Professor Autor
Gilson de Oliveira
Design Educacional
Deyvid Souza Nascimento
Renata Marques de Otero
Diagramação
Jailson Miranda
Coordenação
Anderson Elias
Coordenação Executiva
George Bento Catunda
Terezinha Mônica Sinício Beltrão
Coordenação Geral
Paulo Fernando de Vasconcelos Dutra
Janeiro, 2017
Dados Internacionais de Catalogação na Publicação (CIP) de acordo com ISDB
O48p
Oliveira, Gilson de.
Programação para Dispositivos Móveis: Curso Técnico em Desenvolvimento de Sistemas:
Educação a distância / Gilson de Oliveira. – Recife: Secretaria Executiva de Educação
Profissional de Pernambuco, 2018.
91 p.: il.
CDU – 02:141:005.6
1.Engenharia de software
Sumário
Introdução .............................................................................................................................................. 6
1.1 Activity........................................................................................................................................................ 8
2.3 Solicitando ao google maps que exiba um local específico do mapa ...................................................... 28
2.5 Retornando resultados de uma activity para outra através do método startActivityForResult ............. 30
3.7 Resumo..................................................................................................................................................... 47
4.7 Resumo..................................................................................................................................................... 56
5.7 ProgressDialog.......................................................................................................................................... 71
5.9 Resumo..................................................................................................................................................... 73
6.6 Resumo..................................................................................................................................................... 78
Conclusão ............................................................................................................................................. 89
Referências ........................................................................................................................................... 90
6
vendê-lo na loja da GOOGLE ou mesmo disponibilizá-lo de forma gratuita e tentar ganhar dinheiro
através de anúncios e propagandas que a GOOGLE embute no seu aplicativo, caso você permita.
Existem vários casos de sucesso de pessoas jovens que criaram aplicativos, colocaram na
loja e ficaram ricas. O criador do Ant Smasher já teve o seu jogo baixado por mais de 30 milhões de
pessoas. O aplicativo é gratuito, mas rende mais de 3 milhões de dólares por ano apenas com
anúncios. O criador de Flappy Bird, um jogo bem simples, chegou a, no início de 2014, 50 mil
dólares por dia. Por que você não pode ser uma dessas pessoas?
Aprender uma linguagem de programação exige dedicação, persistência e curiosidade.
Dedicação e persistência para estudar o material disponibilizado e fazer os exercícios propostos,
curiosidade para ir atrás de novas informações, notícias, outros materiais e novos exercícios.
Quando terminar de estudar o material do curso, busque novos materiais, tutoriais e outros
exemplos em livros e na internet. O ser humano aprende por repetição, quanto mais você praticar,
mais você vai assimilar o conteúdo. A cada exemplo, tente entendê-lo e tente você mesmo fazer e
não fique apenas como espectador, dessa forma você criará suas próprias soluções.
Nos próximos capítulos vamos falar de algumas das classes mais importantes utilizadas
para o desenvolvimento em Android. Com relação à ferramenta de desenvolvimento (também
chamada tecnicamente de IDE - Integrated Development Environment) você pode tanto usar o
Eclipse (ADT – Android Development Tools) ou o Android Studio (mais recomendo).
Comercialmente, o Android Studio vem sendo cada vez mais usado, principalmente para novos
projetos. Para fazer o download do Android Studio, basta acessar o site
https://developer.android.com/studio/index.html?hl=pt-br e fazer o download da versão mais
recente. Caso você ainda não tenha o SDK Android, deve baixar o Android Studio com o SDK. Caso já
tenha, basta baixar apenas o Android Studio.
E então, vamos começar a nos divertir?
7
Competência 01
Esse “.” antes do nome da sua Activity indica que ela está no mesmo pacote do projeto,
caso ela estivesse em um pacote diferente, o nome do pacote deveria ser especificado. Lembre-se
de escrever o nome da Activity corretamente, pois o compilador é case sensitive, ou seja, ele
diferencia as letras maiúsculas das minúsculas, dessa forma para ele “MinhaActivity” é diferente de
“minhaActivity”. Para ter certeza de que o nome e o pacote foram especificados corretamente,
segure a tecla control do seu teclado e passe o mouse em cima do nome da sua Activity, se o texto
ficar “clicável” indica que você pode chegar até a sua Activity apenas clicando, pois ela foi
encontrada no caminho especificado.
Bom, dito isso, lembre-se de que quando você desejar criar uma nova tela na sua
aplicação Android você precisará criar também uma nova Activity e esta necessariamente deverá
ser declarada no AndroidManifest.xml. Ela vai controlar os eventos e elementos da tela, que é
8
Competência 01
É bastante importante você entender o ciclo de vida de uma Activity para saber em qual
estado ela se encontra e para você poder controlar o comportamento da sua aplicação. Tenha em
mente o seguinte: quem cuida da execução do fluxo do ciclo de vida é o sistema operacional
Android, mas você pode customizar os estados (executando, temporariamente interrompida em
segundo plano e completamente destruída), por exemplo.
Vamos ver um exemplo prático da utilização e da importância do conhecimento e do
uso desses estados. Imagine que você tenha desenvolvido um jogo espetacular para Android e
enquanto o usuário está jogando ele recebe uma ligação, o que vai acontecer com o jogo? Bom, o
sistema operacional vai interromper o jogo e colocá-lo em segundo plano para que o usuário possa
atender a ligação. Ao encerrar a ligação a grande pergunta que resta é: o que irá acontecer com o
jogo? O jogo vai estar pausado? O jogo foi salvo? Bom, isso vai depender do que foi especificado
por você, desenvolvedor. O Android fornece toda a infraestrutura necessária para isso, basta você
entender o ciclo de vida da Activity.
9
Competência 01
A figura abaixo (figura 1) ilustra o fluxo do ciclo de vida de uma Activity e seus possíveis
estados.
Preste bastante atenção, pois agora iremos explicar cada um dos métodos que se
encontram no ciclo de vida de uma activity. É importante que você leia a descrição do método e vá
acompanhando o fluxo na figura 1.
10
Competência 01
Esse método é chamado após a activity ser criada, bem como a sua view, ou
onStart()
seja, após o método onCreate(bundle). Sua view está prestes a ficar visível.
Como mostrado no fluxo acima, esse método também é chamado sempre
após o onRestart().
onRestart() Esse método é chamado caso sua activity tenha sido parada
temporariamente e esteja sendo iniciada novamente, então o Android
chama o onRestart() que logo em seguida chama o onStart().
onResume() Esse método é chamado quando a activity já está executando e está pronta
pra interagir com o usuário.
11
Competência 01
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(getLocalClassName(), "onCreate()");
@Override
protected void onStart(){
super.onStart();
Log.i(getLocalClassName(), "onStart()");
}
@Override
protected void onRestart(){
super.onRestart();
Log.i(getLocalClassName(), "onRestart()");
}
@Override
protected void onResume(){
super.onResume();
Log.i(getLocalClassName(), "onResume()");
}
}
12
Competência 01
13
Competência 01
com o progresso bastante avançado, então o ideal seria que o jogo fosse salvo ao ser interrompido
ou mesmo pausado para que o usuário não seja prejudicado com interrupções externas e que
fogem do controle do usuário, mas não do desenvolvedor.
14
Competência 01
Exemplo MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Exemplo SegundaTela
Se você tiver essas duas activities criadas você vai conseguir rodar? Depende... Você
se lembrou de declarar essa sua nova activity no AndroidManifest.xml? Lembre-se de que toda nova
15
Competência 01
activity(tela) deve ser declarada no AndroidManisfest, caso você não faça isso o seu LogCat vai
exibir a seguinte mensagem de erro quando você clicar no botão na tentativa de mudar de tela:
FATAL EXCEPTION
Unable to find explicit activity class SegundaTela
have you declared this activity in your AndroidManifest.xml?
Perceba que ele exibe uma mensagem em inglês informando o porquê do erro,
traduzindo: “você declarou essa activity no seu AndroidManifest.xml?”. Para que isso não ocorra
adicione a seguinte linha no seu AndroidManifest.xml:
<activityAndroid:name=".SegundaTela" />
O que acontece com a primeira activity após a mudança para a segunda tela? Veja o que
foi impresso no LogCat a partir da implementação e impressão de log nos métodos do ciclo de vida
que aprendemos anteriormente. Implemente os métodos do ciclo de vida tanto para a primeira tela
quanto para a segunda e entenda o que acontece em ambas.
1.3.2 Navegação entre telas com passagem de parâmetros
Agora já sabemos como navegar de uma tela para outra, mas como enviar uma ou mais
informações da primeira tela para a segunda? Para isso, usaremos uma classe chamada Bundle que
é similar a uma HashTable (estrutura de dados do tipo chave valor). Ela faz uso do método
putString(chave, valor) para configurar as informações que serão passadas em formato de texto
para a próxima tela.
Agora faremos uma pequena modificação no exemplo anterior para ilustrar a passagem
de informações entre as telas (o código a seguir faz parte do conteúdo da classe MainActivity).
16
Competência 01
No nosso exemplo utilizamos o método putString, mas a classe Bundle possui outras
opções caso você queira passar outro tipo primitivo como putBoolean, putChar, punInt, dentre
outras. Para obter a lista completa basta consultar o javadoc.
Já sabemos como passar as informações, agora precisamos saber como resgatá-las na
outra tela. Novamente vamos alterar o código que havíamos criado (o código a seguir faz parte do
conteúdo da classe SegundaTela).
Intent it = getIntent();
String cargo = "", nome = "";
if(it != null){
Bundle informacoes = it.getExtras();
if(informacoes != null){
cargo = informacoes.getString("cargo");
nome = informacoes.getString("nome");
}
}
tela2.setText("Bem vindo " + cargo + " " + nome);
setContentView(tela2);
}
Note que no onClick do botão da primeira tela (MainActivity) nós passamos o Intent
(chamado tela2) com as informações que desejamos transferir. Como o parâmetro do startActivity e
no onCreate da segunda tela (SegundaTela), nós resgatamos esse mesmo Intent (tela2) e extraímos
as informações que foram passadas através da chave “cargo” e “nome”, basicamente, foi isso que
fizemos.
Em toda linguagem de programação existem diferentes formas de se fazer a mesma
coisa, vai depender do seu conhecimento e da flexibilidade da mesma. Também poderíamos passar
as informações da seguinte forma:
17
Competência 01
cargo = it.getStringExtra("cargo");
nome = it.getStringExtra("nome");
18
Competência 01
que você for adquirindo experiência vai acabar conhecendo outras classes de Activity. O objetivo
dessas outras classes é justamente facilitar a manipulação e a utilização dos componentes do
Android.
Agora, vamos colocar a mão na massa, vamos criar uma classe que estende de
ListActivity, preencher um array (conjunto) de objetos e exibir na tela, conforme demonstrado a
seguir:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@Override
protected void onListItemClick
(ListView, View, int position, long id){
super.onListItemClick
(listView, view, position, id);
String itemSelecionado =
this.getListAdapter().getItem(position).toString();
Toast.makeText(this, "Item selecionado -> " + itemSelecionado,
Toast.LENGTH_LONG).show();
}
}
19
Competência 01
método show()da classe Toast com a mensagem “Item selecionado -> Item 01”, por exemplo. Caso
essa lista funcionasse como um menu, nós poderíamos identificar qual elemento foi clicado e ter
uma ação associada a cada item ou poderia ser usada apenas como uma lista de dados informativa.
Atenção para o parâmetro Android.R.layout.simple_list_item_1, ele
representa um layout de lista padrão predefinido pelo Android. Os layouts predefinidos ajudam
bastante quando se quer utilizar um layout simples, contudo para layouts mais complexos e
personalizados é necessário que o próprio desenvolvedor crie de acordo com a sua necessidade.
No nosso último exemplo nós criamos uma ListActivity com dois itens: “Item 01” e
“Item 02”, já que foi dada a ideia de criar um menu com o ListView da ListActivity. Vamos lá!? Já
temos uma lista com dois itens e já implementamos o método onListItemClick, a tarefa é a seguinte:
se o usuário clicar no “Item 01” nós vamos iniciar nova activity chamada CicloDeVidaActivity que vai
conter o nosso primeiro exemplo desse capítulo. Será uma activity simples com todos os métodos
do ciclo de vida implementados. Já se o usuário clicar no “Item 02” nós vamos chamar a activity
ItemClicadoActivity que recebe a informação do item clicado.
Já que não vamos criar nenhum item novo, então eu não preciso mexer no método
onCreate, eu só vou mexer no método onListItemClick, porque a única coisa que eu vou fazer é ter
uma ação diferente dependendo do item que for clicado, ok? Então, o método seria modificado da
seguinte forma:
@Override
protected void onListItemClick
(ListView, View, int position, long id){
switch (position){
case 0:
startActivity(new Intent(this, CicloDeVidaActivity.class));
break;
case 1:
Intent = new Intent(this, ItemClicadoActivity.class);
intent.putExtra("itemClicado",
this.getListAdapter().getItem(position).toString());
startActivity(intent);
break;
}}
20
Competência 01
Perceba que para identificar qual item foi clicado eu usei o parâmetro “position”, esse
parâmetro informa a posição do item clicado. O primeiro item é representado pela posição de
índice 0, o segundo item é representado pela posição de índice 1 e assim por diante.
No próximo capítulo abordaremos o conceito de Intent e veremos mais exemplos da sua
utilização, pois essa talvez seja a classe mais importante do Android. Lembre-se de que ela já foi
citada brevemente neste capítulo. Quando precisamos navegar de uma tela para outra, nós criamos
um Intent e passamos a tela para qual desejamos navegar como parâmetro e chamamos o método
startActivity(Intent).
21
Competência 02
2.Competência 02 | Intent
Neste capítulo aprenderemos mais sobre a classe Intent, que para muitos é o coração do
Android. Intent significa intenção, representa uma ação que a aplicação deseja executar. No
capítulo anterior, a intenção que tínhamos era a de mudar de uma tela para outra, mas poderíamos
ter a intenção de abrir o browser do celular, fazer uma ligação, abrir o GOOGLE PLAY para instalar
um aplicativo, enviar uma mensagem para o SO ou mesmo exibir um endereço ou rota no GOOGLE
MAPS.
Agora, aprenderemos diversas utilidades da classe Intent, por isso fique atento e se tiver
mais curiosidade busque mais informações na internet sobre as diversas formas de se utilizar um
Intent. Vamos aprender algumas delas.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
abrirBrowser.setOnClickListener(this);
}
22
Competência 02
@Override
public void onClick(View v) {
Uri endereco = Uri.parse("http://www.google.com");
Intent it = new Intent(Intent.ACTION_VIEW, endereco);
startActivity(it);
}
}
No código acima nós temos uma Activity chamada MainActivity que implementa a
interface View.OnClickListener. No método onCreate da Activity nós criamos um botão chamado
abrir Browser com o texto “Abrir o google.com” e, ao clicá-lo, nós chamamos o método onClick da
interface View.OnClickListener que foi sobrescrito pela nossa activity. Nesse método nós
instanciamos um objeto da classe URI onde especificamos o endereço web que desejamos abrir,
então criamos um Intent para sinalizar a intenção de abrir essa página (http://www.google.com),
por isso passamos o URI com essa informação como parâmetro do Intent e logo em seguida
chamamos o startActivity para executar o nosso Intent. No momento em que o startActivity é
chamado, o seu aplicativo envia uma mensagem para o SO Android para abrir o seu browser
padrão.
Note que não há uma diferença na utilização do Intent para uma ação local da sua
aplicação e uma ação do próprio sistema operacional Android, visto que tanto para mudar de tela
quanto para abrir o browser é chamado o método startActivity(Intent).
No exemplo anterior nós criamos um botão e, ao clicá-lo, nós abrimos o browser e
acessamos o endereço especificado no URI adicionado ao Intent. Agora vamos fazer um exemplo
um pouco mais incrementado. Vamos criar um xml de layout, vamos colocar um label, um campo
de texto para o usuário digitar um site e um botão em que, com um clique, nós abriremos o
browser e o endereço especificado.
Primeiro vamos criar o xml de layout:
23
Competência 02
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Digite a URL" />
<EditText
Android:id="@+id/campoTextoEnderecoWeb"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
<Button
Android:id="@+id/botaoCliqueAqui"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Clique aqui!" />
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
24
Competência 02
Uri = Uri.parse(enderecoWeb);
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
}
}
25
Competência 02
Então, como faríamos para fazer uma ligação a partir do clique de um botão na nossa
aplicação? Vamos ver um exemplo de um XML de layout que contém um texto explicativo e um
botão que, ao clicá-lo, a ação será ligar para um número de emergência.
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="20dp"
Android:text="Caso você esteja tendo algum problema com a aplicação ligue
para emergência."/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_margin="20dp"
Android:text="Ligar para Emergência"
Android:onClick="acaoLigarParaEmergencia"/>
</LinearLayout>
26
Competência 02
especificação da ação do botão, será importante você saber para poder dar manutenção num
sistema já existente ou para poder implementar sua própria aplicação.
Agora vamos ver como fica a activity!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
27
Competência 02
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uriGeografico =
Uri.parse("geo:0,0?q=Cidade+Universitária,Recife");
Intent it = new Intent(Intent.ACTION_VIEW, uriGeografico);
startActivity(it);
}
}
Perceba que nesse exemplo não será necessário o usuário fazer nenhuma ação, como
clicar no botão, basta ele entrar nessa activity para ela chamar outra activity mostrando a
localização especificada. Nesse exemplo nós estamos especificando um endereço, mas poderia ser
uma coordenada geográfica (latitude e longitude), nesse caso o objeto uriGeografico ficaria da
seguinte forma:
Você pode colocar o seu endereço ou a sua coordenada e ver o Android localizá-la no
mapa, faça o teste! Além disso, você também pode exibir uma rota de um ponto de partida até um
destino específico, basta você determinar as coordenadas de origem e de destino em um serviço do
google maps, atribuir ao Uri e associá-lo ao Intent. Você pode pesquisar por esse exemplo na
internet e fazer o teste.
28
Competência 02
Uri primeiroContato =
Uri.parse("content://com.Android.contacts/contacts/1");
Intent it = new Intent(Intent.ACTION_VIEW, primeiroContato);
startActivity(it);
Assim como para fazer uma ligação, para você poder acessar a agenda do celular do seu
usuário, no momento da instalação, é necessário que o seu APP solicite a permissão
READ_CONTACTS, então você pode precisar adicionar a seguinte linha no seu AndroidManifest.xml:
<uses-permissionAndroid:name="Android.permission.READ_CONTACTS"/>
ATENÇÃO!
Se você rodar o exemplo acima no emulador pode ser que não tenha
contato cadastrado e você pode se deparar com a seguinte mensagem:
“Invalid contact uir.”. Então, pra exercitar, eu recomendo você executar o
exemplo anterior no seu próprio celular, caso você tenha um dispositivo
Android.
29
Competência 02
Caso você não saiba o ID do usuário e queira visualizar toda a lista de contatos
cadastrados e deixar o usuário livre para escolher, basta você usar o mesmo Uri que usamos
anteriormente omitindo apenas o ID do contato e mudar a ação para Intent.ACTION_PICK. Assim, o
código do onClick modificado ficaria da seguinte forma:
Uri listaDeContatos =
Uri.parse("content://com.Android.contacts/contacts/");
Intent it = new Intent(Intent.ACTION_PICK, listaDeContatos);
startActivity(it);
30
Competência 02
Vamos ver um exemplo prático. Através de um clique no botão, vamos abrir a lista de
contatos da agenda, como aprendemos anteriormente, e vamos retornar as informações do
contato escolhido. Antes, quando clicávamos no contato, a activity se fechava e não fazíamos mais
nada com a informação do contato escolhido, na verdade nem a tínhamos ainda, essa informação
ficava perdida. Agora, chamando o método startActivityForResult no clique, nós podemos recuperar
essa informação quando a activity contendo a lista de contatos for fechada, veja o exemplo a seguir.
@Override
public void onClick(View v) {
Uri listaDeContatos =
Uri.parse("content://com.Android.contacts/contacts/");
Intent it = new Intent(Intent.ACTION_PICK, listaDeContatos);
startActivityForResult(it, 10);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
if(requestCode == 10) {
Uri = data.getData();
Cursor = getContentResolver().query(uri, null, null, null,
null);
cursor.moveToFirst();
int nameColumnIndex =
31
Competência 02
cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
;
String name = cursor.getString(nameColumnIndex);
}
}
Perceba que no nosso exemplo temos três métodos dos quais dois você já conhece e
está bem familiarizado, que são os métodos onCreate, método obrigatório da classe activity que é
chamado sempre que a activity é criada e o método onClick, que é associado ao clique do botão
através do código b.setOnClickListener(this);. Note que existe um método novo
chamado onActivityResult que é o método que é chamado assim que a activity que foi iniciada no
startActivityForResult é encerrada. O código, chamado requestCode, que passamos na chamada, é
retornado no onActivityResult para identificar qual activity foi encerrada, por isso a
checagem no if(requestCode == 10). Dessa forma, é feito o tratamento correto com a
informação esperada. Caso essa nossa activity não tivesse apenas um botão e fosse possível iniciar
mais de uma activity, essa verificação do if(requestCode == 10), faria mais sentido. O
importante é que você perceba que você enviou um código identificador e que esse código foi
retornado, possibilitando o programador saber de onde vem à informação desejada. A classe
Toast.makeText foi utilizada somente para exibir a mensagem com o nome do usuário. Você
também poderia exibir o número do contato ou qualquer outra informação retornada no Intent.
Se você for pesquisar vai ver que os métodos startActivity e startActivityForResult são
bem parecidos, então quando usar um ou outro? Se você quiser apenas mudar de uma tela para
outra sem se importar com o retorno use o starActivity, caso contrário use o startActivityForResult e
na activity que você chamou este método implemente o método onActivityResult.
Esses exemplos são bem simples e didáticos, você pode fazer seus próprios exemplos e
procurar exercícios e matérias complementares na internet.
32
Competência 02
33
Competência 03
34
Competência 03
COMPONENTE DESCRIÇÃO
É um componente utilizado quando se deseja
FrameLayout
preencher toda a tela do aparelho.
É utilizado quando se deseja organizar os seus
LinearLayout
componentes internos de forma horizontal ou vertical.
Juntamente com o LinearLayout é um dos
componentes mais utilizados. É usado quando se
deseja posicionar um componente de forma relativa a
RelativeLayout
outro. Por exemplo, o elemento “A” vai ficar abaixo do
“B”, ou acima ou ao lado, ou seja, a localização de “A”
vai depender da posição de “B”.
É uma espécie de contêiner onde a posição dos seus
AbsoluteLayout componentes é especificada através de coordenadas x
e y.
Tabela 2 - Tipos de ViewGroup
Fonte: o autor
Descrição: Tabela de tipos de ViewGroup com suas descrições e características.
3.3 FrameLayout
Vamos começar pela classe mais simples dos gerenciadores de layout para você
entender melhor o seu conceito. Como vimos na tabelinha, anteriormente, o FrameLayout é um
componente utilizado quando se deseja mostrar algo na tela toda, como uma imagem de fundo que
pode ser uma marca d’água, por exemplo.
A princípio, o elemento que você colocar em um FrameLayout irá ocupar a posição
superior esquerda da tela e, dependendo do seu tamanho ou do que foi definido nos seus atributos,
pode ocupar toda a tela. Ainda assim é possível inserir outros elementos na tela de forma que os
elementos inseridos posteriormente fiquem por cima dos elementos anteriores, seguindo o
conceito de pilha, onde o último elemento fica por cima dos inseridos primeiro. Então, imagine que
você tem uma aplicação e deseja colocar no fundo uma imagem, você poderia usar um
35
Competência 03
FrameLayout onde seu primeiro elemento seria a sua imagem e os demais elementos seriam os
outros componentes da tela que seriam mostrados por cima da imagem, tornando a imagem um
background da tela.
Vamos agora ver na prática como funciona o FrameLayout! O exemplo a seguir é
composto de um FrameLayout contendo um ImageView e vamos ver as variações possíveis dos
atributos layout_widh e layout_height, que constituem a largura e a altura do FrameLayout,
respectivamente.
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/Android_mini"/>
</FrameLayout>
36
Competência 03
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/Android_mini"/>
</FrameLayout>
37
Competência 03
38
Competência 03
todos os elementos do layout, bloqueando as interações do usuário, fazendo com que ele espere o
processamento de um determinado processo, por exemplo.
Antes de começar a desenvolver uma tela, imagine como ela ficará para, então, você
poder selecionar o melhor layout de acordo com as suas necessidades.
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/Android_mini"/>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/Android_mini2"/>
</LinearLayout>
39
Competência 03
40
Competência 03
Figura 6 - a) Representa os quatro elementos onde só três aparecem e o terceiro aparece redimensionado para caber na
tela e a figura. b) Mostra as quatro imagens sendo exibidas com o telefone na horizontal.
Fonte: O próprio autor.
Descrição: Existem duas imagens, uma imagem foi chamada de A e a outra de B. A imagem A representa a visão do
celular na vertical onde estão sendo exibidas três imagens. A primeira imagem encontra-se no topo, do lado esquerdo, e
a segunda está no topo do lado direito da primeira e assim por diante. As duas primeiras imagens estão com os
tamanhos originais, a terceira encontra-se com o tamanho reduzido para caber na tela e a quarta imagem não foi
exibida. A imagem B representa o celular na horizontal e mostra quatro imagens. As quatro imagens estão no topo da
tela a partir do lado esquerdo e todas as imagens estão com o mesmo tamanho. Após a quarta imagem ainda sobra um
pequeno espaço para acabar a tela do celular.
3.5 RelativeLayout
A classe RelativeLayout também é bastante utilizada, através dela é possível posicionar
um componente em relação ao outro. Como assim professor? Por exemplo, imagine que você tem
uma imagem no topo da sua tela, usando o RelativeLayout é possível você especificar que um
determinado elemento deve aparecer ao lado dessa imagem (o programador informa se é lado
direito ou lado esquerdo), acima dela ou abaixo dela.
Mas como dizer que um componente deve aparecer ao lado, abaixo ou acima de outro?
Primeiro, você precisa nomear (ou referenciar, que é o termo mais comum) especificando um ID
para cada componente da tela, assim o Android vai entender. Assim, por exemplo, você vai poder
dizer para o Android: eu quero que o componente A fique abaixo do componente B. Vamos ver
alguns atributos importantes que podem ser usados pelo RelativeLayout na tabela a seguir.
ATRIBUTO DESCRIÇÃO
Android:layout_below Posiciona o elemento abaixo de outro.
Android:layout_above Posiciona o elemento acima de outro.
Android:layout_toLeftOf Posiciona o elemento à esquerda de outro.
Android:layout_toRightOf Posiciona o elemento à direita de outro.
Utilizado para definir um espaço (margem) na
Android:layout_marginTop
parte superior (Top) do componente.
41
Competência 03
<TextView
Android:id="@+id/txtViewDescricao"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="20dp"
Android:gravity="center"
Android:textSize="20dp"
Android:text="Formulário de cadastro de usuário" />
<TextView
Android:id="@+id/txtViewLogin"
Android:layout_width="155dp"
Android:layout_height="wrap_content"
Android:layout_below="@+id/txtViewDescricao"
Android:layout_marginBottom="20dp"
Android:layout_marginLeft="15dp"
Android:text="Login" />
42
Competência 03
<EditText
Android:id="@+id/editTxtLogin"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignTop="@+id/txtViewLogin"
Android:layout_toRightOf="@+id/txtViewLogin"
Android:background="@Android:drawable/editbox_background"
/>
<TextView
Android:id="@+id/txtViewSenha"
Android:layout_width="155dp"
Android:layout_height="wrap_content"
Android:layout_below="@+id/txtViewLogin"
Android:layout_marginBottom="20dp"
Android:layout_marginLeft="15dp"
Android:text="Senha" />
<EditText
Android:id="@+id/editTxtSenha"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignTop="@+id/txtViewSenha"
Android:layout_toRightOf="@+id/txtViewSenha"
Android:background="@Android:drawable/editbox_background"
Android:password="true"
/>
<TextView
Android:id="@+id/txtViewConfirmacaoDeSenha"
Android:layout_width="155dp"
Android:layout_height="wrap_content"
Android:layout_below="@+id/editTxtSenha"
Android:layout_marginBottom="20dp"
Android:layout_marginLeft="15dp"
Android:text="Confirmação de senha" />
43
Competência 03
<EditText
Android:id="@+id/editTxtConfirmacaoDeSenha"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignTop="@+id/txtViewConfirmacaoDeSenha"
Android:layout_toRightOf="@+id/txtViewConfirmacaoDeSenha"
Android:background="@Android:drawable/editbox_background"
Android:password="true"
/>
</RelativeLayout>
44
Competência 03
45
Competência 03
<TextView
Android:id="@+id/txtViewDescricao"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="20dp"
Android:layout_x="20px"
Android:layout_y="10px"
Android:textSize="20dp"
Android:text="TÍTULO - Vamos ver agora um exemplo de AbsoluteLayout!" />
<TextView
Android:layout_width="200dp"
Android:layout_height="wrap_content"
Android:layout_x="450px"
Android:layout_y="250px"
Android:text="TEXTO 01 - Veja a posição desse texto no meu exemplo (veja o
print) e no seu celular ou emulador." />
</AbsoluteLayout>
46
Competência 03
Agora execute o exemplo acima no seu celular ou emulador e verifique a posição dos
textos (TITULO e TEXTO 01). Pode ser que no seu dispositivo ou emulador o TEXTO 01 fique cortado,
pois você pode possuir um dispositivo com a resolução menor que o meu, ou que o TITULO no seu
dispositivo ou emulador tenha a disposição das palavras de forma diferente no seu teste. Pode ser
ainda que ocupe mais linhas ou menos linhas ou que a quebra de linha tenha sido feita de forma
diferente.
3.7 Resumo
Conforme vimos nas sessões anteriores deste capítulo, os gerenciadores de layout são
utilizados para organizar seus componentes internos. Você pode, inclusive, colocar um gerenciador
de layout dentro do outro, ou seja, você pode ter como elemento raiz um LinearLayout, por
exemplo, e dentro dele definir vários outros gerenciadores de layout.
Digamos que você tenha uma tela de formulário e cada item deva ficar um abaixo do
outro e ao final do formulário você tem dois botões, um para confirmar e outro para voltar ou
47
Competência 03
cancelar. Os itens de formulário estão dispostos um abaixo do outro, enquanto os botões deveriam
ficar lado a lado. Como você faria? Quais gerenciadores de layout você usaria? Uma opção é usar
um LinearLayout (como sendo o principal ou raiz ou root) com o orientation vertical para os campos
do formulário e dentro desse componente, por último, inserir outro LinearLayout (secundário)
definindo o atributo orientation como horizontal para os botões ficarem lado a lado. Faça o teste!
É importante você conhecer os diferentes tipos de gerenciadores de layout para
escolher o melhor para atender a sua necessidade. Não existe um componente melhor que o outro,
cada um foi criado para um propósito específico e cabe ao desenvolvedor fazer a escolha correta.
48
Competência 04
<resources>
<string name="app_name">ExemplosDeView</string>
</resources>
<activity
android:name=".MainActivity"
android:label="@string/app_name">
Isso é muito útil! Imagine que o programador defina uma mensagem no seu arquivo
strings.xml e use essa mensagem em diversos pontos da aplicação. Fazendo dessa forma a
mensagem encontra-se centralizada, ou seja, todos os pontos da aplicação fazem referência à
mesma string. Então, caso essa mensagem mude, basta você acessar o arquivo strings.xml e alterá-
49
Competência 04
la e automaticamente todos os locais que fazem referência a essa mensagem estarão com a sua
mensagem atualizada. Se o programador escrever essa mensagem de forma repetida em diversos
pontos, caso a mensagem mude, ele vai ter que mudar em todos os locais, tendo assim mais
trabalho.
A seguir veremos em detalhes como definir arquivos de cores, mensagens e estilos da
aplicação e como acessá-los e fazer uso do seu conteúdo.
Vamos estudar agora mais detalhadamente o arquivo strings.xml criado por padrão
tanto no Eclipse quanto no Android Studio e usado para armazenar as mensagens do projeto.
Também é possível definir outros arquivos de mensagens desde que você siga o padrão e estrutura
esperados.
Por padrão, os arquivos de recursos devem iniciar com a tag <resources> e, no caso dos
arquivos de texto, dentro da tag resources podem existir várias tags do tipo <string>, onde o
programador define uma chave única, usada para acessar a informação e um valor associado a essa
chave. Vamos ver um exemplo:
<resources>
<string name="chave_01">Valor 1</string>
<string name="chave_02">Valor 2</string>
<string name="mensagem_sucesso">Operação realida com sucesso!</string>
<string name="mensagem_erro">Desculpe, ocorreu um erro.</string>
</resources>
Para essas mensagens dentro de uma classe Java basta usar a classe R. No caso, para
exibir a string com a chave chave_01 basta fazer R.string.chave_01. Se for necessário usar alguma
dessas mensagens em um arquivo de layout de tela, ou seja, num arquivo XML, a sintaxe muda um
pouco, então ficaria da seguinte forma @string/mensagem_sucesso.
50
Competência 04
Para usar uma cor no arquivo Java podemos usar a classe R obedecendo a sintaxe
R.color.nome_da_cor (ex: R.color.colorPrimary), já para utilizar no arquivo XML de layout a sintaxe
fica da seguinte forma @color/nome_da_cor (@color/colorAccent).
Aplicando esse conhecimento para colocar a cor em um TextView vamos especificar a
sua propriedade background:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:background="@color/colorPrimary"
android:text="@string/mensagem_sucesso" />
Também poderia ter sido colocado o RGB diretamente no código, por exemplo,
android:background="#3F51B5". Contudo, é sempre recomendado utilizar o recurso em vez de
deixar as cores fixas (e mensagens) fixas no código, pois, como já foi citado, essa centralização
facilita a manutenção e torna a aplicação bem mais simples e fácil de entender.
51
Competência 04
<resources>
<style name="MeuEstilo">
<item name="android:textSize">14dp</item>
<item name="android:textColor">#000000</item>
</style>
</resources>
Para aplicar esse estilo a partir da classe Java, basta acessar a famosa classe R da
seguinte forma R.style.nome_do_estilo. E, para invocar esse estilo em um arquivo XML de layout
basta fazê-lo assim @style/nome_do_estilo. No nosso exemplo, como o nome do estilo é
“MeuEstilo”, basta fazer a substituição da variável nome_do_estilo por “MeuEstilo” para aplicá-lo.
Note que a sintaxe da utilização do arquivo de mensagens, cores e estilos são bem
parecidas, pois todos são arquivos de recursos (por isso devem iniciar com a tag <resources>). Para
usar o arquivo de mensagens você vai fazer R.string, para o arquivo de cores R.color e para o
arquivo de estilo R.style.
52
Competência 04
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>
53
Competência 04
Note que foi especificado o tema que foi estendido ( parente = "@
android:style / Theme.Light") e o nome do novo tema (MeuTema) e dentro da tag style
54
Competência 04
é só você customizar o que deseja, no caso, a única coisa que foi mudada foi a cor da janela, ou seja,
ao invés de branca, agora ela será preta. Lembre-se de que se você criou um novo tema e é
necessário especificá-lo na tag <application> ou <activity>, no caso ficaria
(android:theme="@style/MeuTema"). Veja o antes e depois a seguir:
Figura 10 - Imagem mostrando a diferença entre 2 temas, o tema light já provido pelo Android e um tema customizado.
Fonte: o autor.
Descrição: A imagem mostra dois prints da mesma tela usando temas diferentes. O primeiro print mostra a tela com um
tema próprio do Android, disponível para qualquer usuário usar chamado Theme.Light. E a outra imagem mostra a
mesma tela com um tema diferente. Esse tema diferente é o Theme.Light, com o fundo modificado através de uma
customização.
Existem muitas aplicações que usam um tema personalizado, mas também existem
muitas outras que usam alguns dos temas já existentes no Android e que atendem muito bem
muitos projetos. Porém, é bastante importante saber que você pode utilizar os vários temas
disponibilizados pela plataforma e que você pode criar o próprio tema ou customizar um tema
existente.
55
Competência 04
Tabela 4 – Notações
Fonte: o autor
Descrição: Tabela que informa os diferentes tipos de notação para posicionamento e definição de tamanho de
componentes da tela com suas respectivas descrições.
4.7 Resumo
Nesse capítulo falamos sobre a famosa classe R e como fazemos para criar, definir e
acessar os arquivos que contêm as mensagens, cores e estilos da aplicação. Falamos também da
importância desses arquivos para a manutenção da aplicação através da centralização das
informações.
56
Competência 04
57
Competência 05
A classe View é a classe base dos componentes visuais, responsável pela criação e
caracterização de qualquer componente gráfico em uma aplicação Android. Tanto os gerenciadores
de layout que vimos no capítulo anterior (que herdam de ViewGroup, que por sua vez herdam de
View) quanto os componentes que veremos a seguir, herdam da classe View e são utilizados para
montar o layout das telas de uma aplicação Android.
Muitas vezes chamamos uma View de componente ou elemento no contexto de uma tela da
aplicação. Toda subclasse de View implementa o método onDraw (Canvas canvas) que é
responsável por desenhar o componente na tela. Geralmente utilizamos componentes já prontos
do próprio Android como TextViews, Buttons, mas você também pode criar o seu próprio
componente, ou seja, sua própria View, basta criar uma classe que herde de View e implementar o
método onDraw (Canvas).
A seguir vamos ver os métodos mais comuns e importantes da classe View. Para a lista
completa de métodos fazer a leitura da documentação
(https://developer.android.com/reference/android/ view/View.html):
MÉTODO DESCRIÇÃO
Método responsável por desenhar o componente de
onDraw(Canvas)
layout na tela.
Método responsável por informar o espaçamento à
esquerda, acima, à direita e abaixo em pixels que
devem ser colocados na tela antes de inserir o
componente. Existe também uma propriedade que
pode ser definida no XML com essa mesma função
setPadding(esquerda, cima, direita, chamada android:padding onde você pode definir um
baixo) único valor e esse mesmo valor ser aplicado a todos os
parâmetros. Caso seja necessário informar um valor
diferente para cada espaçamento, basta usar os
atributos android:paddingLeft, android:paddingTop,
android:paddingRight e android:paddingBottom,
respectivamente.
58
Competência 05
5.1 TextView
A classe TextView é uma das subclasses mais simples da classe View. Ela é responsável
por desenhar um texto (também chamado de label) na tela. Vamos ver alguns exemplos a seguir,
diferentes formas de usar um label:
<TextView
59
Competência 05
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:text="http://www.google.com" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000ff"
android:textColor="#ffffff"
android:text="Texto branco (text_color) e fundo azul (background)" />
</LinearLayout>
60
Competência 05
5.2 EditText
A classe EditText é utilizada quando se deseja criar um campo onde o usuário irá digitar
informações de texto. Esse texto pode ser um texto normal (letras mais números), apenas números,
apenas letras ou mesmo senhas.
A classe EditText é bastante utilizada na criação de formulários. Vamos ver um exemplo
clássico da sua utilização através de um formulário de login e senha:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="Login:"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="Senha:"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:textSize="20dp"/>
61
Competência 05
</LinearLayout>
Figura 12 - Exemplo de um formulário com utilização de dois campos de texto representados por dois EditText.
Fonte: o autor.
Descrição: a imagem mostra um texto com o valor Login: no canto esquerdo superior, abaixo está um campo de texto
que permite o usuário digitar o seu login. Abaixo do campo de texto do login está um texto com o valor Senha: e abaixo
do texto senha existe o seu respectivo campo de texto para o usuário digitar a senha.
Note que o segundo EditText representa um campo de senha definido pelo atributo
android:password que é usado para camuflar os caracteres que são escritos.
62
Competência 05
<Button
android:id="@+id/btn01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Botão 01"/>
<ImageButton
android:id="@+id/imgBtn02"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/android_mini2"/>
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.button_image_button_layout);
63
Competência 05
Mais adiante, ainda neste capítulo veremos outros detalhes sobre a utilização da classe
Toast, responsável pela exibição de mensagens.
64
Competência 05
5.4 CheckBox
Um Checkbox no Android é um componente que, não só no Android como de modo
geral, pode possuir o estado de marcado ou desmarcado. Geralmente é usado quando se quer fazer
uma escolha mútua, que não seja mutuamente exclusiva. Por exemplo, imagine que existe um
formulário que pergunta quais tecnologias você domina ou conhece e existem várias opções:
Objective C, Java, Ruby, C/C++, se você conhecer mais de uma tecnologia o ideal é que o
componente usado para representar essas opções seja um checkbox. Para ilustrar esse cenário, veja
o exemplo a seguir.
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Assinale as tecnologias que você já trabalhou:"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Java"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="C/C++"/>
<CheckBox
android:layout_width="wrap_content"
65
Competência 05
android:layout_height="wrap_content"
android:text="C#"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="JavaScript"/>
</LinearLayout>
</LinearLayout>
5.5 RadioButton
O componente RadioButton é usado quando dentre algumas opções o usuário só pode
escolher uma, ou seja, as opções são mutuamente exclusivas, não sendo possível ter mais de uma
resposta para a mesma pergunta. Por exemplo, o RadioButton é o componente mais usado quando
se deseja saber o sexo de um usuário, este pode ser masculino ou feminino, ou quando se quer
fazer uma pergunta cuja resposta é sim ou não.
<TextView
android:id="@+id/lblSexo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
66
Competência 05
android:text="Sexo:"/>
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioM"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Masculino"/>
<RadioButton
android:id="@+id/radioF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Feminino"/>
</RadioGroup>
</LinearLayout>
O RadioGroup indica que seus elementos internos são mutuamente exclusivos, quando
você escolher um RadioButton o outro vai ser automaticamente desmarcado. Para verificar se o
RadioButton está marcado você pode usar o método do RadioGroup chamado
getCheckedRadioButtonId() da seguinte forma:
Caso o valor de radioM_Checked seja true indica que o RadioButton com o valor
Masculino está selecionado, da mesma forma pode-se fazer para o outro RadioButton. Vamos ver
como fica o layout do nosso exemplo:
67
Competência 05
Figura 14 - Exemplo da utilização do componente de RadioButton com o sexo: Masculino ou Feminino. Que são
mutualmente exclusivos.
Fonte: o autor.
Descrição: a imagem mostra um texto no canto superior esquerdo com o valor Sexo: e abaixo estão dois RadioButton
usadoS, geralmente, para representar escolhas que são mutuamente exclusivas, no caso os seus valores são masculinos
e femininos, que se encontram lado a lado na imagem.
5.6 Spinner
A classe Spinner no Android é responsável por desenhar na tela um combo box, ou seja,
um conjunto de opções. Para que o combo seja preenchido com uma lista é necessário a
implementação da classe SpinnerAdapter.
A seguir vamos ver um exemplo de um combo com uma lista de países e ao selecionar o
país a aplicação irá exibir a sua bandeira.
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Selecione um país:"/>
<Spinner
android:id="@+id/combobox"
android:layout_width="match_parent"
68
Competência 05
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/imgPais"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spinner_layout);
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_item);
combobox.setAdapter(adaptador);
combobox.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
69
Competência 05
imgPais.setImageResource(imagens[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
Uma observação a ser feita a respeito desse exemplo é que, para exibir a imagem das
bandeiras corretamente, você primeiro deve baixá-las e colocá-las na pasta drawable. Sempre que
você quiser exibir uma imagem no seu app, você pode colocá-la nessa pasta e, para ter acesso a
essa imagem, basta digitar R.drawable.NOME_DA_IMAGEM sem a extensão do arquivo (.jpg, .png,
etc.). No caso, para você conseguir visualizar as diferentes bandeiras do exemplo, você teria que
fazer o download das imagens, colocar na pasta drawable e o nome das imagens teriam que ser
iguais ao nome correspondente aos elementos do array de inteiros.
Veja na figura 15 a seguir como ficou o nosso exemplo:
Figura 15 - Imagem que representa um exemplo da utilização de um Spinner que, ao mudarmos o nome do
país, muda também a imagem da bandeira que o representa.
Fonte: o autor.
70
Competência 05
Descrição: a imagem mostra dois prints de uma mesma tela, em ambas existe um texto com o valor
Selecionar um país: logo abaixo está um Spinner, também conhecido como ComboBox, que representa um
conjunto de opções, no caso um conjunto de países. Na primeira tela está selecionado no Spinner o valor
Brasil e abaixo está sendo exibida a bandeira. Na outra imagem está selecionado o país Canada e abaixo está
sendo exibida a bandeira canadense.
5.7 ProgressDialog
Você já deve ter visto muitas vezes no momento de abrir um software no carregamento ou no
processo de instalação a seguinte mensagem: “Por favor, aguarde...” ou “Aguarde, essa operação
pode demorar alguns minutos...”. No Android existe uma classe especialmente para isso, a classe
ProcessDialog, filha da classe Dialog.
A seguir veremos um exemplo bastante simples exibindo a mensagem “Por favor, aguarde...”.
Colocando esse trecho de código acima, no onCreate da sua activity, será exibida uma janela de
progresso com o título e mensagem informados. A classe ProgressDialog é bastante usada quando
se deseja fazer um processamento que não se sabe quanto tempo irá durar, ou seja, o tempo é
indeterminado. Por exemplo, imagine que você queira que a sua aplicação exiba/carregue ou faça
um download de um documento PDF ou de uma imagem que se encontra na internet (o tempo de
resposta de requisições feitas utilizando a internet é indeterminado, depende muito da rede do
usuário). Enquanto esse processo está sendo executado, um alerta de progresso deve ser exibido na
tela (OBS: caso você esteja fazendo alguma operação que use a internet é necessário adicionar a
permissão no arquivo AndroidManisfest.xml).
71
Competência 05
5.8 Toast
A classe Toast é usada para exibir alertas para o usuário, inclusive, nós já a usamos algumas vezes
aqui no nosso material para exibir algumas mensagens de feedback para o usuário. Normalmente,
os alertas exibidos duram pouco tempo, para isso utiliza-se a constante Toast.LENGTH_SHORT. Para
o alerta demorar mais, pode-se utilizar a constante Toast.LENGTH_LONG. A forma mais simples de
exibir um alerta é usando o método Toast.makeText(contexto, mensagem, tempo_de_duração).
A seguir veremos um exemplo da utilização da classe Toast:
Esse tipo de alerta é o mais simples possível, caso você queira exibir um alerta mais complexo, com
72
Competência 05
uma interface gráfica mais rebuscada e customizada, você pode desenvolver a sua view e usar o
método toast.setView(view) para especificar a interface que você criou. Observe que o método
setView recebe uma View, e todos os elementos que vimos nesse capítulo e no anterior (o de
gerenciadores de layout) são filhos da classe View.
5.9 Resumo
Nesse capítulo vimos muitos elementos de layout que fazem parte da classe View, contudo, existem
vários outros. O importante é você conhecer os principais e à medida que você for tendo mais
experiência e for necessitando de elementos mais complexos você consultar a documentação ou
buscar outros exemplos e tutorias na internet que ajudem a usar esses novos elementos.
73
Competência 06
74
Competência 06
Para preencher o valor da variável “status”, no caso por ser um booleano, para se
especificar o valor usa-se o método putBoolean, vamos ver um exemplo:
75
Competência 06
Note que no final existe o método commit(). Esse método é usado para efetuar a
modificação dos valores da classe SharedPreferences. Sem esse método as modificações não serão
aplicadas. Nesses dois exemplos foi mostrado como recuperar e salvar uma variável do tipo
booleano (true ou false), contudo você poderia salvar e recuperar variáveis de outros tipos como
mostra a figura 17.
76
Competência 06
você já vir logado, não é necessário você logar toda vez, pois muitas aplicações armazenam ou um
arquivo com um token de autenticação ou armazenam esse token no seu sharedPreferences e esse
token é usado nas demais requisições e validam o usuário logado. Esse armazenamento de token de
autenticação é uma prática bastante difundida, pois evita que sejam armazenados o login e senha
do usuário por questões de segurança.
6.5 GPS
A API de GPS utiliza o hardware do dispositivo para informar a localização do usuário.
Para utilização da API é preciso adicionar as permissões ACCESS_FINE_LOCATION e
ACCESS_COARSE_LOCATION no arquivo AndroidManifest.xml.
Para obter a localização do usuário através do GPS, basta implementar a interface
LocationListener na mesma activity que você está utilizando o mapa. Existem vários métodos nessa
77
Competência 06
6.6 Resumo
Neste capítulo, vimos diferentes formas de armazenar informações no Android e vimos
diferentes APIs que podem ser usadas nos mais diversos tipos de aplicações. Existem muitas outras
APIs, aqui só vimos algumas delas como possibilidades de enriquecermos ainda mais nossas
aplicações android, pois é importante saber que elas existem para caso você precise no futuro,
desta forma você já sabe como procurar e saber que existe algo que possa suprir sua necessidade
naquele momento.
78
Competência 07
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>
79
Competência 07
usuário qual a versão da aplicação que ele possui instalada. Dessa forma, o usuário pode ter uma
versão anterior à versão da loja e ele pode identificar essa desatualização pelo nome da versão
apresentado através da tag versionName.
Caso você esteja usando o Android Studio, existe um arquivo chamado build.gradle que
fica em Gradle Scripts que contém as configurações de build da sua APK, nele, assim como no
AndroidManifest.xml você também pode definir o versionCode e o versionName da sua aplicação.
Existindo esse arquivo (no caso de você estar usando o Android Studio), ele tem prioridade sobre as
configurações de build do projeto, ou seja, caso você defina o versionName e versionCode no
AndroidManifest, mas o seu projeto também tenha o arquivo build.gradle, as informações que
serão usadas serão as informações contidas no build.grade, como mostra a figura 19. A seguir,
veremos onde fica esse arquivo na estrutura de um projeto criado pelo Android Studio e veremos
também o seu conteúdo, como mostra a figura 20.
Figura 19 - Estrutura de um projeto Android criado pelo Android Studio e localização do arquivo build.gradle
Fonte: o autor.
Descrição: a imagem mostra a estrutura de pastas de um projeto em Android criado no Android Studio e mostra onde o
arquivo build.gradle está localizado.
80
Competência 07
81
Competência 07
<manifest
...>
...
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="21" />
</manifest>
82
Competência 07
Existem vários artigos na internet mostrando como assinar a sua APK, seremos bem
objetivos aqui. Para gerar o seu certificado você precisa rodar um comando usando uma ferramenta
do Java chamada keytool. Essa ferramenta encontra-se na pasta bin da JDK que está instalada no
seu computador, por exemplo, C:\Program Files\Java\jdk1.8.0_101\bin, lá você encontra um
arquivo chamado keytool.exe. Abra o prompt de comando do Windows ou o Terminal do Linux ou
do seu Mac, e vá até essa pasta. Quando chegar nesse diretório digite o seguinte no terminal:
83
Competência 07
Figura 172 - Exemplo de como executar o comando e preencher as informações para geração de um certificado para
assinar a APK Android.
Fonte: o autor
Descrição: a imagem mostra o prompt do Windows, onde foi digitado o comando para a geração do certificado e as
demais perguntas que se seguem para que o certificado seja criado com sucesso.
Se você tiver usando o Android Studio, existe uma forma mais amigável de gerar esse
certificado. Basta ir no menu clicar em Build e depois em Generate Signed APK... Irá abrir uma
janela como a da figura 23:
Basta você clicar no botão Create new... e preencher as informações e seu certificado
será criado.
Agora que temos a nossa chave privada podemos assinar a nossa aplicação.
84
Competência 07
Após criar o certificado, basta usá-lo para assinar a sua APK. Mas como fazer isso? Para
assinar a sua APK usando o certificado que você criou, basta importá-lo no Android Studio clicando
no botão Choose existing..., digitar a sua senha e gerar a sua APK assinada clicando no botão Next,
como exibido na figura 24.
Quando você clicar no botão Next vai aparecer uma janela pedindo para você informar
o local onde você deseja que a sua APK assinada seja gerada, ao final do processo basta clicar em
Finish como mostra a figura 25.
85
Competência 07
86
Competência 07
São quatro passos para concluir o seu cadastro de desenvolvedor, o primeiro é fazer o
login com uma conta Google, depois aceitar os termos de uso do contrato (disponível em
https://play.google.com/about/developer-distribution-agreement.html), pagar 25 dólares e, por
fim, fornecer os detalhes da conta como é exibido na figura 27.
Figura 227 - Tela de pagamento, basta inserir o cartão de crédito e pagar 25 dólares.
Fonte: o autor
Descrição: a imagem mostra a tela com as informações do cartão de crédito juntamente com o valor da licença para o
pagamento.
87
Competência 07
88
Conclusão
Conclusão
Finalizamos a disciplina de Android avançado do nosso curso. O objetivo desse curso foi
mostrar uma visão mais detalhada e aprofundada dos assuntos já abordados na disciplina básica de
Android, além de mostrar novos conceitos.
Alguns conceitos aqui foram abordados de forma bastante detalhada e aprofundada
como Activity e Intent, por exemplo, já outros foram abordados de forma mais superficial para você
saber que existe e quando alguém falar com você ou você precisar de algo você já saber como
pesquisar.
Muito do que aprendemos aqui requer dedicação e prática, pois é preciso entender o
conceito e praticá-lo para saber e ver com funciona. Existem muitos tutoriais na internet e bons
livros como o “Google Android: aprenda a criar aplicações para dispositivos móveis” de Ricardo
Lecheta, que é espetacular tanto no que se refere ao conteúdo quanto à didática.
Caso algum conceito não tenha ficado muito claro, volte e o releia, ou procure outra
fonte para entendê-lo e amadurecê-lo. É sempre bom você ter mais de um material de estudo, pois
caso você não entenda da forma que um professor escreveu um determinado conceito pode ser
que outro escreva de forma mais clara, numa linguagem mais natural.
Lembre-se de quanto mais você praticar e exercitar, mais o trabalho irá parecer fácil e
natural e mais experiente você ficará. Não perca tempo, pratique e durante esse processo divirta-
se!
Um grande abraço e boa sorte! =)
89
Referências
Referências
LECHATA, Ricardo R. Google Android: aprenda a criar aplicações para dispositivos móveis com o Android
SDK. São Paulo: Novatec, 2015.
90
Minicurrículo
Minicurrículo do Professor
Gilson de Oliveira
É formado em Ciência da Computação pela Universidade Federal de
Pernambuco, com mestrado em Ciência da Computação pela UFPE na
área de sistemas distribuídos. Atualmente é analista de sistemas senior
na empresa TECON Suape. Possui experiência com diversas tecnologias
(Android, Objective C, Java Web, .NET, AngularJS, dentre outras) e
plataformas (Desktop, Web, Mobile).
91