Curso de Android Básico
Curso de Android Básico
Curso de Android Básico
Introduo.............................................................................................................. 2
Arquitetura............................................................................................................... 3
Google Play.............................................................................................................. 6
Montando o Ambiente.............................................................................................. 8
Instalao do SDK do Java........................................................................................ 8
Configurando o Java........................................................................................... 10
Android SDK........................................................................................................... 12
Instalando o Android SDK....................................................................................... 13
SDK Manager.......................................................................................................... 14
Primeiro Exemplo Android................................................................................ 18
Primeiro Exemplo Android................................................................................ 22
Entendendo o Projeto Android................................................................................ 30
Executando o projeto............................................................................................. 33
Processo de execuo do projeto...........................................................................39
Adicionando novos recursos................................................................................... 42
Adicionando recursos diretamente no xml.............................................................43
Adicionando recurso no modo design....................................................................44
Adicionando Widgets aplicao...........................................................................46
TextView................................................................................................................. 47
Executando o projeto Android................................................................................ 50
Trabalhando com eventos...................................................................................... 51
Adicionando Eventos.............................................................................................. 56
Associando o evento ao boto............................................................................... 58
Criando uma nova tela....................................................................................... 60
2 Criando um novo arquivo de layout..................................................................61
3 Criando a classe Java........................................................................................ 65
4 Exibindo a nova tela......................................................................................... 69
Executando o projeto para visualizar a nova tela...................................................71
Voltando para a tela anterior.................................................................................. 72
Executando o projeto............................................................................................. 73
Ciclo de vida das Activities............................................................................... 74
Entendendo o ciclo de vida............................................................................... 76
Layouts................................................................................................................. 77
Layouts................................................................................................................. 79
TableLayout............................................................................................................ 81
Exemplo de TableLayout......................................................................................... 83
Unidades de medida utilizadas no Android....................................................85
Resoluo do Emulador.......................................................................................... 87
RelativeLayout....................................................................................................... 91
FrameLayout.......................................................................................................... 92
ScrollView............................................................................................................... 94
Usando Widgets de Seleo................................................................................... 95
Exemplo de ListView.............................................................................................. 97
Identificando o item selecionado..........................................................................100
CheckBox............................................................................................................. 102
RadioButton......................................................................................................... 105
Spinner................................................................................................................. 109
Tipos de Recursos................................................................................................ 111
Adicionando um recurso de cor......................................................................113
Recursos Grficos................................................................................................. 116
cones de exemplo............................................................................................... 118
Recursos de Menu................................................................................................ 122
Preparando o exemplo......................................................................................... 125
Carregando o menu.............................................................................................. 126
Em execuo........................................................................................................ 127
Programando o menu........................................................................................... 129
Caixa de dilogo................................................................................................... 130
Configurando a janela de confirmao.................................................................133
Submenus............................................................................................................ 134
Dispositivos sem botes fsicos.....................................................................139
Toast..................................................................................................................... 144
Intent................................................................................................................... 146
Intent Filters......................................................................................................... 150
Enviando dados para outra activity......................................................................158
Recebendo dados de outra activity......................................................................161
Intents implcitas disponveis.........................................................................165
Editando um contato............................................................................................ 175
BoadcastReceiver................................................................................................. 177
Notificao......................................................................................................... 189
Introduo
A quantidade de aparelhos celulares vem aumentando, cada vez mais, ao
longo dos anos. Atualmente, o telefone celular o produto de consumo mais
utilizado no mundo.
O nmero de celulares com acesso internet representa mais do dobro de
computadores com o mesmo acesso. E isso s tende a aumentar na medida
em que os pases em desenvolvimento atualizam seus aparelhos por modelos
mais recentes.
Em mercado to promissor, no restam dvidas que inovaes nessa rea so
inevitveis.
Tendo como motivao principal a inovao na rea de telefonia celular, vrias
empresas do ramo de telefonia e tecnologia, com o apoio do Google, criaram
uma parceria que deu origem Open Handset Alliance OHA.
sobre
essa
aliana
no
Arquitetura
Na imagem abaixo voc pode ver como estruturada a arquitetura do Android:
Ele
possui
as
camadas: Applications, Application Frameworks, Libraries, Android Runt
ime e Linux Kernel.
Applications
Acima de todas as camadas est localizada a de aplicativos (Applications), na
qual se encontram todos os aplicativos fundamentais (escritos em Java) do
Application Framework
Na camada do framework (Application Framework) esto todas as APIs e
recursos utilizados pelos aplicativos: as classes visuais que incluem listas,
grades, caixas de texto, botes e at um navegador web embutido View
System (componentes utilizados na construo de aplicativos); provedor de
contedo (Content Provider) que possibilita, determinada aplicao,
acessar informaes de outra aplicao, ou at compartilharem informaes,
possibilitando a troca de informaes entre aplicativos e gerenciadores de
recursos, gerenciador de localizaes (GPS e Cell ID), gerenciador de
notificao (fornece informaes sobre eventos que ocorrem no dispositivo), de
pacotes e de atividade que controla todo o ciclo de vida da aplicao e o
acesso e navegao entre as aplicaes.
Todos os conjuntos de componentes disponveis na plataforma Android
possuem pleno acesso s APIs utilizadas pelo ncleo da plataforma. Esta
arquitetura foi projetada para simplificar a reutilizao de componentes, onde
qualquer aplicao pode usar recursos de outra, desde que respeite s
restries de segurana.
Libraries
A camada de bibliotecas (Libraries) carrega consigo um conjunto de
bibliotecas C/C++ utilizadas pelo sistema includas nesse conjunto a
biblioteca C padro (Libc) e possui ainda aquelas bibliotecas das reas de
multimdia, visualizao de camadas 2D e 3D, funes para navegadores web,
funes para grficos, funes de acelerao de hardware, renderizao 3D,
fontes bitmap e vetorizadas e funes de acesso ao banco de dados SQLite.
Tais recursos esto disponveis no framework para o desenvolvimento de
aplicativos.
Android Runtime
Linux Kernel
Utiliza a verso 2.6 do kernel do Linux para os servios centrais do sistema,
tais como segurana, gesto de memria, gesto de processos, pilha de
protocolos de rede e modelo de drives. O kernel tambm atua como uma
camada de abstrao entre hardware e o resto da pilha de software. Um
acessrio interessante o Binder (IPC), responsvel por obter e enviar para a
aplicao requerente a interface de servio da aplicao requerida,
possibilitando a Comunicao Inter-processos (IPC).
Google Play
O Google Play uma evoluo da Android Market, antiga loja de aplicativos
Android desenvolvida pelo Google. Agora no Google Play, alm de aplicativos,
tambm possvel comprar/baixar livros (e-book), filmes, msicas, dispositivos
e acessrios. Disponvel no link:http://play.google.com/:
Android Developers
O site Android Developers (http://developer.android.com/) contm todas as
informaes para oferecer suporte e auxiliar a desenvolver o Android:
Montando o Ambiente
Para desenvolver aplicaes Android utilizada a linguagem Java. Qualquer
editor pode ser utilizado para desenvolver uma aplicao (at o bloco de notas,
compilando na linha de comando do SO). Neste curso ser usado o Eclipse, que
a IDE recomendada pelo Google.
Alm dos diversos recursos do Eclipse, h um plugin especfico para o
desenvolvimento Android que aumenta a produtividade no desenvolvimento.
O Google recomenda os seguintes requisitos de software e hardware:
Sistemas Operacionais
Windows XP ou superior
Mac OS X 10.5.8 ou superior
Linux
Software
JDK6 ou JDK7
Eclipse 3.6.2 (Helios) ou superior.
Android Developer Tools Plugin
Hardware
12345-
Instalao
Instalao
Instalao
Instalao
Instalao
do
do
do
da
do
SDK do Java.
Eclipse.
SDK do Android.
plataforma do Android.
Plugin Android para Eclipse.
Obs: Para evitar qualquer tipo de conflito nos programas que sero instalados,
desinstale qualquer verso antiga dos softwares listados. Ou utilize o ADT
Bundle disponibilizado pelo Google, que traz as etapas 2 a 5 acima j
configuradas. Essa opo adotada neste curso.
Configurando o Java
Antes de instalar o SDK do Android, ser necessrio configurar algumas
variveis de ambiente do Windows, incluindo a varivelJAVA_PATH, que ser
utilizada pelo SDK do Android.
Para o Windows 8, Windows 7 e Windows Vista, abra o Painel de Controle:
Varivel: JAVA_PATH
Valor: C:\Program Files\Java\jdk1.7.0_03 (o valor pode variar no seu
computador)
Confira com a imagem acima e clique em OK para criar a varivel:
Android SDK
Para
baixar
o Android
site: http://developer.android.com/sdk/index.html:
SDK acesse
Agora o Google disponibiliza o ADT Bundle, que incluiu o Eclipse com o plugin
ADT instalado, alm do Android SDK, permitindo pular essa etapa do processo.
Clique em Download the SDK:
Nesse pacote tudo j est configurado, no sendo preciso fazer mais nada.
Basta abrir o Eclipse para iniciar o desenvolvimento da aplicao.
Porm, antes de fazer isso conhea o SDK Manager, que a ferramenta mais
importante do SDK do Android.
SDK Manager
O SDK Manager permite gerenciar as vrias verses disponveis do SDK do
Android. Para inici-lo, execute o arquivo SDK Manager.exe, presente na
pasta do pacote:
Ela lista todas as ferramentas disponveis para o SDK, bem como todas as
verses de SDK do Android para baixar.
Note que a verso 4.2 do Android j est instalada. No momento, essa a
verso mais atual. Mas para desenvolver uma aplicao para uma plataforma
especfica como, por exemplo, a 2.3, necessrio instalar essa verso do SDK.
Selecione-a:
Clique em Next:
Clique em Next:
Nessa tela voc pode definir: se ser criado um cone customizado (Create
custom laouncher icon); se a aplicao j ser criada com uma tela (Create
activity); e se a aplicao ser uma biblioteca que poder ser utilizada em
outros projetos Android (Mark this project as libary). Tambm permitido
modificar o local do projeto, bem como definir se ele ser includo em
um Working set (espaos de trabalho dentro do workspace).
Selecione as opes na tela, conforme indicado na imagem acima e clique
em Next:
a um arquivo de layout
frente)
usa-se
demonstrado
no
cdigo
(o
o
da
A pasta Android 4.2 (o nome pode variar de acordo com a verso do Android)
contm a referncia da biblioteca do Android:
Executando o projeto
Para executar o projeto, no Package Explorer, clique com o boto direito do
mouse sobre o projeto e selecione a opo Run as > Android Application,
conforme mostra a imagem abaixo:
E o arraste at a lateral:
Selecione Yes, monitor logcat and... e clique em OK. A aba LogCat ser
exibida:
Ele ser executado automaticamente assim que a classe for carregada para a
memria.
Dentro do mtodo onCreate chamado o mtodo onCreate da classe-pai (no
caso a classe Activity):
super.onCreate(savedInstanceState);
O objeto TextView:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/hello_world" />
Repare na linha:
Existem duas formas de adicionar recursos nesse arquivo: pela forma grfica
ou pelo cdigo-fonte.
Ela exibe os recursos disponveis que podem ser adicionados no arquivo. Como
esse um arquivo de recursos string, s essa opo estar disponvel.
Selecione a opo string e comece a digitar a propriedade name, mas digite
apenas a letra n e pressione Ctrl+ barra de espao para exibir as opes
disponveis:
Agora voc pode criar o recurso com possibilidades mnimas de erro. Desta
forma, crie um recurso chamado aluno, conforme o cdigo abaixo:
<resources>
<string name="app_name">Primeiro Exemplo</string>
<string name="hello_world">Ol Mundo!</string>
<string name="menu_settings">Configuraes</string>
<string name="aluno">Carlos Santos Silva</string>
</resources>
Observe, na imagem acima esquerda, a Pallete que contm uma aba com
vrios widgets que podem ser adicionados tela.
TextView
Para adicion-los s arrastar o widget da Pallete para a tela. Faa esse
movimento para o widget TextView, que utilizado para apresentar um texto
na tela. O arquivo ficar da seguinte forma:
Observe que este widget semelhante ao widget adicionado pelo plugin, com
apenas duas diferenas: os atributos esto na mesma linha, o que no interfere
em nada; e j foi adicionado o atributo android:id, que utilizado para
identificar o widget via programao (como ser explicado frente).
Voc pode adicionar e alterar widgets diretamente no arquivo, mas a forma
grfica a mais recomendvel para se trabalhar com widgets.
Remova
os
trs TextVeiw e
adicione
um EditText,
um Button e
dois TextView. Organize-os conforme indicado na seguinte imagem:
<requestFocus />
</EditText>
<Button
android:id="@+id/buttonProximo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editTextNome"
android:layout_below="@+id/editTextNome"
android:layout_marginTop="18dp"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonProximo"
android:layout_below="@+id/buttonProximo"
android:layout_marginTop="20dp"
android:text="@string/resposta" />
</RelativeLayout>
Adicionando Eventos
De forma similar ao swing e awt (do Java), para adicionar um evento classe
necessrio implementar uma ou mais interfaces, de acordo com o evento
desejado.
Para
implementar
o
evento
clique
do
boto,
interface OnClickListener do pacote android.view.View.
utilize
Obs: Para conhecer mais sobre esta interface acesse o site da documentao
do
Android
no
link:http://developer.android.com/reference/android/view/View.OnClickListener.h
tml
No cdigo da classe digite implements e On e pressione Ctrl + espao. Para a
complementao de cdigo sero mostradas as opes disponveis:
exemplo,
Digite seu nome e clique no boto OK para exibir o contedo da caixa de texto
no TextView.
Para criar uma nova activity (tela) no projeto siga a seguinte ordem:
1 Criando os recursos
Adicione no arquivo strings.xml os
indicado no cdigo a seguir:
conforme
<resources>
<string name="app_name">Primeiro Exemplo</string>
<string name="hello_world">Ol Mundo!</string>
<string name="menu_settings">Configuraes</string>
<string name="aluno">Carlos Santos Silva</string>
<string name="curso">Android Bsico</string>
<string name="msg">Digite seu nome abaixo</string>
<string name="texto_nome"></string>
<string name="botao_proximo">Prxima Tela</string>
<string name="botao_ok">OK</string>
<string name="resposta">Resposta:</string>
<string name="ensino">Treinaweb Cursos</string>
<string name="titulo">Informaes do curso</string>
</resources>
Adicione
mais
um TextView e
associe-os
recursos: titulo, curso e ensino, conforme a imagem abaixo:
com
os
exibir,
em Matching items, as
import android.app.Activity;
import android.os.Bundle;
public class Tela2 extends Activity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela2);
}
}
preciso
mapear
activity
no
Observe,
no
cdigo
acima,
que
no
foi
necessrio
declarar
uma Intent (inteno) para a Tela2. No primeiro activity a Intent foi
adicionada automaticamente, sendo necessria para especificar a classe que
ser executada ao iniciar a aplicao (semelhante ao mtodo main do Java).
O arquivo AndroidManifest.xml ficar da seguinte forma:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.treinaweb.parte1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="br.com.treinaweb.parte1.Tela1"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="br.com.treinaweb.parte1.Tela2"
android:label="@string/app_name">
</activity>
</application>
</manifest>
Obs: Para alterar o activity inicial da aplicao basta modificar a linha abaixo,
inserindo o nome do novo activity:
<activity
android:name="br.com.treinaweb.parte1.Tela1"
Lembrando que apenas uma activity pode ter a action MAIN em uma aplicao.
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela2);
Button btnVoltar = (Button) findViewById(R.id.buttonVoltar);
btnVoltar.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();
}
Note que foi usado apenas o mtodo finish() para encerrar a activity atual (no
caso, Tela2) e voltar para a activity anterior (Tela1).
Executando o projeto
Execute a aplicao e clique no boto OK para exibir a segunda activity:
Para entender os eventos que ocorrem com cada activity (tela) necessrio
conhecer o ciclo de vida e os eventos das mesmas.
Onde:
Layouts
Layouts so classes que formam a infraestrutura da tela (view), facilitando a
distribuio dos vrios widgets nela.
No exemplo, foram usados dois tipos de layout para construir as telas. O
primeiro o RelativeLayout do arquivo activity_tela1.xml:
<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=".Tela1" >
<TextView
android:id="@+id/textViewMensagem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="19dp"
android:layout_marginTop="14dp"
android:text="@string/msg" />
<EditText
android:id="@+id/editTextNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewMensagem"
android:layout_below="@+id/textViewMensagem"
android:layout_marginTop="18dp"
android:ems="10"
android:inputType="textPersonName"
android:text="@string/texto_nome" >
<requestFocus />
</EditText>
<Button
android:id="@+id/buttonProximo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editTextNome"
android:layout_below="@+id/editTextNome"
android:layout_marginTop="18dp"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonProximo"
android:layout_below="@+id/buttonProximo"
android:layout_marginTop="20dp"
android:text="@string/resposta" />
</RelativeLayout>
nele que se informa o tipo de layout do arquivo. Esse layout ser explicado
frente.
O segundo o LinearLayout de activity_tela2.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/titulo" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/curso" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ensino" />
<TextView
android:id="@+id/textViewAluno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/aluno" />
<Button
android:id="@+id/buttonVoltar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/botao_voltar" />
</LinearLayout>
LinearLayout
TableLayout
RelativeLayout
AbsoluteLayout
FrameLayout
A primeira opo a mais simples, usada na activity_tela2.xml, como
mostrado no exemplo acima. Os demais sero demonstrados a seguir.
Layouts
Layouts so classes que formam a infraestrutura da tela (view), facilitando a
distribuio dos vrios widgets nela.
No exemplo, foram usados dois tipos de layout para construir as telas. O
primeiro o RelativeLayout do arquivo activity_tela1.xml:
<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=".Tela1" >
<TextView
android:id="@+id/textViewMensagem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="19dp"
android:layout_marginTop="14dp"
android:text="@string/msg" />
<EditText
android:id="@+id/editTextNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewMensagem"
android:layout_below="@+id/textViewMensagem"
android:layout_marginTop="18dp"
android:ems="10"
android:inputType="textPersonName"
android:text="@string/texto_nome" >
<requestFocus />
</EditText>
<Button
android:id="@+id/buttonProximo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editTextNome"
android:layout_below="@+id/editTextNome"
android:layout_marginTop="18dp"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonProximo"
android:layout_below="@+id/buttonProximo"
android:layout_marginTop="20dp"
android:text="@string/resposta" />
</RelativeLayout>
nele que se informa o tipo de layout do arquivo. Esse layout ser explicado
frente.
O segundo o LinearLayout de activity_tela2.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/titulo" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/curso" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ensino" />
<TextView
android:id="@+id/textViewAluno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/aluno" />
<Button
android:id="@+id/buttonVoltar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/botao_voltar" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
LinearLayout
TableLayout
RelativeLayout
AbsoluteLayout
FrameLayout
A primeira opo a mais simples, usada na activity_tela2.xml, como
mostrado no exemplo acima. Os demais sero demonstrados a seguir.
TableLayout
O TableLayout permite trabalhar com linhas como se fosse uma tabela do
HTML (mas bem mais limitada) e as colunas so criadas automaticamente
quando algum widget adicionado.
Faa este exemplo: Crie um novo arquivo de layout, activity_tela3.xml.
Primeiro selecione o layout TableLayout, conforme mostra a imagem a seguir:
Exemplo de TableLayout
Para adicionar uma linha ao layout, selecione o objeto TableRow, presente na
categoria Layouts da Palette:
Note que, para alinhamento dos objetos dentro da coluna, foi usado o atributo
gravity que possui diversas opes que aparecem ao se utilizar as teclas CTRL
+ Espao, forando a complementao do cdigo:
Criando a Activity
Voltando ao exemplo de TableLayout, crie uma classe Java que ir estender a
classe Activity do Android, conforme mostra o cdigo a seguir:
package br.com.treinaweb.parte1;
import android.app.Activity;
import android.os.Bundle;
public class Tela3 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela3);
}
}
Para definir esta activity como tela inicial da aplicao, voc dever modificar o
arquivo Android.Manifest. Nele, com o intent-filter da activity Tela1, crie
uma tag <activity> para a nova activity Tela3. Faa da seguinte forma:
<activity
android:name="br.com.treinaweb.parte1.Tela3"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Remova
o intent-filter da
activity Tela1 para
no
arquivo Android.Manifest ficar da seguinte forma:
gerar
erro.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.treinaweb.parte1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="br.com.treinaweb.parte1.Tela1"
android:label="@string/app_name" >
</activity>
<activity
android:name="br.com.treinaweb.parte1.Tela2"
android:label="@string/app_name">
</activity>
<activity
android:name="br.com.treinaweb.parte1.Tela3"
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>
Resoluo do Emulador
Para visualizar como os widgets e a aplicao se comportam em outras
resolues, basta alterar as configuraes do prprio emulador.
Abra o Android Virtual Dervice Manager pelo menu iniciar,
opo Windows > Android Virtual Dervice Manager do Eclipse:
ou
na
Selecione o seu emulador e clique no boto Edit para ser exibida a seguinte
caixa de dilogo:
Na opo Device voc pode escolher outra opo de Device, que possua
outra resoluo:
RelativeLayout
Esse tipo de layout foi mostrado no primeiro exemplo do curso. Ele baseado
em posies relativas de um widget em relao a outro pr-existente. Para
esse tipo de layout o atributo ID do widget obrigatrio.
Crie um novo arquivo de layout RelativeLayout, contendo os mesmos widgets
do exemplo anterior: um TextView, um EditText (Person Name) e
um Button, conforme indicado no cdigo abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/buttonOk"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_alignLeft="@+id/editTextNome"
android:layout_below="@+id/textViewNome"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewNome"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_alignBaseline="@+id/editTextNome"
android:layout_alignBottom="@+id/editTextNome"
android:layout_alignParentLeft="true"
android:layout_marginLeft="15dp"
android:text="@string/nome" />
<EditText
android:id="@+id/editTextNome"
android:layout_width="250dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="15dp"
android:ems="10"
android:inputType="textPersonName" />
</RelativeLayout>
Observe a linha:
android:layout_alignLeft="@+id/editTextNome"
Note a linha:
setContentView(R.layout.relative_activity_tela3);
FrameLayout
O FrameLayout um espao reservado na tela que voc pode utilizar para
exibir outro tipo de contedo, como no exemplo abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/buttonOk"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_alignLeft="@+id/editTextNome"
android:layout_below="@+id/textViewNome"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewNome"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_alignBaseline="@+id/editTextNome"
android:layout_alignBottom="@+id/editTextNome"
android:layout_alignParentLeft="true"
android:layout_marginLeft="15dp"
android:text="@string/nome" />
<EditText
android:id="@+id/editTextNome"
android:layout_width="250dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="15dp"
android:ems="10"
android:inputType="textPersonName" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/buttonOk"
android:layout_marginTop="29dp"
android:layout_toRightOf="@+id/buttonOk" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
android:contentDescription="@string/imagem" />
</FrameLayout>
</RelativeLayout>
ScrollView
O ScrollView um tipo especial de layout que permite aos usurios arrastar a
tela para visualizar todos os pontos do layout. O ScrollViewpode conter
apenas um View ou ViewGroup, que normalmente um LinearLayout.
Faa este exemplo: crie um novo arquivo de layout, baseado no
template ScrollView,
e
adicione
um LinearLayout e
alguns Button,
conforme mostra o cdigo abaixo:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="300dp"
android:layout_height="200dp"
android:text="@string/botao_ok" />
<Button
android:id="@+id/button2"
android:layout_width="300dp"
android:layout_height="200dp"
android:text="@string/botao_ok" />
<Button
android:id="@+id/button3"
android:layout_width="300dp"
android:layout_height="200dp"
android:text="@string/botao_ok" />
</LinearLayout>
</ScrollView>
Observe que agora existe uma barra de rolagem do lado direito da tela,
permitindo aos usurios arrastar a tela para visualizar os widgets localizados
na parte inferior.
ListView
Para exibir listas no Android utiliza-se o widget ListView. Para utiliz-lo, basta
adicionar
um ListView em
um
arquivo
de
layout
e
utilizar
o
mtodo setAdapter para carregar os itens da lista, sendo que os itens podem
ser criados em um arquivo de recursos ou via cdigo.
Faa este exemplo: crie um novo arquivo de layout e
dois TextViews e um ListView, conforme mostra o cdigo abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textViewRotulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="@string/rotolo" />
<ListView
android:id="@+id/listViewCursos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewRotulo"
android:layout_below="@+id/textViewRotulo" >
</ListView>
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/listViewCursos"
android:layout_alignParentBottom="true"
adicione
android:text="@string/resposta" />
</RelativeLayout>
Se voc mudar para o modo de designer notar que o ListView ocupa toda a
tela:
Isso acontece porque ele possui apenas informaes de exemplo para dar
noo de como a tela ser apresentada no layout.
Exemplo de ListView
A informao pode ser carregada usando os dados do arquivo de recursos.
Nesse caso, adicione o arquivo de recursos string-array e nele adicione
alguns itens, conforme o recurso abaixo:
<resources>
<string name="app_name">Primeiro Exemplo</string>
<string name="hello_world">Ol Mundo!</string>
<string name="menu_settings">Configuraes</string>
<string name="aluno">Carlos Santos Silva</string>
<string name="curso">Android Bsico</string>
<string name="msg">Digite seu nome abaixo</string>
<string name="texto_nome"></string>
<string name="botao_proximo">Prxima Tela</string>
<string name="botao_ok">OK</string>
<string name="resposta">Resposta:</string>
<string name="ensino">Treinaweb Cursos</string>
<string name="titulo">Informaes do curso</string>
<string name="botao_voltar">Voltar</string>
<string name="nome">Nome:</string>
<string name="imagem">cone aplicao</string>
<string name="rotolo">Selecione uma opo:</string>
<string-array name="cursos">
<item>Curso Android bsico</item>
<item>Curso Java bsico</item>
<item>Curso C# bsico</item>
<item>Curso VB.NET bsico</item>
</string-array>
</resources>
deve
criar
uma
varivel
que
representa
Para
finalizar,
carregue
mtodo setAdapter:
o ArrayAdapter ao
list.setAdapter(aAdapter);
ListView,
atrves
do
Agora, para carregar as informaes via cdigo, basta criar um array para ser
utilizado no ArrayAdapter:
public class Tela3 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela4);
//String[] cursos = getResources().getStringArray(R.array.cursos);
String[] cursos = {"Android Bsico", "Java Bsico", "C# Bsico"};
ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(this, android.R.layout.si
mple_gallery_item, cursos);
ListView list = (ListView) findViewById(R.id.listViewCursos);
list.setAdapter(aAdapter);
}
}
Note que foi comentada apenas a linha que carrega os dados do arquivo de
recurso:
//String[] cursos = getResources().getStringArray(R.array.cursos);
Execute a aplicao:
a
o
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class Tela3 extends Activity implements OnItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela4);
//String[] cursos = getResources().getStringArray(R.array.cursos);
String[] cursos = {"Android Bsico", "Java Bsico", "C# Bsico"};
ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(this, android.R.layout.si
mple_gallery_item, cursos);
ListView list = (ListView) findViewById(R.id.listViewCursos);
list.setAdapter(aAdapter);
list.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
TextView resposta = (TextView) findViewById(R.id.textViewResposta);
String curso = ((TextView) view).getText().toString();
resposta.setText("Resposta: " + curso);
}
}
CheckBox
O CheckBox um widget que permite ao usurio selecionar quantas opes
desejar. Faa este exemplo, crie o arquivo de layout abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textViewRotulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="@string/rotolo" />
<CheckBox
android:id="@+id/checkBoxAndroidBasico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textViewRotulo"
android:text="@string/android_basico" />
<CheckBox
android:id="@+id/checkBoxJavaBasico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/checkBoxAndroidBasico"
android:text="@string/java_basico" />
<CheckBox
android:id="@+id/checkBoxCSharpBasico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/checkBoxJavaBasico"
android:text="@string/csharp_basico" />
<Button
android:id="@+id/buttonOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/checkBoxCSharpBasico"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/buttonOk"
android:layout_marginTop="23dp"
android:text="@string/resposta" />
</RelativeLayout>
implementar
a
evento onClick.
interface onClickListener e
associar
boto
ao
Esse cdigo:
chkAndroid.setOnClickListener(new OnClickListener(){
RadioButton
O RadioButton, assim com o CheckBox, um widget que apresenta opes.
Mas permite ao usurio selecionar apenas uma opo dentro do grupo.
Por exemplo, crie um arquivo de layout, conforme o cdigo abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textViewRotulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="@string/rotolo" />
<RadioGroup android:id="@+id/rdGroupCursos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textViewRotulo">
<RadioButton
android:id="@+id/radioButtonAndroidBasico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/android_basico" />
<RadioButton
android:id="@+id/radioButtonJavaBasico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/java_basico" />
<RadioButton
android:id="@+id/radioButtonCSharpBasico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/csharp_basico" />
</RadioGroup>
<Button
android:id="@+id/buttonOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/rdGroupCursos"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/buttonOk"
android:layout_marginTop="23dp"
android:text="@string/resposta" />
</RelativeLayout>
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
TextView resposta = (TextView) findViewById(R.id.textViewResposta);
RadioButton rbAndroid = (RadioButton) findViewById(R.id.radioButtonAndroidBasico);
RadioButton rbJava = (RadioButton) findViewById(R.id.radioButtonJavaBasico);
RadioButton rbCSharp = (RadioButton) findViewById(R.id.radioButtonCSharpBasico);
String msg = "Curso selecionado: ";
if(rbAndroid.isChecked())
msg += rbAndroid.getText().toString() + " ";
if(rbJava.isChecked())
msg += rbJava.getText().toString() + " ";
if(rbCSharp.isChecked())
msg += rbCSharp.getText().toString() + " ";
resposta.setText(msg);
}
}
}
});
final RadioButton rbJava = (RadioButton) findViewById(R.id.radioButtonJavaBasico);
rbJava.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
TextView resposta = (TextView) findViewById(R.id.textViewResposta);
if(((RadioButton) view).isChecked())
resposta.setText("Curso: " + ((RadioButton) view).getText() + " selecionado!");
else
resposta.setText("Curso: " + ((RadioButton) view).getText() + " no est selecionado!");
}
});
final RadioButton rbCSharp = (RadioButton) findViewById(R.id.radioButtonCSharpBasico);
rbCSharp.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
TextView resposta = (TextView) findViewById(R.id.textViewResposta);
if(((RadioButton) view).isChecked())
resposta.setText("Curso: " + ((RadioButton) view).getText() + " selecionado!");
else
resposta.setText("Curso: " + ((RadioButton) view).getText() + " no est selecionado!");
}
});
Button btnOk = (Button) findViewById(R.id.buttonOk);
btnOk.setOnClickListener(this);
Spinner
Spinner um widget que permite ao usurio selecionar apenas uma opo em
uma caixa suspensa como um ComboBox.
Faa este exemplo: Crie o arquivo de layout, conforme mostra o cdigo abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textViewRotulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="@string/rotolo" />
<Spinner android:id="@+id/spinnerCursos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textViewRotulo">
</Spinner>
<Button
android:id="@+id/buttonOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/spinnerCursos"
android:text="@string/botao_ok" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/buttonOk"
android:layout_marginTop="23dp"
android:text="@string/resposta" />
</RelativeLayout>
Note que o Spinner foi declarado fora do mtodo onCreate para poder ser
visvel dentro do mtodo onClick. Tambm observe que para pegar a
informao
do
item
selecionado,
foi
utilizada
a
propriedade getSelectedView(), convertida para TextView para obter o texto
da opo.
Coloque essa activity como inicial e execute o projeto:
Tipos de Recursos
Todos os recursos do projeto ficam organizados dentro da pasta res. Eles so
mapeados para binrio e acessados atravs de classe de recursos (a
classe R da pasta gen). Para evitar qualquer problema de compilao, o
Android define onde cada tipo de recurso deve ser includo, como os layouts na
pasta res/layout e
as strings na
pasta res/values,
dentro
de
um
arquivo strings.xml.
Agora sero explicados mais alguns recursos que podem ser adicionados ao
projeto.
Recurso Color
Existem vrias formas de aplicar e modificar as cores do projeto. A mais
simples criar um arquivo xml dentro da pasta res/values, contendo o nome
da cor e o valor em RGB.
Esse arquivo deve, obrigatoriamente, ser denominado colors.xml.
Para criar o arquivo, clique com o boto direito do mouse sobre a
pasta res/values e selecione a opo New > Android XML File. A caixa de
dilogo abaixo ser exibida:
#RGB
#ARGB
#RRGGBB
#AARRGGBB
Neste exemplo digite azul em Name e #0000FF em Value, conforme mostra
a imagem abaixo:
Note que a cor foi criada em uma tag color onde o atributo name possui o
nome da cor; entre as tags fica localizado o valor hexadecimal.
Preencha algumas cores no arquivo pelo mtodo visual ou diretamente no
cdigo-fonte. Em caso de dvida sobre os cdigos das cores, voc pode utilizar
a tabela: http://www.treinaweb.com.br/treinamentos/arquivos/cores.html
O arquivo de exemplo que ser utilizado contm as seguintes cores:
<resources>
<color name="azul">#0000FF</color>
<color name="branco">#FFFFFF</color>
<color name="cinza">#CCCCCC</color>
<color name="prento">#000000</color>
<color name="laranja">#FF9900</color>
<color name="vermelho">#FF0000</color>
<color name="rosa">#FF00CC</color>
<color name="verde">#00FF00</color>
<color name="amarelo">#FFFF00</color>
</resources>
android:layout_marginTop="20dp"
android:text="@string/resposta"
android:textColor="@color/vermelho" />
</RelativeLayout>
Recursos Grficos
Os recursos grficos so includos na pasta res/drawable e podem ser
imagens (png, jpg ou gif) ou um xml que define ou faz referncia a uma
imagem. Neste curso bsico sero demonstradas apenas as imagens.
Note que dentro da pasta res existem mais quatro pastas drawable:
Nelas devem ser colocadas as imagens, de acordo com cada tipo de resoluo
que os dispositivos possuem, sendo que so de extra-alta densidade (xhdpi),
alta densidade (hdpi), mdia densidade (mdpi) e baixa densidade (ldpi).
Para saber a resoluo correta de cada densidade, consulte a tabela abaixo:
Obs: Como ser explicado frente, o arquivo deve possuir o mesmo nome nas
trs pastas ou ocorrer um erro de compilao.
Para ajudar a organizar os cones da aplicao, a documentao do Android
sugere a seguinte nomenclatura para a nomeao dos cones:
Dessa forma, voc pode determinar facilmente onde cada arquivo ser
adicionado ao projeto. Para efeito de comparao, os citados acima ficaram
organizados da seguinte forma na aplicao:
cones de exemplo
No momento voc no precisa se preocupar com a criao de cones porque
todos os que sero utilizados nos prximos exemplos so disponibilizados pelo
SDK.
V no caminho ...\sdk\platforms\android-17\data\res:
Depois copie os cones abaixo das pastas do SDK (sdk\platforms\android17\data\res ) para as pastas cones\ic_menu* de acordo com a resoluo:
Repita
a
operao
para
as
pastas drawable-hdpi, drawableldpi e drawable-mdpi de forma a ter as imagens para as 4 resolues.
Para criar o menu (explicado no prximo tpico), alm dos cones necessrio
criar os textos. Desta forma, adicione os recursos abaixo no
arquivo strings.xml:
<string name="menu_archive">Arquivo</string>
<string name="menu_attchment">Adicionar um arquivo</string>
<string name="menu_delete">Excluir</string>
<string name="menu_edit">Editar</string>
<string name="menu_home">Home</string>
<string name="menu_more">Mais</string>
<string name="menu_save">Salvar</string>
<string name="menu_search">Pesquisar</string>
Recursos de Menu
No Android o contedo dos menus fica organizado em um arquivo xml dentro
da pasta res/menu.
Para criar o arquivo de recursos do menu, clique com o boto direito do mouse
sobre a pasta menu e selecione a opo New > Android XML File:
Voc no precisa fazer isso no momento, pois j foi criado um arquivo de menu
para a aplicao:
Abra o arquivo:
Voc
tambm
pode
adicionar
um item ou
um group.
O
elemento item representa cada item de menu e o elemento group, que
opcional e invisvel, permite agrupar itens de menu para a configurao de
propriedades comuns (como estado, visibilidade). Selecione o elementoitem e
clique em OK.
Note que h vrias opes de atributos para um item do menu. Altere apenas
os atributos id, title e icon, conforme a imagem abaixo:
Preparando o exemplo
Mude para o seguinte cdigo-fonte:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_archive" android:title="@string/menu_archive" android:i
con="@drawable/ic_menu_archi
ve"></item>
</menu>
Possuem a funo:
android:id: Identificar o item do menu via programao. Esse valor deve ser
nico. Utiliza-se menu_archive para ficar coerente com os recursos de texto e
imagens.
android:icon: Configurar o cone que ser apresentado no menu. Utilizase @drawable/ic_menu_archive para obter o cone a partir dos recursos de
imagem, ou seja: as imagens nas pastas drawable-*.
android:title: Configurar o texto que ser apresentado no item. Utilizase @string/menu_archive para obter o texto a partir do arquivo de recursos.
Agora adicione os demais itens no arquivo:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_archive"
android:title="@string/menu_archive"
android:icon="@drawable/ic_menu_archive"></item>
<item android:id="@+id/menu_edit"
android:title="@string/menu_edit"
android:icon="@drawable/ic_menu_edit"></item>
<item android:id="@+id/menu_save"
android:title="@string/menu_save"
android:icon="@drawable/ic_menu_save"></item>
<item android:id="@+id/menu_home"
android:title="@string/menu_home"
android:icon="@drawable/ic_menu_home"></item>
<item android:id="@+id/menu_delete"
android:title="@string/menu_delete"
android:icon="@drawable/ic_menu_delete"></item>
<item android:id="@+id/menu_more"
android:title="@string/menu_more"
android:icon="@drawable/ic_menu_more"></item>
</menu>
Carregando o menu
Para utilizar o menu crie um novo arquivo de layout com dois TextView,
conforme indicado no cdigo abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textViewTitulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:text="@string/titulo" />
<TextView
android:id="@+id/textViewResposta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewTitulo"
android:layout_below="@+id/textViewTitulo"
android:layout_marginTop="10dp"
android:text="@string/resposta" />
</RelativeLayout>
import android.os.Bundle;
public class Tela8 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela8);
}
}
Em execuo
Execute a aplicao:
Programando o menu
Quando o usurio clicar em alguma das opes do menu, o sistema ir gerar o
evento onOptionsItemSelected. Esse mtodo recebe o item selecionado do
Caixa de dilogo
Pode-se criar uma janela de dilogo para notificar o usurio, utilizando a
classe AlertDialog.Builder.
Alm de instanciar a classe AlertDialog.Builder preciso configurar o texto
da janela com o mtodo setMessage, e o ttulo com o mtodosetTitle; resta
ainda a opo de configurar um cone com o mtodo setIcon, e o boto com o
mtodo setNeutralButton. Por exemplo:
case R.id.menu_archive:
AlertDialog.Builder mBox = new AlertDialog.Builder(this);
mBox.setMessage("Selecionado a opo Arquivo");
mBox.setTitle("Arquivo");
mBox.setIcon(R.drawable.ic_menu_archive);
mBox.setNeutralButton("OK", null);
mBox.show();
break;
Observe que a tela de trs perdeu o foco e a janela de dilogo est aguardando
alguma interao com o usurio, que nesse caso s pode clicar no boto OK.
Ao clicar no boto nenhuma ao ser realizada, pois o evento do click do
boto ainda no foi programado.
Para configurar o clique de um boto preciso implementar a
interface onClickListener.
Assim
como
voc
implementou
no CheckBox eRadioButon, implemente o evento onClick diretamente no
parmetro do mtodo de definio do boto, conforme o cdigo abaixo:
public boolean onOptionsItemSelected(MenuItem item){
final TextView tvResposta = (TextView) findViewById(R.id.textViewResposta);
String msg = "";
switch(item.getItemId()){
case R.id.menu_archive:
AlertDialog.Builder mBox = new AlertDialog.Builder(this);
mBox.setMessage("Selecionado a opo Arquivo");
mBox.setTitle("Arquivo");
mBox.setIcon(R.drawable.ic_menu_archive);
mBox.setNeutralButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
tvResposta.setText("Boto OK Clicado");
...
}
});
mBox.show();
break;
break;
Submenus
Um submenu nada mais do que um menu que se abre ao ser clicado em
algum dos itens. Sua utilizao recomendvel quando a aplicao possui
Observe, na imagem acima, que apareceu uma nova tela em primeiro plano
com os itens do submenu.
Assim como o menu, quando um item do submenu selecionado o sistema ir
executar o mtodo onOptionsItemSelected. Desta forma, para programar a
resposta do submenu, basta adicionar no mtodo onOptionsItemSelected as
opes para identificar o item do submenu selecionado:
public boolean onOptionsItemSelected(MenuItem item){
final TextView tvResposta = (TextView) findViewById(R.id.textViewResposta);
String msg = "";
switch(item.getItemId()){
case R.id.menu_archive:
AlertDialog.Builder mBox = new AlertDialog.Builder(this);
mBox.setMessage("Selecionada a opo Arquivo");
mBox.setTitle("Arquivo");
mBox.setIcon(R.drawable.ic_menu_archive);
mBox.setNeutralButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
tvResposta.setText("Boto OK Clicado");
}
});
mBox.show();
break;
case R.id.menu_edit:
msg = "Selecionada a opo Editar";
break;
case R.id.menu_save:
msg = "Selecionada a opo
break;
case R.id.menu_home:
msg = "Selecionada a opo
break;
case R.id.menu_delete:
excluirCadastro();
break;
/*case R.id.menu_more:
msg = "Selecionado a opo
break;*/
case R.id.menu_search:
msg = "Selecionada a opo
break;
case R.id.menu_attachment:
msg = "Selecionada a opo
break;
}
tvResposta.setText(msg);
return true;
Salvar";
Home";
Mais";
Pesquisar";
Adicionar arquivo";
android:showAsAction="never"></item>
<item android:id="@+id/menu_delete"
android:title="@string/menu_delete"
android:icon="@drawable/ic_menu_delete"
android:showAsAction="never"></item>
<item android:id="@+id/menu_more"
android:title="@string/menu_more"
android:icon="@drawable/ic_menu_more"
android:showAsAction="never">
<menu>
<group android:checkableBehavior="single" >
<item android:id="@+id/menu_search"
android:title="@string/menu_search"
android:icon="@drawable/ic_menu_search"/>
<item android:id="@+id/menu_attachment"
android:title="@string/menu_attchment"
android:icon="@drawable/ic_menu_attachment"/>
</group>
</menu>
</item>
</menu>
Note que o que no foi exibido no Action Bar continua disponvel no cone dos
trs pontos.
O emulador com essa configurao pesado, por isso altere novamente o
target da aplicao e defina o antigo emulador:
Toast
Outra forma de notificar os usurios utilizar a classe Toast. O Toast um
tipo de popup que aparece na tela, sempre em primeiro plano como a caixa de
dilogo, por um perodo de tempo pr-definido.
Faa este exemplo: na activity Tela8, remova as linhas referentes caixa de
dilogo:
case R.id.menu_archive:
AlertDialog.Builder mBox = new AlertDialog.Builder(this);
mBox.setMessage("Selecionada a opo Arquivo");
mBox.setTitle("Arquivo");
mBox.setIcon(R.drawable.ic_menu_archive);
mBox.setNeutralButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
mBox.show();
break;
E exibido:
toast.show();
Intent
uma estrutura de dados passiva que comporta uma descrio abstrata da
operao a ser realizada. O Android utiliza os Intents para enviar mensagens
entre os trs principais componentes de uma aplicao (activitys, services e
broadcast receivers). Essas mensagens podem ser enviadas dentro da mesma
aplicao ou entre aplicaes diferentes.
Por exemplo, possvel abrir uma nova activity com o seguinte cdigo:
public void onClick(View v) {
Intent intencao = new Intent(this, Tela2.class);
startActivity(intencao);
}
J para abrir outra aplicao como, por exemplo, o discador, utilize o cdigo
abaixo:
public void onClick(View v) {
Intent intencao = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:05501126267282"));
startActivity(intencao);
}
Agora,
na
activity,
implemente
a
interface onClickListener no
mtodo setOnClickListener. Dentro do mtodo onClick, coloque o cdigo
para abrir o discador do celular:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela8);
Button btnDiscar = (Button) findViewById(R.id.buttonDiscar);
btnDiscar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intencao = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:05501126267282"));
startActivity(intencao);
}
});
Execute a aplicao:
Isso porque foi utilizado outro grupo de Intent, ou Intents implcitas, onde a
classe-alvo no nomeada. Ou seja: nas Intents implcitas no informado ao
sistema operacional qual a classe Java (seja uma activity, service ou broadcast
receiver) ser chamada. Ao invs disso um comando ou ao informado,
como no cdigo acima (ou um filtro, explicado frente). No cdigo acima, no
Intent Filters
As atividades, servios e broadcast receivers podem ter um ou mais intent
filters para informar ao sistema quais intents implcitaspodem ser
manuseadas. Cada filtro descreve a capacidade que o componente, ou um
conjunto de intents, poder receber. Isso, em efeito, filtra intents de um tipo
desejado enquanto filtra intents no requeridos mas apenas intents implcitas
no requeridas. Uma intent explcita sempre entregue a seu alvo, no
importa o que contenha. O filtro simplesmente no consultado. Mas uma
intent implcita entregue a um componente apenas se puder passar por
algum dos filtros do componente que se quer que seja o alvo.
Assim como outras informaes essenciais a respeito da aplicao, as Intent
filters so declaradas no arquivo AndroidManifest.xml, como mostra o
cdigo abaixo:
<activity
android:name="br.com.treinaweb.parte1.Tela8"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Note que a activity Tela8 (no caso a Activity inicial) possui uma tag onde os
filtros so criados em seu interior podem passar ao, dados ou categoria a
um objeto Intent. No exemplo acima, s foi criada uma ao (action), sendo
que atravs dela a activity localizada.
Crie um novo projeto e selecione a opo do menu File > New >
Android Application Project. A caixa de dilogo abaixo ser exibida:
<requestFocus />
</EditText>
<Button
android:id="@+id/buttonProxima"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editTextNome"
android:layout_below="@+id/editTextNome"
android:layout_marginTop="15dp"
android:text="@string/botao_proxima" />
<TextView
android:id="@+id/textViewRetorno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonProxima"
android:layout_below="@+id/buttonProxima"
android:layout_marginTop="15dp" />
</RelativeLayout>
android:id="@+id/textViewRetorno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonVoltar"
android:layout_below="@+id/buttonVoltar"
android:layout_marginTop="15dp" />
</RelativeLayout>
Nessa opo foi criada a ao que ser utilizada para referenciar a activity
quando for chamada no cdigo, conforme mostra o exemplo abaixo:
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Tela1 extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela1);
Button btnProxima = (Button) findViewById(R.id.buttonProxima);
btnProxima.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_tela1, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intencao = new Intent("br.com.treinaweb.action.SUBACTIVITY");
startActivity(intencao);
}
}
Note que desta vez no foi preciso informar o nome da classe, apenas o nome
da ao definida no AndroidManifest.xml:
Intent intencao = new Intent("br.com.treinaweb.action.SUBACTIVITY");
setContentView(R.layout.activity_tela2);
Intent intencao = getIntent();
Bundle extras = intencao.getExtras();
if(extras == null) return;
String nome = extras.getString("nome");
if(nome != null) {
TextView tTitulo = (TextView) findViewById(R.id.textViewResposta);
tTitulo.setText(nome + " digite algo abaixo:");
}
Button btnVoltar = (Button) findViewById(R.id.buttonVoltar);
btnVoltar.setOnClickListener(this);
}
Como a activity pode ser chamada por qualquer aplicao que informe a sua
ao
(br.com.treinaweb.action.SUBACTIVITY)
deve-se
verificar
se
o Bundle null, ou seja: se no possui nenhum valor:
if(extras == null) return;
Note tambm, no cdigo acima, que o boto foi vinculado ao evento Click:
Button btnVoltar = (Button) findViewById(R.id.buttonVoltar);
btnVoltar.setOnClickListener(this);
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Tela2 extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela2);
Intent intencao = getIntent();
Bundle extras = intencao.getExtras();
if(extras == null) return;
String nome = extras.getString("nome");
if(nome != null) {
TextView tTitulo = (TextView) findViewById(R.id.textViewResposta);
tTitulo.setText(nome + " digite algo abaixo:");
}
Button btnVoltar = (Button) findViewById(R.id.buttonVoltar);
btnVoltar.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent data = new Intent();
EditText eTexto = (EditText) findViewById(R.id.editTextTexto);
String texto = eTexto.getText().toString();
data.putExtra("texto", texto);
setResult(RESULT_OK, data);
finish();
}
}
E atribudo Intent:
data.putExtra("texto", texto);
if(data.hasExtra("texto"))
result.setText(data.getExtras().getString("texto"));
Preencha algo:
Clique em Voltar:
android:id="@+id/textViewTitulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text="@string/rotulo" />
<ListView
android:id="@+id/listViewContatos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewTitulo"
android:layout_below="@+id/textViewTitulo" >
</ListView>
</RelativeLayout>
de
layout
carregar
os
contados,
import android.app.Activity;
import android.os.Bundle;
public class Tela3 extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tela3);
}
}
crie
@Override
public String toString(){
return name + ": " + number;
}
Utilize essa classe para organizar os contatos. Ela no a melhor forma, como
ser explicado adiante, porque um contato pode ter mais de um nmero de
telefone. Ento, alguns contatos tero o mesmo nome, mas nmeros de
telefone diferentes. Como este exemplo simples, voc no precisa se
preocupar com esse detalhe.
Observe que o mtodo toString(), da classe objeto, foi sobescrito:
@Override
public String toString(){
return name + ": " + number;
}
}else{
Contact oContact = new Contact();
oContact.setContactId(ContactID);
oContact.setName(name);
contacts.add(oContact);
}
}
contact.close();
}catch (Exception e) {
e.printStackTrace();
}
return contacts;
O
mesmo
procedimento
o HAS_PHONE_NUMBER:
foi
repetido
para
pegar
o Nome e
Como um contato pode ter mais de um nmero de telefone, foi criado mais um
cursor para percorrer os telefones do contato:
Cursor phoneCursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"='"+ContactID+"'", null, nu
ll);
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>
Execute a aplicao:
Editando um contato
Existem duas formas de editar um contato: desenvolvendo uma tela para
editar e programar todas as funes; ou utilizar a tela de edio da rea de
contatos do Android.
A primeira opo explicada no curso intermedirio. Para utilizar a activity de
edio do Android, basta adicionar o cdigo abaixo:
String uri = ContactsContract.Contacts.CONTENT_URI + "/" + contactId;
Intent intent = new Intent(Intent.ACTION_EDIT, Uri.parse(uri));
intent.putExtra(INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
startActivityForResult(intent, REQUEST_CODE);
Efetue alguma alterao e clique em Done para voltar para a aplicao com a
alterao realizada:
BoadcastReceiver
Clique em Next:
Clique em Next:
Clique em Next:
android:minSdkVersion="9"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="br.com.treinaweb.parte3.Tela1"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="br.com.treinaweb.parte3.Intercept">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>
Uri.encode(phoneNumber));
projection = new String [] { ContactsContract.PhoneLookup.DISPLAY_NAME };
Com todos os dados cria-se uma Intent para a acitivity Tela1. Adicionam-se os
dados da mensagem e inicia-se a activity:
Intent intencao = new Intent(context, Tela1.class);
intencao.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intencao.putExtra("number", phoneNumber);
intencao.putExtra("name", fromDisplayName);
context.startActivity(intencao);
adicionar
android:text="@string/titulo" />
<TextView
android:id="@+id/textViewRemente"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewTitulo"
android:layout_below="@+id/textViewTitulo"
android:layout_marginTop="20dp"
android:text="@string/remetente" />
<TextView
android:id="@+id/textViewTelefone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textViewRemente"
android:layout_below="@+id/textViewRemente"
android:layout_marginTop="5dp"
android:text="@string/numero" />
</RelativeLayout>
Clique em Call para efetuar a ligao. Como a ligao executa outra aplicao,
antes de ela ser mostrada, a aplicao exibir os dados no emulador:
Como a aplicao foi aberta um pouco antes, ser exibida novamente quando
a ligao for finalizada:
Notificao
Para definir uma notificao da barra de status (no topo da tela), uma janela de
Notificaes e quaisquer outras configuraes de alerta, usa-se a
classe Notification.
Para criar uma notificao da barra de status necessrio ter:
Um cone.
O contedo da notificao.
Um PedingIntent, que ser adicionado quando a notificao for
selecionada.
Como cone use:
Dentro dela crie mais quatro pastas, conforme mostra a imagem abaixo:
Volte ao cdigo.
A primeira coisa a criar um objeto NotificationManager:
NotificationManager mNotificationManager = (NotificationManager) context.getSystemSer
vice(Context.NOTIFICATION_SERV
ICE);
Execute o projeto: