SlideShare ist ein Scribd-Unternehmen logo
1 von 80
Google
Android




                     Jose Berardo
          Especializa Treinamentos
                                     1
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Execução do projeto

                       Simulação de botões
                      físicos de um aparelho




  Legal?




                                               26
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
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
Execução do projeto



        É só escolher onde
            vai rodar e
             VOILÁ!!!!




                             2h da manhã???
                                  Putz!



                                              29
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
Capturando componentes
Nova Activity




                         31
Capturando componentes
Nova Activity
BlankActivity




                         31
Capturando componentes
Nova Activity
BlankActivity
Defina o nome da Activity
  Marque a opção Launcher
  Activity para permitir que a
  app poderá ser chamada a
  partir desta Activity
  Finish




                                 31
Capturando componentes
ImageView
 Arraste uma ImageView
 para a tela




                         32
Capturando componentes
ImageView
 Arraste uma ImageView
 para a tela

Defina a imagem




                         32
<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
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
Resultado




 Samsung Galaxy SII   LG Optimus One
   ICS 4.0.3           Froyo 2.2.1

                                       35
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
?
Que tal um código
     bônus?



                    37
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
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
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
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
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
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
Manipulação de eventos
                                Tente montar
                              uma tela como esta
                                     aqui




    EditText
 NumberDecimal
                 Button



                             Propriedades.
                          Sempre troque os Ids
                           dos componentes




                                                   42
<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
<!-- 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
<!-- 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
<!-- 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
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
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
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
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
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
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
?
Que tal um código
     bônus?



                    51
// 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
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
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
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
MasterDetailFlow




Resultado no tablet e no
smartphone
  Ainda vamos falar mais sobre Fragments


                                           56
// Altere a classe gerada DummyContent
static {
! // 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
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
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
Exporte a apk
Passos:
  Botão direito sobre o projeto
  -> Export




                                  60
Exporte a apk
Passos:
  Botão direito sobre o projeto
  -> Export

 Export Android Application




                                  60
Exporte a apk
Passos:
  Botão direito sobre o projeto
  -> Export

 Export Android Application

 Nomeie a app




                                  60
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
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
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
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
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
Publicando o aplicativo
 Segue o fluxo




                          64
Publicando o aplicativo
 Segue o fluxo




                          64
Publicando o aplicativo
 Segue o fluxo




                          64
Publicando o aplicativo
                      Apk
                 cadastrada mas
                  não publicada
                      ainda




                                  65
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03
Horacio Diamante Mondlane
 
Programando Android - Aula 2
Programando Android - Aula 2Programando Android - Aula 2
Programando Android - Aula 2
Kalil Maciel
 
Iniciando o Desenvolvimento para o Google Android
Iniciando o Desenvolvimento para o Google AndroidIniciando o Desenvolvimento para o Google Android
Iniciando o Desenvolvimento para o Google Android
Salvador Torres
 

Was ist angesagt? (20)

Android Aula 3
Android Aula 3Android Aula 3
Android Aula 3
 
Android - Conceito e Arquitetura
Android - Conceito e ArquiteturaAndroid - Conceito e Arquitetura
Android - Conceito e Arquitetura
 
Android Aula 4
Android Aula 4Android Aula 4
Android Aula 4
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
 
Android Aula 5
Android Aula 5Android Aula 5
Android Aula 5
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para Android
 
Seminário SD - Ambiente de Desenvolvimento para Android
Seminário SD - Ambiente de Desenvolvimento para AndroidSeminário SD - Ambiente de Desenvolvimento para Android
Seminário SD - Ambiente de Desenvolvimento para Android
 
Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03
 
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhoneEntenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
 
Introdução ao android - siecomp 2015.1
Introdução ao android - siecomp 2015.1Introdução ao android - siecomp 2015.1
Introdução ao android - siecomp 2015.1
 
Como montar o ambiente de desenvolvimento Android
Como montar o ambiente de desenvolvimento AndroidComo montar o ambiente de desenvolvimento Android
Como montar o ambiente de desenvolvimento Android
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
 
PALESTRA :: Desenvolvimento para plataforma Android
PALESTRA :: Desenvolvimento para plataforma Android PALESTRA :: Desenvolvimento para plataforma Android
PALESTRA :: Desenvolvimento para plataforma Android
 
Minicurso de Android
Minicurso de AndroidMinicurso de Android
Minicurso de Android
 
Desenvolvendo para Android
Desenvolvendo para AndroidDesenvolvendo para Android
Desenvolvendo para Android
 
Programando Android - Aula 2
Programando Android - Aula 2Programando Android - Aula 2
Programando Android - Aula 2
 
Iniciando o Desenvolvimento para o Google Android
Iniciando o Desenvolvimento para o Google AndroidIniciando o Desenvolvimento para o Google Android
Iniciando o Desenvolvimento para o Google Android
 
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2
 
Introdução ao android e plataforma android
Introdução ao android e plataforma androidIntrodução ao android e plataforma android
Introdução ao android e plataforma android
 
Plataforma Android
Plataforma AndroidPlataforma Android
Plataforma Android
 

Ähnlich wie Curso de Android - aula 3

Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo Oliveira
Ronildo Oliveira
 
Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4
Erisvaldo Junior
 
3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais
Fabiula Floripa
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma Android
Natanael Fonseca
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livre
elliando dias
 

Ähnlich wie Curso de Android - aula 3 (20)

Programando Android - Aula 3
Programando Android - Aula 3Programando Android - Aula 3
Programando Android - Aula 3
 
Introdução ao android
Introdução ao androidIntrodução ao android
Introdução ao android
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma Android
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo Oliveira
 
Hello World Android
Hello World AndroidHello World Android
Hello World Android
 
Computação Móvel 2012.2 - Android
Computação Móvel 2012.2 - AndroidComputação Móvel 2012.2 - Android
Computação Móvel 2012.2 - Android
 
Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4
 
Treinamento básico de Android
Treinamento básico de AndroidTreinamento básico de Android
Treinamento básico de Android
 
Configurando o ambiente para desenvolvimento Android
Configurando o ambiente para desenvolvimento AndroidConfigurando o ambiente para desenvolvimento Android
Configurando o ambiente para desenvolvimento Android
 
3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais
 
Desenvolvimento android
Desenvolvimento androidDesenvolvimento android
Desenvolvimento android
 
GSOIII - INTRODUÇÃO AO ANDROID
GSOIII - INTRODUÇÃO AO ANDROIDGSOIII - INTRODUÇÃO AO ANDROID
GSOIII - INTRODUÇÃO AO ANDROID
 
O futuro do Android
O futuro do AndroidO futuro do Android
O futuro do Android
 
Aula01 - introdução, Activity
Aula01 - introdução,  ActivityAula01 - introdução,  Activity
Aula01 - introdução, Activity
 
Workshop frontend
Workshop   frontendWorkshop   frontend
Workshop frontend
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma Android
 
Básico de desenvolvimento com Android
Básico de desenvolvimento com AndroidBásico de desenvolvimento com Android
Básico de desenvolvimento com Android
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Framework 7 pdf
Framework 7 pdfFramework 7 pdf
Framework 7 pdf
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livre
 

Mehr von Jose Berardo

Mehr von Jose Berardo (15)

Html5 Aula 6
Html5 Aula 6Html5 Aula 6
Html5 Aula 6
 
Html5 Aula 5
Html5 Aula 5Html5 Aula 5
Html5 Aula 5
 
Html5 Aula 4
Html5 Aula 4Html5 Aula 4
Html5 Aula 4
 
HTML5 Mobile - Aula 3 - Device Orientation
HTML5 Mobile - Aula 3 - Device OrientationHTML5 Mobile - Aula 3 - Device Orientation
HTML5 Mobile - Aula 3 - Device Orientation
 
Oracle Certified Associate - Java Programmer I - aula 2
Oracle Certified Associate - Java Programmer I - aula 2Oracle Certified Associate - Java Programmer I - aula 2
Oracle Certified Associate - Java Programmer I - aula 2
 
HTML5 Mobile Aula 1
HTML5 Mobile Aula 1HTML5 Mobile Aula 1
HTML5 Mobile Aula 1
 
Java Certified Associate Aula 1
Java Certified Associate Aula 1Java Certified Associate Aula 1
Java Certified Associate Aula 1
 
Curso de Java EE 6
Curso de Java EE 6Curso de Java EE 6
Curso de Java EE 6
 
Html5 Aula 3
Html5 Aula 3Html5 Aula 3
Html5 Aula 3
 
Html5 aula 02
Html5 aula 02Html5 aula 02
Html5 aula 02
 
Html5 aula 01
Html5 aula 01Html5 aula 01
Html5 aula 01
 
Html5 - O futuro da Web
Html5 - O futuro da WebHtml5 - O futuro da Web
Html5 - O futuro da Web
 
O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
 
Certificacao Php
Certificacao PhpCertificacao Php
Certificacao Php
 
Certificacoes Desenvolvedores
Certificacoes DesenvolvedoresCertificacoes Desenvolvedores
Certificacoes Desenvolvedores
 

Kürzlich hochgeladen

Kürzlich hochgeladen (9)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Curso de Android - aula 3

  • 1. Google Android Jose Berardo Especializa Treinamentos 1
  • 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
  • 26. Execução do projeto Simulação de botões físicos de um aparelho Legal? 26
  • 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
  • 33. Capturando componentes Nova Activity BlankActivity Defina 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. Capturando componentes ImageView Arraste uma ImageView para a tela 32
  • 35. Capturando componentes ImageView Arraste uma ImageView para a tela Defina a imagem 32
  • 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
  • 38. Resultado Samsung Galaxy SII LG Optimus One ICS 4.0.3 Froyo 2.2.1 35
  • 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
  • 40. ? Que tal um código bônus? 37
  • 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
  • 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. 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
  • 58. ? Que tal um código bônus? 51
  • 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
  • 63. MasterDetailFlow Resultado no tablet e no smartphone Ainda vamos falar mais sobre Fragments 56
  • 64. // Altere a classe gerada DummyContent static { ! // 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. 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
  • 67. Exporte a apk Passos: Botão direito sobre o projeto -> Export 60
  • 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
  • 75. Publicando o aplicativo Segue o fluxo 64
  • 76. Publicando o aplicativo Segue o fluxo 64
  • 77. Publicando o aplicativo Segue o fluxo 64
  • 78. Publicando o aplicativo Apk cadastrada mas não publicada ainda 65
  • 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