+ Curso de Android XVIII Jornada de Cursos. + 10. Persistência.
Curso de Android
-
Upload
anderson-raposo -
Category
Documents
-
view
4.265 -
download
2
Transcript of Curso de Android
Curso de Android
Fevereiro de 2011
Cristiano Expedito Ribeiro
Fabrício Firmino de Faria
Pré-requisitos
Programação Orientada a Objetos
Java
XML básico
Banco de Dados semi-básico
IDE - Eclipse
Desejável algum conhecimento sobre Web Services
REST
2
Agenda da Aula 1
Introdução
Conceitos básicos
Activity e Intent
Aplicações e tarefas
Ciclo de vida
Passagem e retorno de parâmetros
Interface gráficas
Layouts
Views
Dialogs
Menus
3
Introdução
Suportado pelo Google
Sistema Operacional Linux
Máquina Virtual Dalvik
Código aberto e livre com boa documentação
Plataformas, SDK e API Level
Android 1.5 - 3
Android 1.6 - 4
Android 2.1 - 7
Android 2.2 - 8
Android 2.3 - 9
4
Configuração do ambiente
Download e Instalação
Software Development Kit (SDK)
• http://developer.android.com/sdk/index.html
Plataformas:
• Pasta de instalação > SDK Manager
• "Available Packages" e marque:
• Android SDK Tools
• SDK Platform - API 7, 8 ou 9
• Google API - API 7, 8 ou 9
• Demais são opcionais ou instalados automaticamente
5
Download das plataformas
6
Configuração do ambiente
Android Virtual Devices (AVD)
Permite configurar um celular virtual
Versão do Android, Tamanho da tela e memória
Emulador
Programa que permite rodar um AVD no computador
Exercício 1:
Criar um AVD usando SDK Manager
• No SDK Manager: Virtual Devices > New
• Preencher campos Name, Target e SD Card Size
(128MiB).
7
Criação do AVD
8
Plugin para Eclipse (ADT)
Permite criação e execução de projetos Android
Instalação
No Eclipse: Help > Install New Software > Add
URL: https://dl-ssl.google.com/android/eclipse/
Configuração
Window > Preferentes > Android
Em "SDK Location" coloque o path do SDK
Exercício 2:
Criar uma aplicação Hello World básica com o Wizard e rodar no emulador (não precisa programar).
9
Criação de projeto
New > Other > Android > Android Project
Preencha os campos conforme a próxima figura
Clique em Finish
No Package Explorer, clique com o botão direito sobre
o novo projeto
Selecione Run as > Android Aplication
O emulador será iniciado e após alguns minutos a
aplicação rodará apresentando o título "Hello World.
10
Criação de projeto
Project Name
O nome do projeto que
aparecerá no Package
Explorer do Eclipse.
Application Name
Nome que aparecerá no menu
do Android.
Package Name
Nome único do pacote que
identifica a aplicação.
Create Activity
O nome da classe que
representa a tela inicial da
aplicação.
11
Detalhes e dicas
Não é necessário fechar o emulador após testar a
aplicação
Para executar o mesmo projeto após uma alteração não
é necessário fechar e reabrir o emulador, basta clicar
em Run.
O mesmo vale para outros projetos.
No entanto, em alguns poucos casos, pode ser preciso
Caso uma aplicação seja instalada com o mesmo nome
de pacote de uma já existente no celular a anterior será
substituída.
12
Conceitos básicos
Estrutura do Projeto
src
• Classes da aplicação
gen
• Classe R
• Gerada automaticamente
res/drawable
• Imagens em 3 resoluções diferentes
res/layout
res/values
• Internacionalização de strings
• Descrição de cores, estilos, etc
AndroidManifest.xml
A classe R
Atualizada automaticamente pelo ADT quando o
conteúdo da pasta res é alterado
Também existe a classe android.R com alguns recursos
pré-definidos
Contém constantes que representam cada recurso
R.drawable.nome_imagem
R.layout.nome_layout
R.string.nome_string
R.color.red
R.dimen.espaco
R.array.nome_array
R.style.nome_estilo14
AndroidManifest.xml
XML com as configurações da aplicação
Nome, pacote e ícone
Classes de tela (Activity's)
Versão mínima do SDK necessária
Permissões (acessar Internet, efetuar ligações, etc)
ADT fornece interface de edição
15
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.notification"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".MyActivity1"
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=".MyActivity2" />
</application>
<uses-permission android:name="android.permission.VIBRATE" />
</manifest> 16
strings.xml
/res/values/values-en/strings.xml<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, HelloActivity!</string>
<string name="app_name">Hello World in Android</string>
</resources>
/res/values/values-pt/strings.xml<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Alô Mundo, HelloActivity!</string>
<string name="app_name">Alô Mundo no Android</string>
</resources>
17
LogCat
Não existe System.out.println(), mas existe o LogCat
LogCat permite escrever mensagens no Log do
Android
Níveis de severidade
Para ver no Eclipse:
Window > Show View > Other > Android > LogCat
Verbose Log.v(tag, message)
Debug Log.d(tag, message)
Info Log.i(tag, message)
Warning Log.w(tag, message)
Error Log.e(tag, message,exception)
18
Importação de projetos no Eclipse
Muitas vezes pode ser necessário importar projetos
criados e uma máquina para outra(s):
Menu File > Import... > Existing Projects into Workspace > Next > Browser...
Escolha o diretório contendos os projetos a serem importados
Em projects, marque os projetos a serem importados de
fato
Caso queira que os projetos sejam copiados para seu
workspace, e não apenas referenciados, marque „Copy
projects into workspace‟
Clique em Finish
Resolução de erros de importação
Após a importação o Eclipse pode relatar erros nos
projetos.
Para resolver siga os passos a seguir, desde que não
existam erros de compilação na máquina original
Primeiros deve-se tentar corrigir os erros globalmente,
depois, caso persistam em cada projeto com erros.
Window > Preferences > Android > SDK Location
Window > Preferences > Java > Compiler > Compiler
compliance level > 1.6
Project > Clean... > Clean all projects > OK
Resolução por projeto
Para os projetos que ainda estiverem com erro:
1. Selecione o projeto > Clique com o botão direito >
Properties > Java Compiler > Desmarque „Enable
project specific settings‟ > OK
2. Selecione o projeto > Clique com o botão direito >
Properties > Android > Em „Project Build Target‟
marque a versão do Android a ser utilizada
3. Selecione o projeto > Clique com o botão direito >
Android Tools > Fix Project Properties
Após as propriedades de todos os projetos terem sido
corrigidas:
Project > Clean... > All projects > OK.
Activity e Intent
Aplicação
Ao instalar é associada a um usuário único
Roda em seu processo separado
Classe View
Classe base para elementos de interface gráfica
Classe Activity
Container de elemento gráficos
Gerencia um ciclo de vida
Task (tarefa)
Pilha de Activity's
Pode haver activity`s de diferentes aplicações
Classe Intent
Classe que descreve uma intenção em realizar uma ação
22
Ciclo de vida de uma Activity
23
Ciclo de vida
Entire Lifetime
Fase entre o início e o fim da activity
Compreende métodos entre onCreate() e onDestroy()
Visible Lifetime
Activity iniciada e na pilha da tarefa interagindo com o usuário ou não.
Compreende os métodos (callbacks):
• onStart(), onStop(), onRestart()
• onPause(), onResume()
Foreground Lifetime
Activity visível e em primeiro interagindo com o usuário
Callbacks:
• onResume(), onPause()24
Botões Home e Back
Botão Home
Coloca a tarefa da activity em background e retorna
para a tela inicial do Android
Botão Back
Remove Activity do topo da pilha da tarefa
Caso a pilha fique vazia retorna para a tela inicial
Exercício 3
Ciclo de vida: 03-ActivityLifeCycle
25
Como chamar Activity's
Para iniciar uma Activity é necessário
Criar uma Intent
Chamar startActivity ou startActivityForResult
Pegar resultado se necessário
Criação da Intent
Na mesma aplicação: new Intent(context, class)
• context - instância da Activity chamadora
• class - <activity a ser iniciada>.class
Nativas do sistema Android: new Intent(action, uri)
• action - uma das ações possiveis
• uri - identificador de recurso
De outra aplicação: Intent.setComponent(...)26
Tabela de possíveis ações (Intent)
Action URI - chamar Uri.parse(uri) Descrição
ACTION_VIEW http://www.gmail.comAbre browser na página
ACTION_VIEW content://com.android.contacts/contacts/1Mostra contato solicitado
ACTION_VIEW geo:0,0?q=Presidente+Vargas,Rio+de+JaneiroBusca no Google Maps
ACTION_CALL tel:12345678 Liga para o número
ACTION_DIAL tel:12345678Apenas disca o número
ACTION_PICK Contacts.CONTENT_URIAbre lista de contatos do celular
27
Como chamar Activity's
Método startActivity(Intent)
Chamar e pegar retorno
Método startActivityForResult(Intent, int requestCode)
Antes de terminar, a activity chamada deve chamar
• setResult(int resultCode)
• setResult(int resultCode, Intent data)
• resultCode - RESULT_CANCELED ou RESULT_OK
• data - dados adicionais a serem retornados
A activity chamadora deve implementar o método
• onActivityResult(int requestCode, int resultCode, Intent data)
28
Como chamar Activity's
Chamar Activity em outra aplicacao:Intent intent = new Intent();
intent.setComponent(new ComponentName(
"com.example.helloworld",
"com.example.helloworld.HelloWorld"));
startActivity(intent);
Chamar Activity nativa do Android:Uri uri = Uri.parse("http://www.gmail.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
29
Passagem de parâmetros para Activity
Métodos da classe Intent para armazenar dados
estendidos
putExtra(String nome, int valor)
putExtra(String nome, int [] valor)
putExtra(String nome, float valor), etc
putExtra(String nome, String valor)
putExtra(String nome, Bundle bundle)
putExtras(Bundle)
putExtras(Intent)
Classe Bundle
mapa de pares chave-valor
30
Passagem de parâmetros para Activity
Para pegar estes dados estendidos
String getStringExtra(String nome)
int getIntExtra(String nome, int defaultValue)
Bundle getExtras()
Notas sobre o argumento nome
Indicam o nome da chave
Recomendável prefixar com o pacote da aplicação para evitar sobrescrever dados
31
Como chamar Activity's e pegar retorno
Chamar Activity (em algum método da Activity
chamadora)
Pegar retorno(método dentro da Activity chamadora)
// REQUEST_CODE é uma constante definida pela activity
// chamadora e identifica esta chamada
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("com.example.hello.Param1", "Hello");
startActivityForResult(intent, REQUEST_CODE);
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE)
if (resultCode == RESULT_OK) {
// pode usar data.getStringExtra(...), etc
}
else (resultCode == RESULT_CANCELED) {
// ação para cancelado
}
}32
Lendo parâmetros e retornando dados
Na Activity chamada:
Pegar parâmetros passados
Retornando dados
33
public void onCreate(Bundle savedInstanceState) {
// ...
Intent intent = this.getIntent();
String nome = ...
String textParam = intent.getStringExtra(nome);
// ...
}
Intent intent = new Intent();
intent.putExtra("chave", "valor");
setResult(RESULT_OK, intent);
finish();
Encerrando Activity's e aplicações
O método finish()
Encerra a Activity que o chamou
Encerramento da aplicação
Quando a última Activity da pilha (Task) da aplicação
termina, a aplicação também é encerrada
34
Criando várias Activity's na aplicação
Necessário declarar no AndroidManifest.xml
Tornar Activity visível para startActivity()
Tornar Activity executável pelo menu do Android
<activity android:name="<nome_da_classe_activy>" />
<activity android:name="nome_da_classe_activy“
android:label="nome no menu">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER“/>
</intent-filter>
</activity>
35
Interfaces gráficas
Visão geral
Classe View
• A classe para componentes visuais
• Desenha na tela através do método onDraw(Canvas)
Widgets
• Componentes visuais simples
• Subclasses de View
• TextView, EditText, ImageView, ProgressBar, etc
Classe ViewGroup e Gerenciadores de Layout
• Container invisível que guarda View's
• Gerencia a disposição destes componentes na tela
• FrameLayout, LinearLayout, etc
Activity's especializadas
• ListActivity, TabActivity, MapActivity 36
Interfaces gráficas - Layouts
Opções para definição do layout
Arquivos XML na pasta /res/layout
Via código da API
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView android:src="@drawable/image" android:id="@+id/imgView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
FrameLayout layout = new FrameLayout(this);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
layout.setLayoutParams(params);
ImageView imgView = new ImageView(this);
params = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
imgView.setLayoutParams(params);
imgView.setImageResource(R.drawable.image);
layout.addView(imgView);
setContentView(layout);37
Como referenciar recursos no XML
Drawable:
android:src="@drawable/nome_drawable"
Identificadores:
Definição: android:id="@+id/identificador"
Referência: android:layout_below="@id/identificador"
Strings:
android:text="@string/nome_string"
Cores:
Forma direta: android:textColor="#RRGGBB"
Forma indireat: android:textColor="@color/nome_cor"
Estilos:
style="@style/nome_estilo“
Tipos de recursos ainda não abordados serão apresentados quando necessário
38
Interfaces gráficas - Layouts
FrameLayout
Componentes são organizados em pilha
O último componente adicionado aparece na frente
Atributos
39
Interfaces gráficas - Layouts
LinearLayout
Componentes são organizados lado a lado
Orientação horizontal (padrão) ou vertical
Atributos
40
Interfaces gráficas - Layouts
TableLayout
Organiza componentes em linhas e colunas
Cada linha é um TableRow (subclase de LinearLayout)
Atributos
41
Interfaces gráficas - Layouts RelativeLayout
Posiciona componentes relativamente a outros
Componentes precisam ser identificados:
• android:id="@+id/id_componente"
Atributos
42
Interfaces gráficas - Layouts
AbsoluteLayout
Permite controlar posição exata dos componentes
Pode gerar péssimos resultados em diferentes telas
Atributos
43
Dimensões
44
Dimensão Descrição
px (pixels) Corresponde aos pixels reais da tela
in (polegadas) Baseado no tamanho físico da tela
mm (milímetros) Baseado no tamanho físico da tela
pt (pontos) 1 pt = 1/72 in. Também baseado no tamanho físico
dp/dip
(Density-independent Pixels)
Unidade abstrata baseada na densidade física da tela, onde 160 dp =
1 in = 25.4 mm. Mantém sempre o mesmo tamanho real,
independente da densidade. Exemplo: 0.5 in = 12.7 mm = 80 dp.
Em 160 dpi, 80 dp = 80 px, já em 240 dpi, 80 dp = 120 px.
Para fazer conversão entre pixels e dps use o seguinte código:DisplayMetrics metrics =
getResources().getDisplayMetrics();
pixels = dps * (metrics.densityDpi / 160.0);
sp
(Scale-independent Pixels)
Semelhante ao dp/dip, mas também escalado pelo tamanho de fonte
nas preferências do usuário. Recomendável para especificar
tamanhos de fonte pois elas serão ajustadas tanto para densidade da
tela quanto para as preferências do usuários.
Outras subclasses de ViewGroup
ListView
Permite rolar conteúdo verticalmente usando ListAdapter
GridView
apresenta o conteúdo na forma de grade
WebView
exibe páginas Web
Gallery e ImageSwitcher
Organiza componentes lado a lado na horizontal
Usado com ImageSwitcher para exibir galeria de imagens
ScrollView
permite rolar conteúdo maior que tela verticalmente
TabHost exibe tela com abas
E outros…45
ListView
Permite rolar conteúdo verticalmente e selecionar
Interface ListAdapter
Faz a ligação entre ListView e seus elementos
Implementado pela classe ArrayAdapter <T>
• new ArrayAdapter<String>(contexto, itemResId, items);
• itemResId pode ser android.R.layout.simple_list_item_1
• items = array de T‟s, neste caso Strings
Atributos
46
ListView
Maneira simplificada de uso:
Coloque um elemento <ListView> com id no XML de layout
Crie um array de elementos de um tipo T
Obtenha o objeto ListView usando Activity.findViewById(id)
Crie um ArrayAdapter passando o array de T‟s
Adicione o ArrayAdapter ao ListView usando ListView.setAdapter(..)
Implemente o método onItemClick(...) de OnItemClickListener
Passe a instância da classe que implementa onItemClick para
ListView.setOnItemClickListener(...)
Parâmetros de OnItemClickListener.onItemClick(...)
AdapterView <?> parent - referência para o ListView
View view - a View dentro de parent que foi clicada
int position - a posição da View no ArrayAdapter, i.e., o índice do
array
int id - o id do elemento, neste caso será igual a position47
GridView
Exibe Views na forma de grade
Todas as colunas têm a mesma largura
Faz scrolling do conteúdo
Atributos
Exercício 9 http://developer.android.com/resources/tutorials/views/hello-gridview.html
48
WebView e WebSettings
WebView
Apresenta uma página de web
Usa o mesmo componente que o navegador do celular
Necessário permissão android.permission.INTERNET
WebSettings
Permite configurar o WebView
• Permite JavaScript, Salvar senhas, etc.
Métodos principais
49
Gallery e ImageSwitcher
Gallery
Mostra lista de componentes com rolagem horizontal
Mantém o componente selecionado sempre no centro
ImageSwitcher
Exibe imagens e cria efeitos ao alterná-las
50
Interfaces gráficas - Recursos
Na pasta values é possível adicionar XML de vários
recursos
Strings
Cores
Dimensões
Array
• listas de inteiros, strings, ou recursos
Estilos
• definir atributos de cada View uma única vez
Temas
• aplicação de estilos a toda activity ou aplicação
51
Interfaces gráficas - Recursos
Strings
Declaração XML: <string name=“appname">Nome Aplicação</string>
Atributos XML: @strings/appname
Identificador: R.string.appname
Texto: getResources().getString(R.string.appname)
Cores
Declaração XML: <color name="red">#FF0000</color>
Atributos XML: @color/red
Identificador: R.color.red
Cor: getResources().getColor(R.color.red)
Dimensões
Declaração XML: <dimen name="spacing">2px</dimen>
Atributos XML: @dimen/spacing
Identificador: R.dimen.spacing
52
Interfaces gráficas - Recursos
Array no XML
No código Java
<integer-array name="iArray">
<item>10</item>
<item>20</item>
<item>30</item>
</integer-array>
<array name="planets">
<item>@drawable/mercurio</item>
<item>@drawable/venus</item>
...
<item>@drawable/plutao</item>
</array>
<string-array name="sArray">
<item>texto1</item>
<item>texto2</item>
...
</string-array>
53
Resources res = getResources();
String [] sa = res.getStringArray(R.array.sArray);
int [] ia = res.getIntArray(R.array.iArray);
int id = R.array.planets;
TypedArray da = res.obtainTypedArray(id);
Drawable dw0 = array.getDrawable(0);
Drawable dw1 = array.getDrawable(1);
Interfaces gráficas - Recursos
Estilos
Temas
<style name="nome_estilo">
<item name="android:textSize">14sp</item>
<item name="android:background">@color/branco</item>
...
</style> <TextView
android:layout_width="wrap_content"
...
style="@style/nome_estilo" />
<style name="nome_estilo"
parent="android:style/Theme.Black">
<item name="android:textSize">14sp</item>
<item name="android:background">@color/branco</item>
...
</style>
54
<application
... android:theme="@android:style/Theme.Back">
<activity ... android:theme="@android:style/Theme.Back">
<application ... android:theme="@style/nome_estilo">
<activity ... android:theme="@style/nome_estilo">
Interfaces gráficas - Exemplo recursos
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="planets">
<item>@drawable/mercurio</item>
<item>@drawable/venus</item>
...
<item>@drawable/plutao</item>
</array>
<string-array name="sarray">
<item>texto1</item>
...
</string-array>
<color name="branco">#FFFFFF</color>
<style name="nome_estilo" parent="android:style/Theme.Black">
<item name="android:textSize">14sp</item>
<item name="android:background">@color/branco</item>
...
</style>
<dimen name="spacing">80dip</dimen>
<drawable name="gray">#888888</drawable>
</resources>
/res/values/recurso.xml
55
Interfaces gráficas - Widgets
56
• View
• TextView
• EditText
• AutoCompleteTextView
• Button
• ImageButton
• CheckBox
• ToggleButton
• RadioButton e RadioGroup
• Spinner (combo)
• AnalogClock
• DigitalClock
• Chronometer
• DatePicker
• TimePicker
• ProgressBar
• RatingBar
• Toast
• Dialogs
• ProgressDialog
• Alertas
• Menus e Submenus
• LayoutInflater
• TabActivity e TabWidget
• ListView e ListActivity
Interfaces gráficas - View
Classe base para qualquer componente gráfico
Atributos
android:padding(Left, Right, Top, Bottom)="2px"
android:background="@color/blue|#RRGGBB"
android:id="@+id/identificador"
android:visibility="visible | invisible | gone"
android:layout_width="wrap_content | match_parent"
android:layout_height="wrap_content | match_parent"
Métodos
invalidate() - invalida View para ser redesenhada
onDraw(Canvas) - responsável por desenhar componente
onKeyDown(...), onKeyUp() - chamados quando uma tecla e
pressione ou solta.
onTouchEvent(...) - quando há movimento por toque na tela
onFocusChange(...)57
Interface gráfica - TextView's
TextView - apresenta texto na tela
EditText - apresenta caixa de edição de texto
AutoCompleteTextView - caixa de edição com auto-complete
Atributos
android:text="@string/..."
android:textColor="@color/..."
android:password="true | false"
android:numeric="integer | signed | decimal"
android:singleLine="true | false"
android:lines - quantas linhas de texto de altura
AutoCompleteTextView
android:completionThreshold="3" - quantidade de caracteres
digitados antes aparecer sugestões
setAdapter(ArrayAdapter) - definir lista de opções 58
TextView's – Exercício 12
Crie um projeto chamado TesteViews
Crie /res/layout/texts.xml
Crie TextView, EditText e
AutoCompleteTextView
EditText - aceita um número indicando
quantos caracteres disparam as
sugestões
AutoCompleteTextView com completionThreshold="1"
Crie /res/values/arrays.xml
Crie um array de nomes iniciando por letras parecidas
Na activity carregue o layout e o array
Configure AutoCompleteTextView para usar o array
Dica: use ArrayAdapter
Detecte quando EditText for alterado e chame
AutoCompleteTextView.setThreashold(int) 59
Button e ImageButton
Permitem criar botões clicáveis na tela
Button - subclasse de TextView
ImageButton - subclasse de ImageView
Setando imagem via Java e XML
imageButton.setImageResource(R.drawable.image_id)
button.setCompoundDrawablesWithIntrinsicBounds(left,top,right,bottom)
<ImageButton android:src="@drawable/..." ... />
<Button android:drawableLeft="@drawable/..."
android:drawableTop="..."
android:drawableRight="..." android:drawableBottom="..." ... />
Detectando clique:
60
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
CheckBox e ToggleButton
Botão de dois estados, que
permite marcar um item na tela
CheckBox
android:text="@string/..."
ToggleButton
android:textOn="@string/..."
android:textOff="@string/..."
Métodos
boolean isChecked() - retorna estado
void toggle() - alterna estado
void setChecked(boolean) - define estado
boolen performClick() - simula click chamando o método onClick(..) do OnClickListener associado
61
RadioButton e RadioGroup
RadioButton
Permite selecionar apenas um item dentro da lista de
um RadioGroup
Exemplo<RadioGroup android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/group1">
<RadioButton android:id="@+id/radioSim"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sim"
android:checked="false" />
<RadioButton android:id="@+id/radioNao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Não"
android:checked="false"/>
</RadioGroup>
62
RadioButton e RadioGroup
Pegar id do RadioButton selecionado
RadioGroup.getCheckedRadioButtonId()
Ou usar o callback onCheckedChanged(...)protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.radiobutton);
final RadioGroup group = (RadioGroup) findViewById(R.id.group1);
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
// Note que: checkedId == group.getCheckedRadioButtonId()
boolean sim = R.id.radioSim == checkedId;
boolean nao = R.id.radioNao == checkedId;
if (sim) {
//
} else if (nao) {
//
}
}
});
}
63
Spinner (combo)
Exibe um componente com texto que ao ser clicado
expande um lista de opções
Exemplo /res/layout/spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Spinner android:id="@+id/comboPlanetas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:prompt="Planetas" />
<ImageView android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
64
Spinner (combo)
Exemplo SpinnerActivity.java (trechos)
Definir a lista de opções e seus layouts
Capturar seleção do usuário
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.spinner_textview,
getResources().getStringArray(R.array.planetNames));
adapter.setDropDownViewResource(R.layout.simple_textview);
Spinner spinner = (Spinner) findViewById(R.id.comboPlanetas);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View v,
int position, long id) {
// ação
}
@Override
public void onNothingSelected(AdapterView<?> arg0) { }
}); 65
Spinner (combo)
Exemplo dos layouts adicionais
/res/layout/spinner_textview.xml
/res/layout/simple_textview.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:textColor="@color/vermelho"
android:padding="2px"
android:textSize="18sp" />
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/azul"
android:textColor="@color/branco"
android:padding="10px"
android:textSize="20sp" />
66
Spinner (combo)
• Exercício: pegar o exemplo, entender e alterar67
Spinner (combo)
Outros métodos
Object getSelectedItem()
• retorna o item selecionado
long getSelectedItemId()
• retorna o id do item selecionado
int getSelectedItemPosition()
• retorna a posição do item selecionado no array fornecido para
ArrayAdapter
void setPrompt(String)
• determina o prompt da lista de opções
void setPromptId(int resId)
• determina o prompt a partir de um R.string.id_string
void setSelection(int position)
• determina o item atualmente selecionado 68
Clock e Chronometer
AnalogClock e DigitalClock
Exibem um relógio digital ou analógico com a hora atual
Chronometer
Exibe um contador de tempo
setBase(long time)
• Define o instante de tempo que o cronometro marca zero
• Usar SystemClock.elapsedRealtime()
start(), stop()
• Disparar ou interromper contagem
setOnChronometerTickListener(Chronometer.OnChronometerTickListener)
• Chamado pelo cronômetro quando seu contador muda69
Clock e Chronometer - Exemplo
/res/layout/clock.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AnalogClock android:id="@+id/analogClock1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<DigitalClock android:id="@+id/digitalClock1"
android:layout_width="match_parent”
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<Chronometer android:id="@+id/chronometer1"
android:layout_width="match_parent“
android:layout_height="wrap_content“
android:gravity="center_horizontal" />
</LinearLayout> 70
Clock e Chronometer - Exemplo
Em uma activity:protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.clock);
Chronometer chrono = (Chronometer)
findViewById(R.id.chronometer1);
chrono.setBase(SystemClock.elapsedRealtime());
chrono.setOnChronometerTickListener(
new OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
long elapsedTime = SystemClock.elapsedRealtime()
- chronometer.getBase();
Log.i(this.getClass().getName(), "" + elapsedTime);
if (elapsedTime > 10000) chronometer.stop();
}
});
chrono.start();
} 71
Escolha de data, horário
TimePicker
Selecionar horário do dia (24h ou AM/PM)
Aceita horas e minutos, mas não segundos
Integer getCurrentHour(), getCurrentMinute()
setIs24HourView(boolean), boolean is24HourView()
setCurrentHour(Integer), setCurrentMinute(Integer)
setOnTimeChangedListener(OnTimeChangedListener)
DatePicker
Selecionar um data (dia, mês, ano)
int getDayOfMonth(), getMonth(), getYear()
init(ano, mês, dia, OnDateChangeListener)
updateDate(ano, mês, dia)72
Escolha de data, horário - Exemplo
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<DatePicker android:id="@+id/dtpicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TimePicker android:id="@+id/tmpicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
73
ProgressBar
Exibe um indicador de progresso de uma operação
Estilos como percentual ou indeterminado
Estilos (atributo style no XML):
Métodos
74
?android:progressBarStyle (padrão) Indeterminado circular de tamanho médio
?android:progressBarStyleSmall Indeterminado circular de tamanho pequeno
?android:progressBarStyleLarge Indeterminado circular de tamanho grande
?android:progressBarStyleHorizontal Barra horizontal indeterminado ou com percentual
setProgress(int) Determina o nível de progresso para uma barra percentual
setSecondaryProgress(int) Determina o nível secundário de progresso para uma barra percentual
boolean isIndeterminate() Retorna true se for indeterminado
ProgressBar - Exemplo
<ProgressBar style="?android:progressBarStyleSmall"
android:layout_width="wrap_content“ android:layout_height="wrap_content" />
<ProgressBar style="?android:progressBarStyle"
android:layout_width="wrap_content“ android:layout_height="wrap_content" />
<ProgressBar style="?android:progressBarStyleLarge"
android:layout_width="wrap_content“ android:layout_height="wrap_content" />
<ProgressBar style="?android:progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true" />
<ProgressBar style="?android:progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:progress="45" />
<ProgressBar style="?android:progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:progress="45" android:secondaryProgress="80" />
75
RatingBar
Mostra uma barra de classificação com estrelas
A barra pode ser interativa ou apenas um indicator
Métodos
Estilos
76
int getNumStars() Retorna quantidade de estrelas totais
float getRating() Retorna a classificação (nota)
float getStepSize() Retorna o tamanho de cada salto das notas
boolean isIndicator() Retorna true se for indicadora ou false se for interativa
void setRating(float rating) Determina a classificação
?android:ratingBarStyle (default) Exibe estrelas grandes e permite alteração da classificação. Pode-se usar isIndicator=“true” para ser apenas um indicador.
?android:ratingBarStyleSmall Exibe estrelas pequenas. Apenas indicador.
?android:ratingBarStyleIndicator Exibe estrelas médias. Apenas indicador.
RatingBar
<RatingBar style="?android:ratingBarStyle"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:numStars="5" android:stepSize=".5" android:rating="2.5" />
<RatingBar style="?android:ratingBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5" android:stepSize=".5"
android:rating="2.5" android:isIndicator="true" />
<RatingBar style="?android:ratingBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="10" android:stepSize=".5"
android:rating="2.5" />
<RatingBar style="?android:ratingBarStyleIndicator"
android:layout_width="wrap_content“
android:layout_height="wrap_content"
android:numStars="6" android:stepSize=".5" android:rating="2.5" />
77
Toast
Exibição de alertas por tempo determinado
Sem interação com usuário
View personalizadaToast toast = new Toast(this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(view);
toast.show();
Apenas mensagem de textoToast.makeText(this, “Mensagem”, Toast.LENGTH_SHORT).show();
78
Dialogs
Usado para abrir janelas na tela
Recomendado usar os métodos a seguir para que a
Activity gerencie o ciclo de vida do Dialog.
79
boolean showDialog(int id, Bundle) Tenta mostrar o Dialog para o id chamando onCreateDialog() se necessário, e em seguida onPrepareDialog(). Retorna true em caso de sucesso.
void dismissDialog(int id) Fecha o Dialog criado por showDialog() com o id especificado. Se nenhum Dialog com o id tiver sido mostrado lança IllegalArgumentException.
void removeDialog(int id) Remove qualquer referência para o Dialog especificado. Caso esteja sendo exibido, ele é fechado antes.
Dialog onCreateDialog (id, Bundle) Callback chamado quando um Dialog deve ser criado para o id especificado. Implementado pelo desenvolver.
void onPrepareDialog(id, Dialog, Bundle)
Callback que permite que o Dialog seja preparado antes de ser apresentado. Por exemplo, configurar alguma varíavel.
ProgressDialog
Janela para mostrar o progresso de uma operação
Como usar sem os métodos anteriores
Mostrar o Dialog• dialog = ProgressDialog.show(contexto, titulo, msg, bool indet);
• indet = se é indeterminado ou não (percentual)
Feche o Dialog, quando concluir• dialog.dismiss();
Alterar o progresso (se indet = true)• dialog.setProgress(int v)
• v entre 0 e 10000
80
AlertDialog
Exibe um alerta ao usuário
Conteúdo e botões de escolha personalizados
Classe AlertDialog.Builder para construir alertas
81
setIcon(int resId) Determina o ícone a ser mostrado
setTitle(String) Determina o título do alerta
setMessage(String) Mensagem a ser mostrada no interior do alerta
setPositiveButton(String, listener) Texto do botão positivo (Sim, Yes, Ok, etc)
setNegativeButton(String, listener) Texto do botão negativo (Não, No, etc)
setItems(String [], listener) Items a serem mostrados para usuário selecionar
setSingleChoiceItems(String [], int checkedItem, listener)
Determina lista de RadioButtons a serem mostrados ao usuário
setCancelable(boolean) Alerta cancelável ou não. Cancelável significa que usuário não pode fechar com botão voltar.
show() Exibe o alerta para o usuário
cancel() Cancela o alerta
Nota: listener é uma instância de DialogInterface.OnClickListener
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", ...);
builder.setNegativeButton("No“, ...);
AlertDialog alert = builder.create();
AlertDialog - Exemplos
82
CharSequence[] items = {"Red", "Green", "Blue"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items,
new DialogInterface.OnClickListener() { ... } );
builder.show();
Menus e Submenus
É possível criar menus e um submenu para cada menu
São exibidos quando a tecla Menu é apertada
Devem ser criados em Activity.onCreateOptionsMenu()public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem item = menu.add(0, NOVO, 0, “Novo”);
item = menu.add(0, ABRIR, 0, “Abrir”);
item = menu.add(0, SALVAR, 0, “Salvar”);
SubMenu submenu = menu.addSubMenu(“Outros”);
item = submenu.add(0, PESQUISAR, 0, “Pesquisar”);
item = submenu.add(0, LIMPAR, 0, “Limpar”);
item = submenu.add(0, SAIR, 0, “Sair”);
return true;
}
As constantes ABRIR, SALVAR, etc são definidas pelo
desenvolvedor
Retorne true para que o menu seja mostrado 83
MenuItems
Representa um item selecionável de menu
Métodos
Quando um item é selecionado pelo usuário o método
boolean onOptionsItemSelected (MenuItem)
é chamado
Compare o id usando MenuItem.getItemId()
84
setEnabled(boolean) Determina se o item é selecionável ou não
setVisible(boolean) Determina se o item é visível ou não
setTitle(int)setTitle(String)
Define o texto que aparece no item
setIcon(int)setIcon(Drawable)
Define o ícone que aparece no item
int getItemId() Retorna o id do item conforme Menu.add()
LayoutInflater
Constrói hierarquia de uma View a partir de um layout
ExemploLayoutInflater inflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(resId, null);
// Agora é possível passar para um Toast e exibir na tela
Toast toast = new Toast(this);
toast.setView(view);
toast.setDuration(Toast.LENGTH_SHORT);
toast.show();
85
ListActivity
Cria uma activity que mostra uma lista de itens
Simplifica codificação Java
Evita criação de XML de layout
Apenas listas personalizadas precisariam
Métodos adicionais em relação à activity:
86
void setListAdapter(ListAdapter) Determina o adaptador que fornece os items e layout
ListAdapter getListAdapter() Retorna o adaptador atual
ListView getListView() Retorna o objeto ListView utilizado pela ListActivity
void onListItemClick(ListView, View, int pos, long id)
Callback chamado quando um item da lista é selecionado pelo usuário. A parâmetro pos indica a posição do item na lista de item do adaptador.
TabActivity
Usada para criar telas com abas
Cada aba fica associada a uma activity ou view
Etapas de uso:
Herde de TabActivity
No método onCreate()
• Obtenha o objeto TabHost usando getTabHost()
• Para cada aba a ser criada
• Obtenha um objeto TabSpec chamando
TabHost.newTabSpec(String tag)
• TabSpec.setIndicator() para definir o titulo e/ou imagem
• TabSpec.setContent() para definir o conteúdo da aba
• TabHost.addTab(TabSpec) para adicionar a aba
87
TabActivity
A classe TabSpec possui variantes em seus métodos:
88
setContent(int viewId) Especifica o id da View que deve ser usada como o conteúdo da aba.
setContent(Intent) Especifica a Intent que deve ser usada para iniciar uma activity que será o conteúdo da aba.
setContent(TabContentFactory) Especifica um TabHost.TabContentFactory que será responsável por criar o conteúdo da aba.
setIndicator(String) Especifica apenas um texto como indicador da aba.
setIndicator(View) Especifica uma View como indicador da aba.
setIndicator(String, Drawable) Especifica um texto e um ícone como indicador da aba.
Agenda das próximas aulas
Intent filter
BroadcastReceiver, Services e Notification
AlarmManager e Handler
Banco de Dados e ContentProvider
Mapas e GPS
Sockets e Web Services
Projeto
89