Android_pg_01_51.pdf

25
Novatec Nelson Glauber de Vasconcelos Leal

Transcript of Android_pg_01_51.pdf

  • Novatec

    Nelson Glauber de Vasconcelos Leal

  • Copyright 2015 da Novatec Editora Ltda.

    Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. proibida a reproduo desta obra, mesmo parcial, por qualquer processo, sem prvia autorizao, por escrito, do autor e da Editora.

    Editor: Rubens PratesReviso gramatical: Marta Almeida de SEditorao eletrnica: Carolina KuwabataAssistente editorial: Priscila A. YoshimatsuCapa: Leo Macedo

    ISBN: 978-85-7522-412-0

    Histrico de impresses:

    Janeiro/2015 Primeira edio

    Novatec Editora Ltda.Rua Lus Antnio dos Santos 11002460-000 So Paulo, SP BrasilTel.: +55 11 2959-6529E-mail: [email protected]: novatec.com.brTwitter: twitter.com/novateceditoraFacebook: facebook.com/novatecLinkedIn: linkedin.com/in/novatec

  • 29

    captulo 1Conceitos bsicos

    Neste captulo criaremos nosso primeiro projeto Android e conheceremos sua estrutura. Em seguida, falaremos do processo de compilao e execuo de um aplicativo, das ferramentas de depurao existentes e do tratamento de eventos de clique. Veremos tambm como funciona a alocao de recursos de uma aplicao e como iniciar aplicativos nativos do aparelho.

    Iniciando um novo projeto com Android StudioVamos criar o nosso primeiro projeto Android. Abra o Android Studio, e ser exibida a tela de boas-vindas1 apresentada na figura 1.1. Nela, podemos optar respectivamente por:

    criarumnovoprojeto;

    abrirumprojetoexistente;

    fazercheckoutapartirdeumsistemadecontroledeverso(comoGitouSubversion);

    importarumprojetoexistente;

    alterarconfiguraesnoAndroidStudio;

    ouacessaradocumentao.

    Selecione a opo Start a new Android Studio project e ser exibida a primeira tela do as-sistente, similar mostrada na figura 1.2.

    1 Na parte inferior dessa tela existe a opo Check for updates. Clique nessa opo para atualizar o Android Studio para a verso mais atual.

  • Dominando o Android30

    Figura 1.1 Tela de boas-vindas do Android Studio.

    Figura 1.2 Tela do assistente de criao de um novo projeto.

    O campo Application Name o nome do seu aplicativo que aparecer no aparelho. Em Company Domain, devemos informar o domnio da sua empresa, e ao preench-lo ser gerado o Package Name, que representa o pacote Java onde ficaro as classes do projeto. Esse campo muito importante porque ele serve de identificador nico do seu aplicativo, ou seja, no pode haver dois aplicativos com o mesmo nome de pacote instalados no aparelho. essencial escolher um bom nome, pois no possvelpublicarumaaplicaonoGooglePlaycomdoisnomesdepacoteiguais.

    Por fim, em Project Location podemos selecionar onde ser salvo o projeto. Por padro, os projetos ficaro armazenados no subdiretrio AndroidStudioProjects dentro diretrio do usurio no sistema operacional. Clique em Next para irmos para a prxima etapa do assistente exibida na figura 1.3.

  • 31Captulo 1 Conceitos bsicos

    Figura 1.3 Selecionando o tipo do dispositivo do projeto.

    Nessa tela podemos optar por criar os mdulos da nossa aplicao para smartphoneetablet,TV,Wear(relgios)eGlass(culos).Emtodososcasos,devemos preencher o campo Minimum required SDK, que a verso mnima do Android que o aparelho deve possuir para executar nossa aplicao. Quanto menor a verso, mais dispositivos poderemos suportar, porm teremos menos APIs dis-ponveis. Boa parte do que utilizaremos neste livro ser suportada pela verso 2.3 doAndroidouposterior(oquecontemplaaquasetotalidadedosaparelhosdomercado), mas deixaremos explcito quando usarmos alguma API que necessite de uma verso especfica. Por ora, selecione apenas Phone and Tablet e clique em Next para irmos prxima tela do assistente exibida na figura 1.4.

    Nessa tela do assistente, podemos adicionar uma Activity ao nosso projeto. Falaremos sobre Activities no prximo captulo, mas por ora saiba que toda tela de uma aplicao uma Activity. Selecione Blank Activity e clique em Next para exibir a tela da figura 1.5.

    Nessa tela, podemos informar o nome da Activity principal da aplicao no cam-po Activity Name. Por conveno, sempre colocamos Activity no final do nome da classe. Por padro, o assistente nomeia a classe como MainActivity. Cada activity tem o seu aspecto visual especificado em arquivos XML que chamaremos daqui em diante simplesmente de arquivos de layout. O nome desse arquivo definido no campo Layout Name. Por fim, no campo Title, especificamos o nome da aplicao

  • Dominando o Android32

    que aparecer para o usurio no aparelho. Clique em Finish para concluir o assis-tente e criar o projeto2.

    Figura 1.4 Selecionando uma Activity inicial para o projeto.

    Figura 1.5 Informando o nome da Activity principal da aplicao.2 importantequevoctenhaconexocomainternetnessemomento(principalmenteaprimeira

    vez), pois o Android Studio far o download de algumas dependncias do projeto.

  • 33Captulo 1 Conceitos bsicos

    Nos prximos projetos que criaremos no decorrer do livro, informaremos apenas o nome do projeto, do pacote e da activity principal da aplicao. Se formos defi-nir algo diferente do que vimos aqui, deixaremos isso explcito. Fique vontade para escolher o que preferir, e tambm fique atento para usar o nome de pacote que voc escolheu quando for necessrio. Para esse exemplo, daramos apenas as informaes mostradas a seguir.

    Application Name Ex01_Hello

    Package Name dominando.android.ex01_hello

    Activity Name MainActivity

    Depois que o projeto for criado, teremos uma estrutura igual da figura 1.6.

    Figura 1.6 Estrutura de um projeto no Android Studio.

    Na parte superior, selecione a opo Project que nos proporcionar outra visuali-zao do nosso projeto. Utilizaremos essa visualizao no decorrer do livro.

    Vamos detalhar alguns arquivos dessa estrutura agora e discutiremos outros no decorrer do livro. Focaremos inicialmente no arquivo AndroidManifest.xml e nas pastas app/src/main/java e app/src/main/res. Comeando pelo AndroidManifest.xml listado a seguir.

  • Dominando o Android34

    Boa parte da informao contida nesse arquivo foi criada com as informaes que preenchemos no assistente de criao do projeto. Na tag , temos o pacote da aplicao definido na propriedade package. Em seguida, na tag , adicionamos algumas configuraes ao nosso aplicativo. A proprie-dade android:allowBackup informa que o Android poder fazer backup dos dados da aplicao. Em seguida, a propriedade android:icon define o cone da aplicao apontando para @drawable/ic_launcher. Mas o que isso significa?

    Cadarecursodaaplicao(imagem,texto,layout,sometc.)mapeadoemumidentificador3 na classe R, que gerada automaticamente, e esses recursos fi-cam localizados na pasta app/src/main/res. Por exemplo, se observarmos a pasta res/drawable-mdpi, notaremos que haver um arquivo chamado ic_launcher.png, que estar representado na classe R pelo identificador R.drawable.ic_launcher, que poderemos usar no nosso cdigo Java. Para usar essa mesma imagem em arquivos XML como o AndroidManifest.xml , usamos @drawable/ic_launcher. Mas por que temos quatro pastas drawable? As quatro pastas armazenam a mesma imagem paratelascomqualidadesdiferentes(DPI Dots Per Inch), que explicaremos mais adiante ainda neste captulo.

    3 Esseidentificadoruminteirode32bitsdoJava(int).

  • 35Captulo 1 Conceitos bsicos

    Voltando ao AndroidManifest.xml, na propriedade android:label, estamos apontando para @string/app_name. Seguindo a lgica do cone da aplicao, deveramos ter uma pasta chamada string, certo? Quase! No caso dos textos da aplicao, eles esto localizados no arquivo res/values/strings.xml.

    Ex01_Hello

    Hello world!

    Settings

    Assim, para acessar o texto Ex01_Hello em nosso cdigo Java, usaramos o mtodo getString(int) passando o identificador R.string.app_name como parmetro, enquanto em arquivos XML usamos @string/app_name. O resumo de alguns recursos e seu mapeamento na classe R e a forma de acess-los em arquivos XML esto descritos na tabela 1.1.

    Tabela 1.1 Mapeamento dos recursos na classe R e no XML

    Recurso ID da classe R Em arquivos XML

    res/drawable/ic_launcher.png R.drawable.ic_launcher @drawable/ic_launcher

    res/layout/activity_main.xml R.layout.activity_main @layout/activity_main

    res/menu/menu_main.xml R.menu.menu_main @menu/menu_main

    res/values/strings.xml R.string.ola @string/ola

    res/values/dimens.xml R.dimen.margem @dimen/margem

    Mais uma vez voltando ao AndroidManifest.xml, todas as activities da aplicao devem estar declaradas nesse arquivo com a tag , e na propriedade android:name informamos o nome da classe. J em android:label, informamos o textoqueaparecernottulodatela(maisumavezusandootextodeclaradonores/values/strings.xml).

    Tambm explicaremos as tags , e mais adiante, mas, por enquanto, devemos apenas saber que a ao android.intent.action.MAIN indica que essa activity um ponto de entrada da aplicao, ou seja, por onde o usurio pode acess-la, e a categoria android.intent.category.LAUNCHER indica que a Activity aparecer na lista de aplicaes do aparelho.

  • Dominando o Android36

    Vamos analisar agora o cdigo da classe MainActivity listado a seguir.

    package dominando.android.ex01_hello;

    import android.support.v7.app.ActionBarActivity;

    import android.os.Bundle;

    import android.view.Menu;

    import android.view.MenuItem;

    public class MainActivity extends ActionBarActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true;

    }

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

    // Handle action bar item clicks here. The action bar will

    // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml.

    int id = item.getItemId();

    if (id == R.id.action_settings) {

    return true;

    }

    return super.onOptionsItemSelected(item);

    }

    }

    Ela est definida no pacote que indicamos no assistente de criao do projeto e herda da classe ActionBarActivity. Essa uma subclasse de Activity que permite que a nossa aplicao use a action bar, que a barra localizada na parte superior da tela, onde ficam o ttulo e as opes de menu. Fazendo uma analogia com aplicaes desktop, ela seria uma mistura de barra de ttulo, menu de opes e barra de ferramentas. Exploraremos a ActionBar no captulo 6.

  • 37Captulo 1 Conceitos bsicos

    O mtodo onCreate(Bundle) chamado quando a Activity criada4, e nele chamamos o mtodo setContentView(int) para informar qual o arquivo de layout dessa tela. O arquivo de layout um XML com a descrio dos componentes que devem ser exibidos na tela e est localizado em res/layout/activity_main.xml. Notem que tambm estamos usando a classe R para nos referenciar a ele, usando R.layout.activity_main. Ao dar um Ctrl+Clique(ouCommand+Clique no Mac), ser exibido o editor visual de layouts, similar ao da figura 1.7.

    Figura 1.7 Editor visual de layouts.

    A paleta com os componentes que podemos adicionar ao nosso arquivo de layout est localizada no lado esquerdo. No canto superior direito, temos o Component Tree, que nos permite visualizar a estrutura do arquivo de layout, ou seja, como os componentes esto organizados hierarquicamente. J na parte inferior direita, temos a lista de propriedades do componente, as quais podemos editar.

    Na parte central, alm da pr-visualizao do layout, temos na rea superior algu-mas opes interessantes para simularmos variaes em nosso layout, como v-lo em landscape(nahorizontal),emumidiomadiferenteouemoutrosaparelhos.

    Na parte inferior possvel notar duas abas: Design e Text. A segunda exibe o XML do arquivo de layout, que deve estar como este:

    4 No devemos usar o construtor de uma subclasse de Activity para fazer inicializaes.

  • Dominando o Android38

    Falaremos em layouts e componentes detalhadamente nos captulos 2 e 3. Entretanto vamos fazer algumas observaes aqui para voc ter uma ideia do que est acontecendo. O RelativeLayout um gerenciador de layout que posi-ciona cada componente em relao aos demais ou s bordas. Nesse exemplo, definimos a propriedade android:padding (que umespaamentodadoentre aborda do componente e o seu contedo) usando @dimen/activity_horizontal_margin e @dimen/activity_vertical_margin. Mas voc deve estar vendo o valor 16dp, certo? Porm, se voc pausar o cursor sobre o valor, ver que estamos apontando para o @dimen. V at o diretrio res/values/dimens.xml e ver a declarao desses valores. Esse valor uma recomendao do Android para margens, e usar o arquivo dimens.xml nos permite colocar esse tipo de informao em um nico local.

    16dp

    16dp

    Outro detalhe que queremos destacar no arquivo de layout a tag que representa um texto esttico na tela e que tem sua propriedade android:text apon-tando para mais um texto definido res/values/strings.xml.

    Discutiremos os mtodos onCreateOptionsMenu(Menu) e onOptionsItemSelected(MenuItem) quando formos falar da ActionBar.

  • 39Captulo 1 Conceitos bsicos

    Executando a aplicaoPara executar a aplicao, conecte seu aparelho ao computador ou inicie o emu-lador. Em seguida, clique no boto Run app(botoverdeemformadeplay) e ser exibidaateladafigura1.8,ondepodemosselecionarodispositivo(sehouvermaisde um) no qual desejamos executar a aplicao. Clique em OK e o aplicativo ser exibido no dispositivo selecionado conforme a figura 1.9.

    Figura 1.8 Seleo do aparelho para executar a aplicao.

    Figura 1.9 Aplicao Hello World rodando no emulador.

    Pronto! Nossa primeira aplicao est em execuo e na prxima seo veremos as etapas que ocorreram para que isso acontecesse.

  • Dominando o Android40

    Processo de compilaoAps observarmos a aplicao executando, importante entender o que aconteceu durante esse processo. O processo de build(ouconstruo)envolveacompilao,a assinatura, o empacotamento e a execuo do aplicativo. No Android isso fei-todeumaformaumpoucodiferentedeumaaplicaoJavaconvencional(paradesktop ou web).

    Figura 1.10 Processo de build de uma aplicao Android.

    Conforme podemos ver na figura 1.10, temos as seguintes etapas:

    OAndroid Asset Packaging Tool(aapt)obtmosrecursosdaaplicaoeoscompila, gerando a classe R.javaeosrecursoscompilados(resources.arsc). O aapt tambm gera o AndroidManifest.xml encriptado.

    TodooseucdigoJava,incluindoaclasseR.java, ser compilado em arquivos .class usando o compilador javac.

    Aferramentadexconverteessesarquivos.class em bytecodes da mquina virtual do Android. At o KitKat, a mquina virtual era a Dalvik, mas a partir doLollipop(5.0)amquinavirtualpassouaseroART(Android Runtime).

    Oapkbuilderempacotaoresources.arsc, o classes.dex e o AndroidManifest.xml (encriptado)emumarquivo.apk(Android Package), que o arquivo usado para instalao da aplicao. Entranto esse arquivo deve ser assinado pelo jarsigner para poder ser instalado no aparelho. Por padro, eles so assinados com uma chave de debug.5

    5 Toda aplicao Android assinada com o arquivo debug.keystore, que encontra-se no subdiretrio .androidnapastadousurio.ParapublicarnoGooglePlay,usa-seumaoutrachavegeradapeloprprio desenvolvedor. Veremos esse processo no captulo 26.

  • 41Captulo 1 Conceitos bsicos

    Uma vez que o .apk gerado, ele salvo em seu_projeto/app/build/outputs/apk/app-debug.apk eaIDEutilizaaferramentaadb(Android Debug Bridge) para instalar a aplicao no dispositivo. Essa ferramenta encontra-se no subdiretrio platform-tools dentro da pasta do SDK.

    O adb tem alguns comandos interessantes6 que voc pode utilizar por meio da linha de comando:

    adb devices

    adb kill-server

    adb start-server

    adb install -r SuaApp.apk

    adb shell pm uninstall k pacote.da.app

    adb push arquivo.jpg /mnt/sdcard

    adb pull /mnt/sdcard/arquivo.jpg /Users/nglauber/Desktop

    O comando devices listar os dispositivos conectados ao seu computador. O kill-server encerrar a execuo do adb, enquanto o start-server iniciar o servio. Para instalar um APK no aparelho, podemos usar o comando install, onde o pa-rmetro -r indica que a aplicao deve ser reinstalada caso j exista. O uninstall ir desinstalar o aplicativo de acordo com o pacote passado como parmetro. J os comandos push e pull servem para copiar arquivos para o aparelho e do aparelho respectivamente, passando o local de origem e de destino. Consulte a documen-tao para conhecer outros comandos do adb.

    Na prxima seo estudaremos um recurso bastante poderoso: a alocao din-mica de recursos.

    Alocao dinmica de recursosTodososrecursosqueusamosnanossaaplicao(strings,imagens,estilos,layoutsetc.) ficam dentro da pasta res(abreviaoderesources), mas cada subdiretrio tem um objetivo especfico, os principais so:

    anim e animator arquivos XML de animaes quadro-a-quadro ou de efeito.

    drawable arquivos de imagens da aplicao.

    menu arquivos XML com as opes de menu.

    layout arquivos XML com os layouts de telas.

    6 Se estiver usando Mac OS X ou Linux, adicione o ./

  • Dominando o Android42

    values arquivosXMLquecontmvalorestaiscomostrings(textosimples),stringarrays(listadevalores),dimenses(definiodetamanhos),color(definiodecores),style(estilos)etc.

    xml essa pasta normalmente armazena arquivos XML de metadados da aplicao.

    raw outros tipos de arquivos que podem ser usados no projeto.

    Todos os arquivos armazenados nessas pastas devem obrigatoriamente ser no-meados com todas as letras minsculas, mas podem conter underline _ ou nmeros a partir do segundo caractere.

    O Android tem um conceito de alocao dinmica de recursos, em que o sistema operacional seleciona o recurso mais apropriado de acordo com a configurao do aparelho. Para isso, ns precisamos apenas criar variaes dos diretrios, adicionando sufixos a eles, e o Android se encarregar de obter o recurso mais adequado. A tabela 1.2 lista os principais sufixos com alguns exemplos.

    Tabela 1.2 Sufixos para alocao de recursos

    Configurao Exemplo do sufixo Recurso para

    Operadoramcc724-mnc05

    mcc724-mnc31OperadoradoBrasil(mcc-724)ecdigo05(Claro)e31(Oi)

    Idioma

    en

    en-rUS

    pt

    pt-rBR

    Ingls(qualquerpas) Ingls dos Estados Unidos Portugus(qualquerpas) Portugus do Brasil

    Tamanho de tela (vertabela1.5)

    small

    normal

    large

    xlarge

    Telas pequenas Telas normais Telas grandes Telas extragrandes

    Orientao de telaport

    landPortrait(vertical) Landscape(horizontal)

    Densidade da tela (vertabela1.3)

    ldpi

    mdpi

    tvdpi

    hdpi

    xhdpi

    xxhdpi

    xxxhdpi

    Baixadensidade(120dpi) Mdiadensidade(160dpi) DensidadedeTV(213dpi) Altadensidade(240dpi) Densidadeextra-alta(320dpi) Densidadeextra-alta(480dpi) Densidadeextra-alta(640dpi)

    API Level (vertabela0.1)

    v10

    v11

    v14

    Aparelhos com Android 2.3 ou superior Aparelhos com Android 3.0 ou superior Aparelhos com Android 4.0 ou superior

  • 43Captulo 1 Conceitos bsicos

    importante ressaltar que podemos combinar os sufixos descritos anteriomente, como por exemplo layout-pt-rBR-large;values-v11-mcc724-mnc31 ou drawable-land-hdpi. Outro detalhe que o Android buscar o recurso mais prximo, e caso no exista ele procurar algo mais genrico.

    Para fixar os conceitos apresentados, vamos internacionalizar nosso aplicativo criando o diretrio res/values-pt e colocar os textos em portugus no arquivo strings.xml. Assim, quando o aparelho estiver com o idioma configurado para portugus, os textos da aplicao mudaro automaticamente. Clique sobre a pasta app/src/main/res e escolha a opo New > Android Resource Directory, e ser exibida a tela da figura 1.11. Selecione a opo values no campo Resource type, em seguida selecione Language na listagem da esquerda e clique no boto >>. Na tela da figura 1.12, sele-cione o idioma portugus e clique em OK.

    Figura 1.11 Criando um novo diretrio de recursos.

    Figura 1.12 Selecionando o idioma da pasta values.

  • Dominando o Android44

    Agora copie o arquivo strings.xml da pasta res/values para a pasta res/values-pt. E modifique-o para ficar como a seguir.

    Ex01_Ol

    Ol mundo!

    Configuraes

    Por padro, o idioma do emulador o ingls, ento, se executarmos a aplicao, o texto Hello world ainda ser exibido. Agora modifique o idioma do aparelho7 para portugus, indo nas configuraes do aparelho e selecionando a opo Language & input, e por fim o idioma portugus no campo Language. Execute a aplicao e agora o texto Ol mundo! dever ser exibido.

    Voltando para nossa discusso sobre alocao de recursos, podemos notar que, quando o projeto foi criado, o prprio Android Studio adicionou quatro variaes da pasta drawable para ns:

    res/drawable-hdpi

    res/drawable-mdpi

    res/drawable-xhdpi

    res/drawable-xxhdpi

    Isso far com que o sistema operacional selecione a imagem de acordo com a qualidadedatela,quemedidaemDPIs(Dots Per Inch Pontos por polegadas). Atualmente temos dispositivos Android de diversos tamanhos e com qualidade de tela diferentes. importante conhecermos a tabela 1.3 para definirmos imagens adequadamente para cada uma delas.

    O que essa tabela nos diz? Que imagens para aparelhos xxhdpi devem ter o dobro dotamanho(larguraealtura)deimagensparaaparelhoshdpi, por exemplo. En-to importante que tenhamos imagens para cada densidade de tela que iremos trabalhar, pois, caso contrrio, elas podem aparecer distorcidas.

    Seguindo o mesmo princpio, possvel criar arquivos de layout para quando o aparelhoestiveremlandscapeoupararesoluesdeteladiferentes(oucombi-nando ambas). A tabela 1.4 exibe alguns exemplos comuns de pastas de layout.

    7 A forma de mudar o idioma do aparelho pode variar um pouco de acordo com o modelo do aparelho e/ou verso do Android. Tente achar a opo correspondente no seu aparelho.

  • 45Captulo 1 Conceitos bsicos

    Tabela 1.3 Densidades de tela

    Densidade Dots per inch Proporo

    ldpi 120dpi 0.75

    mdpi 160dpi 1.00

    tvdpi 213dpi 1.33

    hdpi 240dpi 1.50

    xhdpi 320dpi 2.00

    xxhdpi 480dpi 3.00

    xxxhdpi 640dpi 4.00

    Tabela 1.4 Exemplo de pastas de Layout

    Pasta Propsito

    res/layoutLayout em portrait ou landscape, independente do tamanho da tela

    res/layout-port Layout em portrait independente do tamanho da tela

    res/layout-large Layout em portrait ou landscape, para telas grandes

    res/layout-land-xlarge Layout em landscape para telas extra grandes

    Mas o que determina se uma tela pequena, normal, grande ou extragrande? O Android estipula alguns intervalos para classific-las que esto listados na tabela 1.5.

    Tabela 1.5 Classificao de telas

    Classificao Tamanho mnimo

    small 426 dp x 320 dp

    normal 470 dp x 320 dp

    large 640 dp x 480 dp

    xlarge 960 dp x 720 dp

    Sevocobservar,amedidadateladefinidaemDP(ouDIPDensity Independent Pixels), que uma unidade de medida que leva em considerao a quantidade de pixels na tela em sua rea fsica. Sendo assim, quanto mais pixels tivermos por rea, melhor ser a qualidade da tela. Ento como saber qual o tamanho da tela em dp? Basta usar a seguinte frmula:

    dp = pixels / (dpi / 160)

  • Dominando o Android46

    Por exemplo, qual o tamanho da tela em dp de um aparelho com resoluo de 1.024por768pixelscomdensidadeHDPI(240dpi)?

    dp = 1024 / (240 / 160)dp = 1024 / 1,5dp = 680

    dp = 768 / (240 / 160)dp = 768 / 1,5dp = 512

    Com base na tabela 1.5 podemos constatar que uma tela de 680 dp x 512 dp consideradagrande(large).

    possvel descobrir todas as configuraes de recursos que podem variar de acordo com o aparelho por meio da classe android.content.res.Configuration. Adicione o cdigo a seguir no mtodo onCreate(Bundle) da sua Activity.

    Configuration configuration = getResources().getConfiguration();int density = configuration.densityDpi;int orientation = configuration.orientation;int height = configuration.screenHeightDp;int width = configuration.screenWidthDp;int mcc = configuration.mcc;int mnc = configuration.mnc;

    Locale locale = configuration.locale;Log.d("NGVL", "density: "+ density);Log.d("NGVL", "orientation: "+ orientation);Log.d("NGVL", "height: "+ height);Log.d("NGVL", "width: "+ width);Log.d("NGVL", "language: "+ locale.getLanguage() + "-" + locale.getCountry());Log.d("NGVL", "mcc: "+ mcc);Log.d("NGVL", "mnc: "+ mnc);

    Se o cdigo apresentar erro, porque falta importar essas classes. Posicione o cursor em cima do nome da classe e selecione o menu Code > Optimize imports....

    Com as informaes obtidas no cdigo anterior voc pode criar os recursos mais apropriados para o seu aparelho. Mas o que faz o Log.d(String, String)?

    Android Debug Monitor e LogcatO Android SDK vem com uma poderosa ferramenta para anlise e depurao de aplicaes. O Debug Monitor mostrado na figura 1.13 nos permite visualizar os processos que esto sendo executados no aparelho, o sistema de arquivos, o

  • 47Captulo 1 Conceitos bsicos

    consumo de memria, threads, logs da aplicao etc. Ele pode ser acessado no menu Tools > Android > Android Device Monitor.

    Na janela Devices temos a lista dos dispositivos conectados ao computador, e uma funo muito til nessa janela a opo de tirar um screenshot da tela do aparelho, bastando para isso selecionar o aparelho e clicar no boto com o cone de uma cmera.

    O Debug Monitor tambm nos permite visualizar o sistema de arquivos do aparelho por meio da janela File Explorer, onde podemos enviar ou obter arquivos do aparelho.

    Mas, sem dvida, a janela mais importante dessa ferramenta a Logcat, pois com ela podemos visualizar todos os logs gerados pelas aplicaes.

    Figura 1.13 Android Debug Monitor.

    No Logcat podemos filtrar os logs por aplicao, por textos especficos, por n-mero de processo e por nvel, que pode ser: verbose, debug, info, warning e error. Para criar um filtro, basta clicar no boto + e preencher as informaes do filtro.

    O LogCat e a janela Devices esto disponveis tambm dentro do Android Studio, conforme podemos ver na figura 1.14.

    Figura 1.14 Logcat dentro do Android Studio.

  • Dominando o Android48

    Para entender melhor o log, vejamos o que exibido: na primeira coluna temos ahoradolog;depoisonmerodoprocessoseguidodoiddathread(separadopor-);logoaps,temosonomedopacotedaaplicao;otipodolog(Ddedebug)eatagseparadospor/;eporltimoamensagemdolog.

    findViewById e evento de cliqueAgora vamos adicionar alguma interao nossa aplicao. Veremos como obter a referncia de um componente declarado em um arquivo de layout e como tratar o evento de clique em botes. Crie um novo projeto com os dados a seguir.

    Application Name Ex02_Activity

    Package Name dominando.android.ex02_activity

    Activity Name MainActivity

    Abra o arquivo res/layout/activity_main.xml, remova o TextView que contm o Hello World e em seguida adicione um Plain Text arrastando-o da seo Text Fields da paleta de componentes. Abaixo dele, adicione um Button que encontra-se na seo Widgets. Agora abra o XML para fazermos alguns ajustes conforme a seguir.

  • 49Captulo 1 Conceitos bsicos

    android:id="@+id/button" android:layout_below="@+id/editText" android:layout_alignParentLeft="true"/>

    O resultado deve ficar igual ao da figura 1.15.

    Figura 1.15 Arquivo de layout do segundo projeto.

    Nos prximos exemplos, para montar os arquivos de layout, aconselho adicionar os componentes por meio da paleta de componentes e ajustar as propriedades manualmente no XML. Utilize a combinao de tecla Ctrl+Espao para facilitar a procura pela propriedade desejada e evitar erros de digitao.

    Note que na propriedade android:text usamos a @string/btn_toast, ento adicione essa string no res/values/strings.xml.

    ...

    Exibir toast

    Um ponto importante que queremos ressaltar aqui a propriedade android:id, na qual atribumos o identificador do componente. Os valores @+id/editText e @+id/button indicam que esses ids sero criados na classe R, assim teremos R.id.editText e R.id.button respectivamente.

  • Dominando o Android50

    A propriedade android:layout_alignParentStart indica que o EditText ficar no topo superior esquerdo do seu pai, ou seja, do prprio RelativeLayout. Para indicar que o Button ficar abaixo do EditText, definimos a propriedade android:layout_below passando o id. Por fim, a propriedade android:layout_alignParentLeft indica que o componente ficar alinhado esquerda do RelativeLayout. Agora deixe o cdigo da Activity conforme a seguir8:

    import android.os.Bundle;

    import android.support.v7.app.ActionBarActivity;

    import android.view.View;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.Toast;

    public class MainActivity extends ActionBarActivity

    implements View.OnClickListener {

    EditText edtTexto;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    edtTexto = (EditText) findViewById(R.id.editText);

    Button button = (Button) findViewById(R.id.button); button.setOnClickListener(this);

    }

    @Override

    public void onClick(View view) {

    String texto = edtTexto.getText().toString();

    Toast.makeText(this, texto, Toast.LENGTH_SHORT).show(); }

    }

    No mtodo onCreate(Bundle) obtemos a referncia do EditText por meio do findViewBydId(int) passando o id do componente que definimos no arquivo de layout e fazemos o mesmo com o boto. Para tratar o evento do clique do boto, devemos chamar o mtodo setOnClickListener(View.OnClickListener) passando um objeto que implemente a interface View.OnClickListener, que no nosso caso a prpria Activity. Dessa forma, quando clicarmos no boto, o mtodo onClick(View) ser chamado.

    8 Perceba que omitimos o nome do pacote no cdigo-fonte. Faremos isso no decorrer do livro, mas voc deve adicion-lo no seu cdigo-fonte.

  • 51Captulo 1 Conceitos bsicos

    Nele, obtemos o texto contido no EditText e depois criamos um Toast com o mtodo makeText(Context, String, int). Um Toast uma mensagem que aparece durante um tempo e depois desaparece automaticamente. A durao pode ser LENGTH_SHORT e LENGTH_LONG, em que com a primeira a mensagem fica cerca de 2 segundos e com a segunda, 3,5 segundos. Execute a aplicao, digite algum texto e pressione o boto. A mensagem ser exibida centralizada na parte inferior da tela.

    Uma pergunta que voc pode estar se fazendo : se eu tiver mais de um boto, como eu vou saber qual deles foi clicado?. Se voc observar, o mtodo onClick(View) recebe um objeto View9 como parmetro, que indica o componente que disparou o evento. Assim, se tivssemos mais de um boto, poderamos descobrir qual componente disparou o evento baseado no seu id.

    @Override

    public void onClick(View view) {

    switch (view.getId()) {

    case R.id.button:

    String texto = edtTexto.getText().toString();

    Toast.makeText(this, texto, Toast.LENGTH_SHORT).show(); break;

    case R.id.outroBotao:

    // Tratar o outro boto aqui

    break;

    }

    }

    Agora que j fizemos a primeira interao da nossa aplicao, veremos como criar e exibir novas telas, bem como passar parmetros para elas.

    9 No Android, todos os componentes visuais herdam direta ou indiretamente da classe android.view.View.