2. Ementa
1. Introdução ao Android
2. Ambiente de desenvolvimento
3. Conceitos básicos
4. Application, Activities e Fragments
5. Intents e Broadcast Receivers
6. Views e Layout Managers
7. Persistência de dados e Content Providers
8. Arquivos, estados e Shared Preferences
2
3. Ementa
Conceitos básicos
Criação do primeiro projeto
Arquitetura básica da aplicação
Execução do projeto em emulador e dispositivo físico
Exemplos básicos
Assinatura, exportação e registro no Google Play
3
4. Criação do primeiro projeto
Para criar um novo
projeto Android, o
processo é trivial
File -> New -> Other
Android Application Project
Obs: Atente para as outras
opções abaixo do folder
Android. Ainda vamos lidar
com algumas delas
4
5. Criação do primeiro projeto
- Nome da sua aplicação. Como
aparecerá no dispositivo e no Google
Play Store
- Nome do projeto. Como aparecerá
no Eclipse e será o diretório da
aplicação
- Pacote padrão da aplicação
- Menor versão da API que sua
aplicação suportar. Importante
analisar o mercado para não deixar
clientes potenciais de fora.
5
14
6. Criação do primeiro projeto
- Versão alvo do projeto. Deve ser a
versão mais alta que você puder
testar. O ADT sugere a API 16, mas
se você puder testar, use a maior
possível
- Versão da API que você vai utilizar
para resolver as classes e demais
recursos enquanto desenvolve. Como
qualquer projeto Java, o compilador
vai precisar conhecer quem você
referenciar
- O Android suporta configurações de
temas para composição da interface
gráfica. Os já disponíveis são
sugeridos aqui. Vamos deixar no
padrão.
6
14
7. Criação do primeiro projeto
- Se marcada, proporciona uma nova
tela de escolha do ícone da aplicação
- Se marcada, proporciona uma nova
tela de configuração da classe
principal do projeto. (Criação da
primeira Activity).
- As demais são configurações
padrão do Eclipse para todo projeto
Java. Se ele vai ser apenas uma
biblioteca para outros projetos, onde
ele deve ser fisicamente salvo e se ele
vai participar de algum working set de
um programador que já estiver cheio
de projetos no workspace atual
7
14
8. Criação do primeiro projeto
Escolha do ícone da
aplicação
É possível carregar uma
imagem a partir de arquivos,
escolha de cliparts ou
textos
A tela mostra algumas
configurações extras bem
intuitivas
Na área de cliparts, já
aparece uma lista bem
variada de sugestões
8
9. Criação do primeiro projeto
Criação da primeira
Activity
Precisamos ainda detalhar
mais o que é uma Activity.
Por enquanto, saiba que é
uma classe Java que
controla a interface (view)
escrita em documento XML
O checkbox pergunta se
você quer aproveitar para
criar a primeira Activity e o
quadro apresenta alguns
modelos de tela
O MasterDetailFlow usa Fragments, por isso necessita
da API do Honeycomb. Comece pela BlankActivity
9
10. Criação do primeiro projeto
Escolha do nome da
Activity
Neste caso, serão gerados
dois arquivos, escolha o
nome de cada um deles
Sugeridos: MainActivity.java
e activity_main.xml
Qualquer método de
Navigation Type sugerido
vai precisar no mínimo da
API do HoneyComb (API
11, Android 3.0)
10
11. Projeto criado o/ Escolha onde
e como quer pre-
visualizar o
aplicativo
Estrutura
fundamental do Preview da tela
projeto
Paleta de
componentes
Escolha entre
preview gráfico e
fonte XML
11
12. Arquitetura básica da app
- src: Diretório dos fontes Java.
- gen: Diretório onde fontes Java são gerados
automaticamente. Você não deve alterar os arquivos
- Android 4.2: Biblioteca da API (compile with)
- Android Dependencies: Local onde são exibidos
quais jars fazem parte do projeto
- assets: Diretório onde salvar recursos extras como
páginas html, arquivos de texto ou de fontes, bancos
- bin: Onde vão ficar os arquivos gerados na
construção (build) do projeto, como o .apk final
- libs: Local onde sugere-se que fiquem as
bibliotecas do projeto. Falaremos adiante sobre isso
- res: Pasta geral dos recursos estáticos do projeto
- drawable-*: Diretório das imagens do projeto
- layout e menu: Onde ficam os arquivos das views
- values*: Local para os arquivos das mensagens de
texto. Foco na internacionalização
12
13. Arquitetura básica da app
AndroidManifest.xml
Arquivo que contém todas as configurações do projeto como:
Declarações dos componentes da aplicação com Activities,
Services, Broadcast Receivers ou Content Providers
Nome de pacote, arquivo do ícone, nome e tema da aplicação
Versões mínima e máxima indicada
Deve ser salvo logo na raíz do projeto
Segurança para o usuário
Apps devem declarar aqui suas necessidades de permissões de
usuário para realizar atividades no aparelho
Apps não são instaladas quando usuário não concede uma
permissão listada neste manifest
13
14. AndroidManifest.xml
Código (em geral
inteiro) e nome da
versão da app
API mínima e a
alvo (máxima
testada)
Lista de
declarações de Se a aplicação vai entrar nas rotinas
Activities da de backup do sistema e referências
aplicação ao ícone, rótulo e tema da aplicação
Action MAIN significa que a VM poderá chamar
esta aplicação iniciando por esta Activity
Category LAUCHER significa que aplicação pode ser
chamada pelo usuário a partir de sue ícone
14
15. Arquitetura básica da app
Classe R - meupacote.R.java
Classe que carrega classes internas estáticas com constantes
dentro
Cada constante recebe um número de referência a algum
recurso do projeto
Os recursos podem ser arquivos salvos em algum subdiretório
de res
Os recursos também podem ser valores de entrada em
documentos XML como em string.xml
Não deve ser alterada manualmente. A alteração seria
sobrescrita no próximo build do projeto
A API do Android também traz a sua classe R (android.R)
Cuidado porque é comum a gente se confundir quando está
começando
15
16. Classe R.java
Cada imagem
salva nas pastas
drawable-*dpi
Cada id de cada
componente dentros
dos XML de layout Cada arquivo
XML de layout
Cada arquivo
XML de layout de
Cada valor dos
menu de contexto
arquivos XML de
mensagens
Cada valor dos
arquivos XML de
estilo
16
17. Arquitetura básica da app
Recursos drawable-*dpi
Diretórios onde estão salvas imagens com mesmo nome
A imagem escolhida será a do diretório cujo padrão é o mais
próximo da densidade real do dispositivo
DPI - Dots per inch - Pontos por polegada
Dens = raiz ( (largura * largura) + (altura * altura) ) / tamanhoTela
Ex.: LG Nexus 4 - 1280 x 768 em 4.7 polegadas
raiz ((1280 * 1280) + (768 * 768)) / 4.7 = 317.60
Ex.: HTC Droid DNA: 1920 x 1080 em 5.0 polegadas
raiz ((1920 * 1920) + (1080 * 1080)) / 5.0 = 440.58
17
18. Recursos drawable-*dpi
Há quatro padrões de
densidades conforme a
imagem ao lado
LDPI - 0.75 a MDPI
MDPI - Tamanho base
HDPI - 1.5x a MDPI
ic_launcher.png (largura x altura) XHDPI - 2x a MDPI
LDPI - 32 x 32 (0.75x)
MDPI - 48 x 48 (1x)
HDPI - 72 x 72 (1.5x)
XHDPI - 96 x 96 (2x)
Estratégia: Use o padrão do seu dispositivo base e recalcule as
demais imagens em razões fixas a partir das feitas para ele
19. Arquitetura básica da app
Arquivos de layout e menu
Arquivos que definem o conteúdo das telas e dos painéis que
aparecem sobre postos quando o botão de menu é
pressionado
Vamos abordar componentes de interface, portanto, o diretório
layout ainda vai conter outros arquivos nossos
Precisam ser controlados por uma Activity ou um Fragment
para poderem ser exibidos na tela
O processo de leitura, interpretação e exibição de um layout é
comumente chamado de inflar (devido ao termo Inflater
recorrente na API)
19
20. Arquitetura básica da app
Arquivos XML de valores (values)
Foram gerados dois tipos de values:
strings.xml
Documento XML que traz declarações de textos como:
<string name="app_name">Minha Primeira App</string>
É possível acessar em classes da seguinte forma:
R.string.app_name (app_name é uma constante da classe interna string)
É possível acessar em arquivos XML conforme o exemplo:
<TextView android:text=“@string/app_name”/>
20
21. Arquitetura básica da app
Arquivos XML de valores (values)
Foram gerados dois tipos de values:
styles.xml
Arquivos onde é possível definir tags que carregam cores,
definições de tema, dimensões, etc
As mesmas regras para chamada de strings funcionam em
styles, apenas trocamos o palavra string por style
Os diretórios values-vXX, onde XX é uma versão de API,
sobrescrevem os arquivos contidos em values, em dispositivos
com esta API ou superior
Os temas Holo estão disponíveis desde o Honeycomb (3.0 / API 11)
No exemplo, foi usado um tema disponível a partir do ICS - 4.0 / API 14
21
22. Execução do projeto
Para criar um projeto crie uma launch configuration
2. Clique no icone 3. Defina o nome
new launch da configuração
1. Clique em
Android 4. Escolha o
Application projeto a ser
carregado
5. Escolha a
Activity que vai ser
chamada
6. Aplique as
alterações
22
23. Execução do projeto
6. Defina o método de
carregamento:
1. Sempre perguntar o dispositivo
2. Carregar em todos os dispositivos
3. Sempre escolher um
dispositivo da lista abaixo
7. Aplique as
alterações ou
mande rodar
23
24. Execução do projeto
Escolha dentre os
dispositivos ligados
Ou mande iniciar
alguma instância do
O Ok vai acender
emulador configurada
quando você escolher o
dispositivo.
24
25. Execução do projeto
Tiramos uma foto da tela do dispositivo, como?
No DDMS
2. Clique no botão
Screen Capture
1. Selecione o
dispositivo
25
27. Execução do projeto
Mas eu quero
executar no aparelho!!!
Acione as configurações
(botão de options menu
na home screen ou app
Ajustar)
Vá em Opções do
desenvolvedor
Marque Depuração USB
27
28. Execução do projeto
No tablet, vá em
Configurações
Ligue a depuração USB
Opções do
desenvolvedor
Agora é só
espetar o brinquedo
na porta USB da
máquina
28
29. Execução do projeto
É só escolher onde
vai rodar e
VOILÁ!!!!
2h da manhã???
Putz!
29
30. Exemplos básicos
Agora que a brincadeira tá ficando legal, vamos a
alguns exemplos básicos para você praticar
1. Capturar componentes da view
1.1 Crie um aplicativo que carregue uma imagem dinamicamente
e informe o padrão de densidade adotado
2. Manipulação de eventos
2.1 Crie um aplicativo que calcule o Índice de Massa Corporal
Crie dois campos para pedir o peso e a altura do cliente, um botão para
disparar o cálculo e um rótulo para exibir o resultado
3. Criar uma tela MasterDetailFlow
3.1 Crie uma lista de produtos
30
36. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ImagemVsDensidade" >
<ImageView ImageView que
android:id="@+id/imgResolucao" Por razões de
android:layout_width="wrap_content" arrastamos pra cá
android:layout_height="wrap_content" acessibilidade, defina o
android:layout_alignParentLeft="true" contentDescription. Versão
android:layout_alignParentTop="true" escrita do que está na
android:layout_marginLeft="20dp" imagem
android:layout_marginTop="20dp"
android:src="@drawable/ic_launcher"
android:contentDescription="@string/title_activity_imagem_vs_densidade" />
<TextView
android:id="@+id/txtResolucao"
android:layout_width="wrap_content" TextView que já
android:layout_height="wrap_content" existia, nós só o
android:layout_alignBottom="@+id/imgResolucao" reposicionamos no editor
android:layout_marginLeft="29dp"
visual
android:layout_toRightOf="@+id/imgResolucao" />
</RelativeLayout>
33
37. package br.com.especializa.minhaprimeiraapp;
import android.app.Activity; Utilize o Override
import android.view.View;
import android.widget.ImageView; Implement Methods
import android.widget.TextView; do Eclipse para gerar
esse método
public class ImagemVsDensidade extends Activity {
! @Override Você recupera um
! public void onWindowFocusChanged(boolean hasFocus) {
! ! super.onWindowFocusChanged(hasFocus); objeto da view através
! ! View v = findViewById(R.id.imgResolucao); // Vem da classe R do seu id passado ao
! ! ImageView imagem = (ImageView) v; // olha o cast pra ImageView findViewById
! ! int largura = imagem.getWidth();
! !
! ! TextView texto = (TextView) findViewById(R.id.txtResolucao); // O cast agora foi direto
! ! texto.setText("Largura: " + largura);
! ! switch (largura) {
! ! ! case 36:
! ! ! ! texto.setText(texto.getText() + " - Resolução LDPI");
! ! ! ! break;
! ! ! case 48:
! ! ! ! texto.setText(texto.getText() + " - Resolução MDPI");
! ! ! ! break;
! ! ! case 72:
! ! ! ! texto.setText(texto.getText() + " - Resolução HDPI");
! ! ! ! break;
! ! ! case 96:
! ! ! ! texto.setText(texto.getText() + " - Resolução XHDPI");
! ! ! ! break;
! ! }! !
! }
// Os métodos onCreate e onCreateOptionsMenu foram apenas omitidos aqui
}
34
39. O que aprendemos aqui
View
Arrastar e alinhar componentes para a tela usando o editor
gráfico
Activity
findViewById, método comum a toda Activity, que recebe
um inteiro e retorna um objeto do tipo View
Ainda vamos discutir o porquê do método
onWindowsFocusChanged em vez do onCreate (tem a ver com
o ciclo de vida da Activity)
Classe R
Como usar suas informações para simplificar referências a
recursos
36
41. Alterações na View
<TextView
android:id="@+id/txtResolucao" textAppearanceLarge
android:layout_width="wrap_content" - Texto maior sem
android:layout_height="wrap_content"
especificar o quanto
android:layout_alignBottom="@+id/imgResolucao"
android:layout_marginLeft="29dp"
android:layout_toRightOf="@+id/imgResolucao"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/txtBonus" Novo textView para
android:layout_width="wrap_content" exibir mais informações
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/imgResolucao"
android:layout_below="@+id/imgResolucao"
android:layout_marginTop="17dp"/>
38
42. Alterações na View
<TextView
android:id="@+id/txtResolucao" textAppearanceLarge
android:layout_width="wrap_content" - Texto maior sem
android:layout_height="wrap_content"
especificar o quanto
android:layout_alignBottom="@+id/imgResolucao"
android:layout_marginLeft="29dp"
android:layout_toRightOf="@+id/imgResolucao"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/txtBonus" Novo textView para
android:layout_width="wrap_content" exibir mais informações
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/imgResolucao"
android:layout_below="@+id/imgResolucao"
android:layout_marginTop="17dp"/>
Alterações na Activity - no fim do método onWindowFocusChanged
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
TextView bonus = (TextView) findViewById(R.id.txtBonus);
bonus.setText("Mais detalhes sobre a tela:n" +
! ! ! "Largura Total: " + displayMetrics.widthPixels + "pxn" +
! ! ! "Altura Total: " + displayMetrics.heightPixels + "pxn" +
! ! ! "Densidade: " + displayMetrics.densityDpi + "dpin" +
! ! ! "Padrão: " + displayMetrics.density);
if (displayMetrics.density == 0.75) bonus.setText(bonus.getText() + "nPadrão: LDPI");
if (displayMetrics.density == 1) bonus.setText(bonus.getText() + "nPadrão: MDPI");
if (displayMetrics.density == 1.5) bonus.setText(bonus.getText() + "nPadrão: HDPI");
if (displayMetrics.density == 2) bonus.setText(bonus.getText() + "nPadrão: XHDPI");
38
43. O que aprendemos aqui
DisplayMetrics
Classe que traz informações sobre a tela como tamanho e
densidade
getWindowManager() é um método de Activity que retorna
um objeto WindowManager, o gestor de janelas do Android.
Seu método getDefaultDisplay() retorna o objeto que informa
dados sobre a tela
O getMetrics() popula o DisplayMetrics com os dados que
precisamos
39
44. Resultado do código bônus
Embora com a
mesma densidade,
houve uma leve diferença
de layout
Galaxy SII Hazr Maxx Optimus One
ICS 4.0.3 ICS 4.0.4 Froyo 2.2.1
40
45. Dica útil - código-fonte da API
Clicando em
alguma classe da API
segurando o ctrl, você
virá pra cá
Clique em Attach
Source
41
46. Dica útil - código-fonte da API
Clicando em
alguma classe da API
segurando o ctrl, você
virá pra cá
Clique em Attach
Source
Selecione External location
e clique em External Folder.
Navegue até a o diretório do
SDK /sources/android-17
41
47. Manipulação de eventos
Tente montar
uma tela como esta
aqui
EditText
NumberDecimal
Button
Propriedades.
Sempre troque os Ids
dos componentes
42
48. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".IMCActivity" > layout_width:
<TextView wrap_content - Seja
android:id="@+id/textView1" grande o suficiente
android:layout_width="wrap_content" apenas para caber seu
android:layout_height="wrap_content"
conteúdo
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:text="@string/imc_titulo"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textPeso"
android:layout_width="wrap_content" Aparência. Texto
android:layout_height="wrap_content"
android:layout_alignLeft="@id/textView1" largo ou médio
android:layout_below="@id/textView1"
android:layout_marginTop="20dp"
android:text="@string/imc_peso"
android:textAppearance="?android:attr/textAppearanceMedium" />
<!-- continua -->
43
49. <!-- continuação -->
<EditText
android:id="@+id/editPeso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/textPeso"
android:layout_marginLeft="15dp"
android:layout_toRightOf="@id/textPeso" ems - tamanho em
android:ems="10" medida de letra (o
android:inputType="numberDecimal" > tamanho do M)
<requestFocus />
</EditText>
<TextView
android:id="@+id/textAltura"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/textView1"
android:layout_below="@id/textPeso"
android:layout_marginTop="20dp"
android:text="@string/imc_altura"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editAltura"
android:layout_width="wrap_content"
dp: density-
android:layout_height="wrap_content"
android:layout_alignTop="@id/textAltura" independent pixel
android:layout_marginLeft="15dp" 1dp ou dip = 1px (um
android:layout_toRightOf="@id/textAltura" pixel) em 160dpi
android:ems="10"
android:inputType="numberDecimal"/> (MDPI).
<!-- continua -->
44
50. <!-- continuação -->
<EditText
android:id="@+id/editPeso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/textPeso"
android:layout_marginLeft="15dp"
android:layout_toRightOf="@id/textPeso" ems - tamanho em
android:ems="10" medida de letra (o
Não
android:inputType="numberDecimal" >
<requestFocus /> confunda: do M)
tamanho
</EditText>
dp = dip != dpi
<TextView DPI significa Dots per Inch ou pontos (na tela,
android:id="@+id/textAltura"
android:layout_width="wrap_content" Tem a ver com a resolução x
pixels) por polegada.
android:layout_height="wrap_content" que mede a densidade de
dimensão da tela, o
android:layout_alignLeft="@id/textView1"
pixels nas telas dos dispositivos.
android:layout_below="@id/textPeso"
DP ou DIP significa Density-Independent Pixels
android:layout_marginTop="20dp"
android:text="@string/imc_altura"
android:textAppearance="?android:attr/textAppearanceMedium" vale
que é a unidade de medida variável que />
<EditText 1 pixel em telas de 160DPI (MDPI).
android:id="@+id/editAltura"
android:layout_width="wrap_content"
dp: density-
android:layout_height="wrap_content"
android:layout_alignTop="@id/textAltura" independent pixel
android:layout_marginLeft="15dp" 1dp ou dip = 1px (um
android:layout_toRightOf="@id/textAltura" pixel) em 160dpi
android:ems="10"
android:inputType="numberDecimal"/> (MDPI).
<!-- continua -->
44
52. package br.com.especializa.minhaprimeiraapp;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button; Desta vez,
import android.widget.EditText; podemos usar o
import android.widget.TextView; setOnClickListener
onCreate mesmo
define o objeto do tipo
public class IMCActivity extends Activity { View.OnClickListener
! @Override
ouvinte do evento de
! protected void onCreate(Bundle savedInstanceState) { click do mouse
! ! super.onCreate(savedInstanceState);
! ! setContentView(R.layout.activity_imc); onClick
! !
! ! Button ok = (Button) findViewById(R.id.btnOk); (View), método
! ! ok.setOnClickListener(new View.OnClickListener() { chamado quando o
! ! ! @Override botão for clicado
! ! ! public void onClick(View v) {
! ! ! ! EditText editPeso = (EditText) findViewById(R.id.editPeso);
! ! ! ! EditText editAltura = (EditText) findViewById(R.id.editAltura);
! ! ! !
! ! ! ! double imc = Double.parseDouble(editPeso.getText().toString()) /
! ! ! ! ! ! ! Math.pow(Double.parseDouble(editAltura.getText().toString()), 2);
! ! ! ! ((TextView) findViewById(R.id.textResultado)).setText(
String.format("Imc: %.2f", imc));
! ! ! }
! ! });
! }
}
46
53. O que aprendemos aqui
Composição da View
Aproveite este exercício para se familiarizar com a ferramenta
visual de construção de tela.
Dê uma vista geral em Pallete e em Properties. Você vai aprender
bastante com elas
Ainda não falamos sobre gerenciadores de layout, mas já vimos
questões importantes como o valor wrap_content, o atributo
ems e a unidade de medida dp
Aproveite também para explorar os demais atributos como:
layout_* - Informações relativas e dependentes do gestor de layout
text* - Informações referentes aos textos
47
54. O que aprendemos aqui
API do Android - Classe View
Declara o método setOnClickListener
Registra um objeto ouvinte dos eventos de click do componente
Declara a classe interface OnClickListener
Quem garante ao componente que nosso objeto terá o método
que ele vai chamar ao ser clicado
Método onClick(View) de OnClickListener
Recebe o objeto View que foi clicado e disparou o evento
48
55. O que aprendemos aqui
Revisão de Java - nunca é demais saber
OnClickListener é uma interface
Uma classe especial que apenas declara métodos
Quem herdar dela (implements) assume o compromisso de
implementar os métodos que ele declarar (no caso, só o onClick)
OnClickListener foi escrita como membro interno de View,
portanto View.OnClickListener
Classe interna é uma opção do desenvolvedor que acredita que
ela é tão dependente da externa que sequer merece um arquivo
fonte à parte
Criamos uma classe anônima new View.OnClickListener() { ... }
O new induz a uma classe que herde de OnClickListener
As chaves demarcam o corpo da classe que não tem nome
49
56. O que aprendemos aqui
Revisão de Java - nunca é demais saber
OnClickListener é uma interface
Uma classe especial que apenas declara métodos
Quem herdar dela (implements) assume o compromisso de
implementar os métodos que ele declarar (no caso, só o onClick)
OnClickListener foi escrita como membro interno de View,
portanto View.OnClickListener
Classe interna é uma Foi apenas uma
opção do desenvolvedor que acredita que
ela é tão dependente da opcão!! que sequer merece um arquivo
externa
fonte à parte
Criamos uma classe anônima new View.OnClickListener() { ... }
O new induz a uma classe que herde de OnClickListener
As chaves demarcam o corpo da classe que não tem nome
49
57. O que aprendemos aqui
Revisão de padrões de projeto - nunca é demais saber
Listeners
Abordagem que possibilita a separação de responsabilidades e o
baixo acoplamento
De um lado está o componente visual (fornecido pela API) que
dispara o evento
Do outro está o nosso objeto que tem a nossa decisão de
resposta ao evento ocorrido
É através da interface que o componente sabe que método de
nossa classe chamar quando o evento ocorrer com ele
50
59. // Insira este código novo no final do método onClick
String mensagem = "";
if (imc < 17) mensagem = "Você está muito abaixo do peso";
else if (imc >= 17 && imc < 18.50) mensagem = "Você está abaixo do peso ideal";
else if (imc >= 18.50 && imc < 25) mensagem = "Você está no peso ideal";
else if (imc >= 25 && imc < 30) mensagem = "Você está com pequeno sobrepeso";
else if (imc >= 30 && imc < 35) mensagem = "Você já está obeso";
else if (imc >= 35 && imc < 40) mensagem = "Você já está com obesidade severa";
else if (imc >= 40) mensagem = "Você já está com obesidade mórbida";
Toast.makeText(IMCActivity.this, mensagem, Toast.LENGTH_SHORT).show();
Toast é makeText()
uma classe que é um método show() é quem de
gera mensagens de estático que define o fato exibe o balão na
texto temporárias conteúdo e formato tela
na tela do texto
52
60. O que aprendemos aqui
A classe Toast
Classe que produz mensagem para o usuário sem espaço para
interação e por um determinado tempo
makeText(context, mensagem, duracao)
context - É o objeto de onde ele vai tirar o LayoutInflater capaz
de carregar a View do Toast. Vamos tratar desse assunto em
outra aula
mensagem - String do texto ou int do R.string.mensagem
duracao - Tempo da mensagem: LENGTH_LONG ou
LENGH_SHORT
Há ainda o setView(View) que possibilita o carregamento de
Toast customizado
No caso, nós é que vamos precisar conhecer o LayoutInflater
53
61. MasterDetailFlow
Crie uma nova Activity
Escolha MasterDetailFlow
Ao clicar em next, aparecerá
uma tela como a ao lado
Se a opção minSdkVersion
do AndroidManifest.xml
for inferior à 11, você não
poderá seguir adiante
Cancele e altere para 11 este atributo da tag <uses-sdk> do
AndroidManifest.xml
54
62. MasterDetailFlow
Vamos novamente
Após alterar o manifest, crie
uma nova Activity e escolha
MasterDetailFlow
Na tela ao lado:
Object Kind: Nome de uma
classe Java de negócio
apenas para fins de exemplo
Object Kind Plural: Nomes
dos itens do exemplo no
plural
Title: Apenas um rótulo
qualquer
55
65. Google Play - Play Store
O Google Play é o mercado de produtos digitais da
Google
Abrangiu o antigo Android Marketing e estendeu para mais
produtos como
filmes, músicas
e e-books
58
66. Preparação
Antes de publicar uma app no Google Play, faça o
dever de casa:
AndroidManifest.xml - Principal arquivo deste processo
Realize testes à exaustão - App bugada queima seu filme
Certifique-se do min e o target SdkVersion
Confira os atributos versionCode e versionName
Limpe a casa! Apague arquivos desnecessários
Em <application>, se você usou o atributo debuggable, retire
Esse atributo é legal em fase de desenvolvimento
Com ele você pode depurar sua aplicação, o que dá mais poderes ao
serviço do adb e não é aceito no Google Play
59
68. Exporte a apk
Passos:
Botão direito sobre o projeto
-> Export
Export Android Application
60
69. Exporte a apk
Passos:
Botão direito sobre o projeto
-> Export
Export Android Application
Nomeie a app
60
70. Exporte a apk
Passos:
Botão direito sobre o projeto
-> Export
Export Android Application
Nomeie a app
Se já trabalhou com chaves
de criptografia e em Java e
possui um keystore, escolha
ele. Se não, Create new
keystore, defina uma senha e
clique em browse
60
71. Exporte a apk
Passos:
Botão direito sobre o projeto
-> Export
Export Android Application
Nomeie a app
Se já trabalhou com chaves
de criptografia e em Java e
possui um keystore, escolha
ele. Se não, Create new
keystore, defina uma senha e
clique em browse
Defina a pasta e o nome do
arquivo keystore
60
72. Chave criptográfica
Dados da chave dentro do
keystore
Alias - nome que identifica a
chave dentro do keystore
Password - senha de acesso
à chave
Validity - Validade do
certificado digital (em anos)
Dados organizacionais que
são publicados no
certificado digital
61
73. Chave criptográfica
.apk
Defina o local onde será
salvo o novo arquivo .apk
com o certificado
Vamos publicar este
arquivo no Google Play
62
74. Publicando o aplicativo
Vá ao Developer console do Google Play
Se não lembra como ou não criou a conta veja a aula 1
Abra esse link: https://play.google.com/apps/publish
Adicionar novo
aplicativo
Clique em adicionar
novo aplicativo,
defina seus dados e
clique em Enviar APK
63
79. Publicando o aplicativo
Apk
cadastrada mas
não publicada
ainda
Preencha os detalhes do
aplicativo e envie as imagens
exigidas (ícone em alta
resolução e pelo menos duas
telas)
65
80. Publicando o aplicativo
Apk
cadastrada mas
não publicada
ainda
Preencha os detalhes do
aplicativo e envie as imagens
exigidas (ícone em alta
resolução e pelo menos duas
telas)
Definidos ainda o preço e
distribuição, sua app vai estar
pronta para publicar
65