Você está na página 1de 25

Nelson Glauber de Vasconcelos Leal

Novatec

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 Prates
Reviso gramatical: Marta Almeida de S
Editorao eletrnica: Carolina Kuwabata
Assistente editorial: Priscila A. Yoshimatsu
Capa: Leo Macedo
ISBN: 978-85-7522-412-0
Histrico de impresses:
Janeiro/2015

Primeira edio

Novatec Editora Ltda.


Rua Lus Antnio dos Santos 110
02460-000 So Paulo, SP Brasil
Tel.: +55 11 2959-6529
E-mail: novatec@novatec.com.br
Site: novatec.com.br
Twitter: twitter.com/novateceditora
Facebook: facebook.com/novatec
LinkedIn: linkedin.com/in/novatec

captulo 1

Conceitos 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 Studio


Vamos 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:
criar um novo projeto;
abrir um projeto existente;
fazer checkout a partir de um sistema de controle de verso (como Git ou
Subversion);
importar um projeto existente;
alterar configuraes no Android Studio;
ou acessar a documentao.
Selecione a opo Start a new Android Studio project e ser exibida a primeira tela do assistente, 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.

29

30

Dominando o Android

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
possvel publicar uma aplicao no Google Play com dois nomes de pacote iguais.
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.

Captulo 1 Conceitos bsicos

31

Figura 1.3 Selecionando o tipo do dispositivo do projeto.

Nessa tela podemos optar por criar os mdulos da nossa aplicao para
smartphone e tablet, TV, Wear (relgios) e Glass (culos). Em todos os casos,
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 disponveis. Boa parte do que utilizaremos neste livro ser suportada pela verso 2.3
do Android ou posterior (o que contempla a quase totalidade dos aparelhos do
mercado), 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 campo 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

32

Dominando o Android

que aparecer para o usurio no aparelho. Clique em Finish para concluir o assistente 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 importante que voc tenha conexo com a internet nesse momento (principalmente a primeira
vez), pois o Android Studio far o download de algumas dependncias do projeto.

Captulo 1 Conceitos bsicos

33

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 definir 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 visualizao 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.

34

Dominando o Android
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dominando.android.ex01_hello" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Boa parte da informao contida nesse arquivo foi criada com as informaes
que preenchemos no assistente de criao do projeto. Na tag <manifest>, temos
o pacote da aplicao definido na propriedade package. Em seguida, na tag
<application>, adicionamos algumas configuraes ao nosso aplicativo. A propriedade 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?
Cada recurso da aplicao (imagem, texto, layout, som etc.) mapeado em um
identificador3 na classe R, que gerada automaticamente, e esses recursos ficam 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
para telas com qualidades diferentes (DPI Dots Per Inch), que explicaremos mais
adiante ainda neste captulo.
3 Esse identificador um inteiro de 32 bits do Java (int).

Captulo 1 Conceitos bsicos

35

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.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Ex01_Hello</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
</resources>

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 <string name="ola"> R.string.ola

@string/ola

res/values/dimens.xml <dimen name="margem"> 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 <activity>, e na propriedade
android:name informamos o nome da classe. J em android:label, informamos o
texto que aparecer no ttulo da tela (mais uma vez usando o texto declarado no
res/values/strings.xml).
Tambm explicaremos as tags <intent-filter>, <action> e <category> 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.

36

Dominando o Android

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


package dominando.android.ex01_hello;
import
import
import
import

android.support.v7.app.ActionBarActivity;
android.os.Bundle;
android.view.Menu;
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.

Captulo 1 Conceitos bsicos

37

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 (ou Command+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 algumas opes interessantes para simularmos variaes em nosso layout, como v-lo
em landscape (na horizontal), em um idioma diferente ou em outros aparelhos.
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.

38

Dominando o Android
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

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 posiciona cada componente em relao aos demais ou s bordas. Nesse exemplo,
definimos a propriedade android:padding (que um espaamento dado entre a
borda 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.
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>

Outro detalhe que queremos destacar no arquivo de layout a tag <TextView> que
representa um texto esttico na tela e que tem sua propriedade android:text apontando para mais um texto definido res/values/strings.xml.
Discutiremos os mtodos onCreateOptionsMenu(Menu) e onOptionsItemSelected(MenuItem)
quando formos falar da ActionBar.

Captulo 1 Conceitos bsicos

39

Executando a aplicao
Para executar a aplicao, conecte seu aparelho ao computador ou inicie o emulador. Em seguida, clique no boto Run app (boto verde em forma de play) e ser
exibida a tela da figura 1.8, onde podemos selecionar o dispositivo (se houver mais
de 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.

40

Dominando o Android

Processo de compilao
Aps observarmos a aplicao executando, importante entender o que aconteceu
durante esse processo. O processo de build (ou construo) envolve a compilao,
a assinatura, o empacotamento e a execuo do aplicativo. No Android isso feito de uma forma um pouco diferente de uma aplicao Java convencional (para
desktop ou web).

Figura 1.10 Processo de build de uma aplicao Android.

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


O Android Asset Packaging Tool (aapt) obtm os recursos da aplicao e os
compila, gerando a classe R.java e os recursos compilados (resources.arsc). O
aapt tambm gera o AndroidManifest.xml encriptado.
Todo o seu cdigo Java, incluindo a classe R.java, ser compilado em arquivos
.class usando o compilador javac.
A ferramenta dex converte esses arquivos .class em bytecodes da mquina
virtual do Android. At o KitKat, a mquina virtual era a Dalvik, mas a partir
do Lollipop (5.0) a mquina virtual passou a ser o ART (Android Runtime).
O apkbuilder empacota o resources.arsc, o classes.dex e o AndroidManifest.xml
(encriptado) em um arquivo .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
.android na pasta do usurio. Para publicar no Google Play, usa-se uma outra chave gerada pelo
prprio desenvolvedor. Veremos esse processo no captulo 26.

Captulo 1 Conceitos bsicos

41

Uma vez que o .apk gerado, ele salvo em seu_projeto/app/build/outputs/apk/app-debug.apk


e a IDE utiliza a ferramenta adb (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
adb
adb
adb
adb
adb
adb

devices
kill-server
start-server
install -r SuaApp.apk
shell pm uninstall k pacote.da.app
push arquivo.jpg /mnt/sdcard
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 parmetro -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 documentao para conhecer outros comandos do adb.
Na prxima seo estudaremos um recurso bastante poderoso: a alocao dinmica de recursos.

Alocao dinmica de recursos


Todos os recursos que usamos na nossa aplicao (strings, imagens, estilos, layouts
etc.) ficam dentro da pasta res (abreviao de resources), 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 ./

42

Dominando o Android

values arquivos XML que contm valores tais como strings (texto simples),
string arrays (lista de valores), dimenses (definio de tamanhos), color
(definio de cores), 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 nomeados 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
Operadora

Idioma

Tamanho de tela
(ver tabela 1.5)
Orientao de tela

Densidade da tela
(ver tabela 1.3)

API Level
(ver tabela 0.1)

Exemplo do sufixo
mcc724-mnc05
mcc724-mnc31
en
en-rUS
pt
pt-rBR
small
normal
large
xlarge
port
land
ldpi
mdpi
tvdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
v10
v11
v14

Recurso para
Operadora do Brasil (mcc-724) e cdigo
05 (Claro) e 31 (Oi)
Ingls (qualquer pas)
Ingls dos Estados Unidos
Portugus (qualquer pas)
Portugus do Brasil
Telas pequenas
Telas normais
Telas grandes
Telas extragrandes
Portrait (vertical)
Landscape (horizontal)
Baixa densidade (120 dpi)
Mdia densidade (160 dpi)
Densidade de TV (213 dpi)
Alta densidade (240 dpi)
Densidade extra-alta (320 dpi)
Densidade extra-alta (480 dpi)
Densidade extra-alta (640 dpi)
Aparelhos com Android 2.3 ou superior
Aparelhos com Android 3.0 ou superior
Aparelhos com Android 4.0 ou superior

Captulo 1 Conceitos bsicos

43

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, selecione 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.

44

Dominando o Android

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


modifique-o para ficar como a seguir.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Ex01_Ol</string>
<string name="hello_world">Ol mundo!</string>
<string name="action_settings">Configuraes</string>
</resources>

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
qualidade da tela, que medida em DPIs (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
do tamanho (largura e altura) de imagens para aparelhos hdpi, por exemplo. Ento 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
aparelho estiver em landscape ou para resolues de tela diferentes (ou combinando 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.

Captulo 1 Conceitos bsicos

45
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
Layout em portrait ou landscape, independente do
tamanho da tela

res/layout
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

Se voc observar, a medida da tela definida em DP (ou DIP Density 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)

46

Dominando o Android

Por exemplo, qual o tamanho da tela em dp de um aparelho com resoluo de


1.024 por 768 pixels com densidade HDPI (240 dpi)?
dp = 1024 / (240 / 160)
dp = 1024 / 1,5
dp = 680

dp = 768 / (240 / 160)


dp = 768 / 1,5
dp = 512

Com base na tabela 1.5 podemos constatar que uma tela de 680 dp x 512 dp
considerada grande (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
Log.d("NGVL",
Log.d("NGVL",
Log.d("NGVL",
Log.d("NGVL",
Log.d("NGVL",
Log.d("NGVL",
Log.d("NGVL",

= configuration.locale;
"density: "+ density);
"orientation: "+ orientation);
"height: "+ height);
"width: "+ width);
"language: "+ locale.getLanguage() + "-" + locale.getCountry());
"mcc: "+ mcc);
"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 Logcat


O 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

Captulo 1 Conceitos bsicos

47

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 nmero 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.

48

Dominando o Android

Para entender melhor o log, vejamos o que exibido: na primeira coluna temos
a hora do log; depois o nmero do processo seguido do id da thread (separado
por -); logo aps, temos o nome do pacote da aplicao; o tipo do log (D de
debug) e a tag separados por /; e por ltimo a mensagem do log.

findViewById e evento de clique


Agora 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.
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_toast"

Captulo 1 Conceitos bsicos

49

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

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.
<resources>
...
<string name="btn_toast">Exibir toast</string>
</resources>

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.

50

Dominando o Android

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

android.os.Bundle;
android.support.v7.app.ActionBarActivity;
android.view.View;
android.widget.Button;
android.widget.EditText;
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.

Captulo 1 Conceitos bsicos

51

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.

Você também pode gostar