89
Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro Fabrício Firmino de Faria

Configurando o eclipse para programação Android

Embed Size (px)

Citation preview

Page 1: Configurando o eclipse para programação Android

Curso de Android

Fevereiro de 2011

Cristiano Expedito Ribeiro

Fabrício Firmino de Faria

Page 2: Configurando o eclipse para programação Android

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

Page 3: Configurando o eclipse para programação Android

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

Page 4: Configurando o eclipse para programação Android

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

Page 5: Configurando o eclipse para programação Android

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

Page 6: Configurando o eclipse para programação Android

Download das plataformas

6

Page 7: Configurando o eclipse para programação Android

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

Page 8: Configurando o eclipse para programação Android

Criação do AVD

8

Page 9: Configurando o eclipse para programação Android

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

Page 10: Configurando o eclipse para programação Android

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

Page 11: Configurando o eclipse para programação Android

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

Page 12: Configurando o eclipse para programação Android

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

Page 13: Configurando o eclipse para programação Android

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

Page 14: Configurando o eclipse para programação Android

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

Page 15: Configurando o eclipse para programação Android

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

Page 16: Configurando o eclipse para programação Android

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

Page 17: Configurando o eclipse para programação Android

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

Page 18: Configurando o eclipse para programação Android

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

Page 19: Configurando o eclipse para programação Android

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

Page 20: Configurando o eclipse para programação Android

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

Page 21: Configurando o eclipse para programação Android

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.

Page 22: Configurando o eclipse para programação Android

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

Page 23: Configurando o eclipse para programação Android

Ciclo de vida de uma Activity

23

Page 24: Configurando o eclipse para programação Android

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

Page 25: Configurando o eclipse para programação Android

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

Page 26: Configurando o eclipse para programação Android

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

Page 27: Configurando o eclipse para programação Android

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

Page 28: Configurando o eclipse para programação Android

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

Page 29: Configurando o eclipse para programação Android

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

Page 30: Configurando o eclipse para programação Android

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

Page 31: Configurando o eclipse para programação Android

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

Page 32: Configurando o eclipse para programação Android

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

Page 33: Configurando o eclipse para programação Android

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();

Page 34: Configurando o eclipse para programação Android

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

Page 35: Configurando o eclipse para programação Android

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

Page 36: Configurando o eclipse para programação Android

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

Page 37: Configurando o eclipse para programação Android

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

Page 38: Configurando o eclipse para programação Android

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

Page 39: Configurando o eclipse para programação Android

Interfaces gráficas - Layouts

FrameLayout

Componentes são organizados em pilha

O último componente adicionado aparece na frente

Atributos

39

Page 40: Configurando o eclipse para programação Android

Interfaces gráficas - Layouts

LinearLayout

Componentes são organizados lado a lado

Orientação horizontal (padrão) ou vertical

Atributos

40

Page 41: Configurando o eclipse para programação Android

Interfaces gráficas - Layouts

TableLayout

Organiza componentes em linhas e colunas

Cada linha é um TableRow (subclase de LinearLayout)

Atributos

41

Page 42: Configurando o eclipse para programação Android

Interfaces gráficas - Layouts RelativeLayout

Posiciona componentes relativamente a outros

Componentes precisam ser identificados:

• android:id="@+id/id_componente"

Atributos

42

Page 43: Configurando o eclipse para programação Android

Interfaces gráficas - Layouts

AbsoluteLayout

Permite controlar posição exata dos componentes

Pode gerar péssimos resultados em diferentes telas

Atributos

43

Page 44: Configurando o eclipse para programação Android

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.

Page 45: Configurando o eclipse para programação Android

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

Page 46: Configurando o eclipse para programação Android

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

Page 47: Configurando o eclipse para programação Android

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

Page 48: Configurando o eclipse para programação Android

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

Page 49: Configurando o eclipse para programação Android

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

Page 50: Configurando o eclipse para programação Android

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

Page 51: Configurando o eclipse para programação Android

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

Page 52: Configurando o eclipse para programação Android

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

Page 53: Configurando o eclipse para programação Android

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);

Page 54: Configurando o eclipse para programação Android

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

Page 55: Configurando o eclipse para programação Android

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

Page 56: Configurando o eclipse para programação Android

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

Page 57: Configurando o eclipse para programação Android

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

Page 58: Configurando o eclipse para programação Android

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

Page 59: Configurando o eclipse para programação Android

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

Page 60: Configurando o eclipse para programação Android

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

}

});

Page 61: Configurando o eclipse para programação Android

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

Page 62: Configurando o eclipse para programação Android

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

Page 63: Configurando o eclipse para programação Android

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

Page 64: Configurando o eclipse para programação Android

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

Page 65: Configurando o eclipse para programação Android

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

Page 66: Configurando o eclipse para programação Android

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

Page 67: Configurando o eclipse para programação Android

Spinner (combo)

• Exercício: pegar o exemplo, entender e alterar67

Page 68: Configurando o eclipse para programação Android

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

Page 69: Configurando o eclipse para programação Android

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

Page 70: Configurando o eclipse para programação Android

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

Page 71: Configurando o eclipse para programação Android

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

Page 72: Configurando o eclipse para programação Android

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

Page 73: Configurando o eclipse para programação Android

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

Page 74: Configurando o eclipse para programação Android

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

Page 75: Configurando o eclipse para programação Android

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

Page 76: Configurando o eclipse para programação Android

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.

Page 77: Configurando o eclipse para programação Android

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

Page 78: Configurando o eclipse para programação Android

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

Page 79: Configurando o eclipse para programação Android

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.

Page 80: Configurando o eclipse para programação Android

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

Page 81: Configurando o eclipse para programação Android

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

Page 82: Configurando o eclipse para programação Android

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();

Page 83: Configurando o eclipse para programação Android

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

Page 84: Configurando o eclipse para programação Android

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()

Page 85: Configurando o eclipse para programação Android

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

Page 86: Configurando o eclipse para programação Android

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.

Page 87: Configurando o eclipse para programação Android

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

Page 88: Configurando o eclipse para programação Android

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.

Page 89: Configurando o eclipse para programação Android

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