Escolar Documentos
Profissional Documentos
Cultura Documentos
Novatec
Primeira edio
captulo 1
Conceitos bsicos
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
31
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.
33
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.
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).
35
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
@string/ola
@dimen/margem
36
Dominando o Android
android.support.v7.app.ActionBarActivity;
android.os.Bundle;
android.view.Menu;
android.view.MenuItem;
37
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>
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.
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.
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).
41
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
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
43
44
Dominando o Android
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.
45
Tabela 1.3 Densidades de tela
Densidade
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
Propsito
Layout em portrait ou landscape, independente do
tamanho da tela
res/layout
res/layout-port
res/layout-large
res/layout-land-xlarge
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
46
Dominando o Android
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);
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.
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.
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.
Ex02_Activity
Package Name
dominando.android.ex02_activity
Activity Name
MainActivity
49
android:id="@+id/button"
android:layout_below="@+id/editText"
android:layout_alignParentLeft="true"/>
</RelativeLayout>
50
Dominando o Android
android.os.Bundle;
android.support.v7.app.ActionBarActivity;
android.view.View;
android.widget.Button;
android.widget.EditText;
android.widget.Toast;
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.