Curso de Android - aula 3

7.088 visualizações

Publicada em

Terceiros slides do curso de Android da Especializa Treinamentos (http://www.especializa.com.br/curso/android).

Publicada em: Tecnologia
0 comentários
24 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
7.088
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1.657
Ações
Compartilhamentos
0
Downloads
7
Comentários
0
Gostaram
24
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Curso de Android - aula 3

  1. 1. GoogleAndroid Jose Berardo Especializa Treinamentos 1
  2. 2. Ementa1. Introdução ao Android2. Ambiente de desenvolvimento3. Conceitos básicos4. Application, Activities e Fragments5. Intents e Broadcast Receivers6. Views e Layout Managers7. Persistência de dados e Content Providers8. Arquivos, estados e Shared Preferences 2
  3. 3. EmentaConceitos 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. 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. 5. Criação do primeiro projeto- Nome da sua aplicação. Comoaparecerá no dispositivo e no GooglePlay Store- Nome do projeto. Como apareceráno Eclipse e será o diretório daaplicação- Pacote padrão da aplicação- Menor versão da API que suaaplicação suportar. Importanteanalisar o mercado para não deixarclientes potenciais de fora. 5 14
  6. 6. Criação do primeiro projeto- Versão alvo do projeto. Deve ser aversão mais alta que você pudertestar. O ADT sugere a API 16, masse você puder testar, use a maiorpossível- Versão da API que você vai utilizarpara resolver as classes e demaisrecursos enquanto desenvolve. Comoqualquer projeto Java, o compiladorvai precisar conhecer quem vocêreferenciar- O Android suporta configurações detemas para composição da interfacegráfica. Os já disponíveis sãosugeridos aqui. Vamos deixar nopadrão. 6 14
  7. 7. Criação do primeiro projeto- Se marcada, proporciona uma novatela de escolha do ícone da aplicação- Se marcada, proporciona uma novatela de configuração da classeprincipal do projeto. (Criação daprimeira Activity).- As demais são configuraçõespadrão do Eclipse para todo projetoJava. Se ele vai ser apenas umabiblioteca para outros projetos, ondeele deve ser fisicamente salvo e se elevai participar de algum working set deum programador que já estiver cheiode projetos no workspace atual 7 14
  8. 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. 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. 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. 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. 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. 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. 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 dedeclaraçõ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. 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. 16. Classe R.java Cada imagem salva nas pastas drawable-*dpi Cada id de cadacomponente 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. 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. 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 MDPIic_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. 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. 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. 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. 22. Execução do projeto Para criar um projeto crie uma launch configuration2. 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. 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. 24. Execução do projeto Escolha dentre osdispositivos ligados Ou mande iniciar alguma instância do O Ok vai acenderemulador configurada quando você escolher o dispositivo. 24
  25. 25. Execução do projetoTiramos uma foto da tela do dispositivo, como?No DDMS 2. Clique no botão Screen Capture 1. Selecione o dispositivo 25
  26. 26. Execução do projeto Simulação de botões físicos de um aparelho Legal? 26
  27. 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. 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. 29. Execução do projeto É só escolher onde vai rodar e VOILÁ!!!! 2h da manhã??? Putz! 29
  30. 30. Exemplos básicosAgora que a brincadeira tá ficando legal, vamos aalguns 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
  31. 31. Capturando componentesNova Activity 31
  32. 32. Capturando componentesNova ActivityBlankActivity 31
  33. 33. Capturando componentesNova ActivityBlankActivityDefina o nome da Activity Marque a opção Launcher Activity para permitir que a app poderá ser chamada a partir desta Activity Finish 31
  34. 34. Capturando componentesImageView Arraste uma ImageView para a tela 32
  35. 35. Capturando componentesImageView Arraste uma ImageView para a telaDefina a imagem 32
  36. 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. 37. package br.com.especializa.minhaprimeiraapp;import android.app.Activity; Utilize o Overrideimport android.view.View;import android.widget.ImageView; Implement Methodsimport android.widget.TextView; do Eclipse para gerar esse métodopublic 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
  38. 38. Resultado Samsung Galaxy SII LG Optimus One ICS 4.0.3 Froyo 2.2.1 35
  39. 39. O que aprendemos aquiView Arrastar e alinhar componentes para a tela usando o editor gráficoActivity 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
  40. 40. ?Que tal um código bônus? 37
  41. 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. 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 onWindowFocusChangedDisplayMetrics 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. 43. O que aprendemos aquiDisplayMetrics 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. 44. Resultado do código bônus Embora com a mesma densidade, houve uma leve diferença de layoutGalaxy SII Hazr Maxx Optimus One ICS 4.0.3 ICS 4.0.4 Froyo 2.2.1 40
  45. 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. 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. 47. Manipulação de eventos Tente montar uma tela como esta aqui EditText NumberDecimal Button Propriedades. Sempre troque os Ids dos componentes 42
  48. 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. 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. 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
  51. 51. <!-- continuação --> <Button android:id="@+id/btnOk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textAltura" android:layout_below="@+id/editAltura" android:layout_marginTop="20dp" android:text="@string/ok" /> <TextView android:id="@+id/textResultado" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btnOk" android:layout_centerHorizontal="true" android:layout_marginTop="45dp" android:textAppearance="?android:attr/textAppearanceLarge" /></RelativeLayout> 45
  52. 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 oimport android.widget.TextView; setOnClickListener onCreate mesmo define o objeto do tipopublic 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. 53. O que aprendemos aquiComposiçã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. 54. O que aprendemos aquiAPI 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. 55. O que aprendemos aquiRevisã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. 56. O que aprendemos aquiRevisã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. 57. O que aprendemos aquiRevisã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
  58. 58. ?Que tal um código bônus? 51
  59. 59. // Insira este código novo no final do método onClickString 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. 60. O que aprendemos aquiA 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. 61. MasterDetailFlowCrie 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. 62. MasterDetailFlowVamos 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
  63. 63. MasterDetailFlowResultado no tablet e nosmartphone Ainda vamos falar mais sobre Fragments 56
  64. 64. // Altere a classe gerada DummyContentstatic {! // Add 4 sample items.! addItem(new DummyItem("1", "Hamburguer"));! addItem(new DummyItem("2", "Alface"));! addItem(new DummyItem("3", "Queijo"));! addItem(new DummyItem("4", "Molho Especial"));} 57
  65. 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. 66. PreparaçãoAntes de publicar uma app no Google Play, faça odever 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
  67. 67. Exporte a apkPassos: Botão direito sobre o projeto -> Export 60
  68. 68. Exporte a apkPassos: Botão direito sobre o projeto -> Export Export Android Application 60
  69. 69. Exporte a apkPassos: Botão direito sobre o projeto -> Export Export Android Application Nomeie a app 60
  70. 70. Exporte a apkPassos: 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. 71. Exporte a apkPassos: 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. 72. Chave criptográficaDados da chave dentro dokeystore Alias - nome que identifica a chave dentro do keystore Password - senha de acesso à chave Validity - Validade do certificado digital (em anos)Dados organizacionais quesão publicados nocertificado digital 61
  73. 73. Chave criptográfica.apk Defina o local onde será salvo o novo arquivo .apk com o certificadoVamos publicar estearquivo no Google Play 62
  74. 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
  75. 75. Publicando o aplicativo Segue o fluxo 64
  76. 76. Publicando o aplicativo Segue o fluxo 64
  77. 77. Publicando o aplicativo Segue o fluxo 64
  78. 78. Publicando o aplicativo Apk cadastrada mas não publicada ainda 65
  79. 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. 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

×