Anda di halaman 1dari 134

App Alunos

Definies de Projeto
Implementao de uma app para
Manipulao de Dados de Alunos
Em linhas gerais, a app consiste em:
Manter dados de alunos;
Entrar em contato com alunos;
Trocar dados com um servidor WEB; e
Compartilhar contedo em mdias ;
Funcionalidade da App
CADASTRO DE ALUNOS
Comeando pelo Cadastro
Neste requisito da nossa App, precisamos de:
Uma tela para listar Alunos
Outra para cadastrar ou alterar dados de Alunos
A excluso deve ocorrer com a seleo de um aluno
na tela de listagem
Tela Inicial: Listagem dos
alunos
Componentes:
Nome do aluno que se
deseja incluir na listagem
EditText
Boto para adicionar o nome
do aluno lista.
Button
Lista com nomes dos alunos.
ListView, que recebe uma
coleo de Objetos e
lista seus dados
Listaalunoslayout.xml

Campo de Texto
id=edNomeListagem
Listaalunoslayout.xml

Componente Boto
id=brAddListagem
Listaalunoslayout.xml

Componente Lista
para exibir alunos
id=lvListagem
Tela Inicial: Listagem dos
alunos
Observe:
Componentes EditText e
Button esto visveis
No entanto, a ListView no
aparece
Texto nome do
aluno e o boto Isso ocorre porque nossa lista
esto visveis ainda est vazia

Lista alunos ainda


vazia
Controladores a as regras de
negcio
Os layouts xml (telas) esto associadas a
classes Java (controladores), responsveis
pela implementao de suas regras de
negcio
listaalunoslayou.xml controlada pela classe
ListaAlunosActivity.java
A classe de controle deve capturar os
eventos e componentes da tela e
implementar as regras de negcio
necessrias s funcionalidades da App
Atributos

Componentes da
tela acessados pela
classe de controle

Coleo de alunos

Mtodo para inicializar


os atributos
Inicializao dos Atributos

Associa a tela (layout)


ao controlador (java)

Captura o click no Associa componentes


boto da View a atributos da
Activity
Inicializao dos Atributos

Implementao annima do
OnClickListener
Observaes com relao ao
ListView
preciso inicializar a coleo de alunos e
exibir os nomes na ListView
Porm, ListView pode assumir diversos
formatos de visualizao
ListView precisa da ajuda de algum que saiba
como organizar os dados na tela
ListView precisa do apoio de um Adaptador, que
saiba converter objetos Java para componentes de
Tela: Adapter.
ListView com Layouts
diferentes
Novos atributos

Declarao dos novos


atributos

Converte listas e
vetores em View

Define o layout que o


Adapter usar
Passo a Passo
Associar objetos java a componentes de tela
Criar o adaptador que exibe List<Strings>
Inicializar:
A coleo de nomes de Alunos(List<Strings>);
O adaptador (ArrayAdapter<String>); e
A ListView que vai exibir os nomes na tela;
Por fim, associar o adaptador ListView
Inicializao da ListView
Passo a passo
Atualizar o evento de clique do boto
Adicionar Aluno;
Adicionar o nome digitado no campo edNome
coleo listaAlunos;
Limpar o contedo do campo edNome; e
Atualizar o contedo da ListView
Evento de click no boto

Implementao do
Evento de clique

Adiciona o nome
informado em edNome
na coleo

Limpa
contedo
de edNome

Atualiza o contedo
do ListView
Conferindo o Resultado
Inclua alguns nomes
possvel agregar mais alguma
funcionalidade?
Que tal exibir um alerta com o nome do
aluno, quando do clique em um nome da
lista?
Evento de click no ListView
Assim como Button, a ListView possui o
evento de click. Porm, so dois tipos de
click:
Click curto, quando o usurio clica em um item
da ListView; e
Click Longo, quando o usurio clica e segura um
item da ListView ;
Vamos implementar os eventos de clique
Longo e Simples no final do mtodo
onCreate()
Cliques da ListView
Implementao do
Evento de clique
simples

Implementao do
Evento de clique
longo

true: no executa o
click simples
false: executa o click
simples
E quando giramos o
dispositivo?

Depois do giro:
Lista Vazia!

Todos os componentes
Quando giramos o retornam ao estado
dispositivo, o Android inicial
invoca novamente o
mtodo onCreate() da
Activity
Persistindo o estado da
Activity
Podemos armazenar o estado da app antes dela ser
pausada, parada ou destruda
Utilizamos Mtodos de Callback, que so mtodos
usados quando o cliente requer um retorno do
servidor, mas no quer ficar bloqueado, esperando.
onSaveInstanceState(): chamado quando o
Android vai destruir a Activity, mas sabe que vai
restaur-la depois;
No chamado quando usurio clica em Back
onRestoreInstanceState(): Chamado antes da
Activity destruda ser chamada pelo usurio
Persistindo o estado da
Activity
Persistindo o estado da
Activity
Para salvar o estado da Activity, usamos o objeto
Bundle, gerenciado pelo Android
O Bundle empacota um java.util.Map
O Objeto Bundle passado pelo Android aos mtodos
onCreate(),
onSaveInstanceState() e
onRestoreInstanceState()
Podemos utilizar o Map empacotado no Bundle para
armazenar o estado da nossa App
Passo a Passo
Na classe ListaAlunosActivity, defina rduas
constantes:
String TAG = "CADASTRO_ALUNO" Usada para
registro de mensagens de LOG no Logcat
String ALUNOS_KEY = "LISTA" Usada como
Chave para o Map do Objeto Bundle;
Implementar os mtodos
onSaveInstanceState() e
onRestoreInstanceState()
Atualizar o mtodo onCreate(), para tentar
recuperar a chave ALUNOS_KEY do Bundle
Salvar estado da Activity
Incluir novas constantes:
Salvar estado da Activity
Incluir o novo mtodo para salvar:
Restaurar estado da Activity
Aps salvar, incluir o mtodo para restaurar:
Agora quando giramos o
dispositivo...

Depois do giro,
lista continua
preenchida
Resultado exibido no LogCat
Pelas mensagens de log, verificamos a lista
de alunos sendo salva e recuperada do
objeto Bundle
MELHORANDO A APP
Incrementando o cadastro
Precisamos Cadastrar e Alterar os dados do
aluno
Dados: Foto, Nome, Fone, Endereo, Site, E-mail
e Nota
Como o dispositivo possui uma tela limitada,
criaremos uma nova Activity (tela) para
edio dos dados dos alunos.
Tela de Cadastro de Alunos
Formulrio para cadastro
de alunos
Novos componentes:
ImageView: para exibir a
foto o usurio, armazenada
no prprio device;
SeekBar: para que o
usurio escolha uma nota,
dentro de um intervalo
formulario.xml
AndroidManifest.xml
AndroidManifest.xml

Nossa
app
AndroidManifest.xml

Tela de
listagem
AndroidManifest.xml

Define
ListaAlunoActivity como
tela inicial da app
AndroidManifest.xml

Tela
formulrio
Alterando a tela inicial para
formulrio

Tela
Seta formulrio
como pgina inicial
formulrio
Antes de prosseguir...
Torne novamente a ListaAlunosActivity a tela
inicial da nossa aplicao:

Tela de
listagem
Navegao entre telas
Com duas telas na App, necessrio algum
mecanismo para navegar entre elas
Para isso, comum o uso menus. Toda
Activity sabe tratar menus, basta sobrescrever
o mtodo:
onCreateOptionsMenu(Menu menu), que recebe
do Android um menu vazio
O prprio Android se encarrega de encaixar o
menu na tela
Para exibir o menu da App:
Basta clicar no Boto Menu do device
Estratgia para definio de
Menus
Apesar da possibilidade de definio de Menus no
cdigo Java, mais comum o uso de arquivos XML:
<item
android:id="@+id/menu_novo"
android:icon="@drawable/ic_novo"
android:showAsAction="always"
android:title="Novo"/>
<item
android:id="@+id/menu_mapa"
android:icon="@drawable/ic_mapa"
android:showAsAction="always"
android:title="Mapa"/>

O mtodo Activity.onCreateOptionsMenu retorna true


para indicar que o menu deve ser exibido na tela
Estratgia para definio de
Menus
O Android precisa ler o XML com itens do menu e criar
objetos do tipo View, a partir das tags
Essa a especialidades dos Inflaters
O MenuInflater especialista em carregar XML de menu
O mtodo Activity.onCreateOptionsMenu(Menu menu) nos
oferece um objeto Menu vazio, que pode ser utilizado pelo
MenuInflater para carregar um XML com itens do menu
O mtodo Activity.getMenuInflater() nos devolve um
MenuInflater
Inflater.inflate(): l um XML e carrega um Menu
Menu principal
Altere o nome da App no arquivo strings.xml
Menu principal
Crie o arquivo XML: res/menu/menu_principal:

comum que apenas


dois Itens do Menu
fiquem visveis e os
demais, ocultos
Menu principal (cont...)
Menu Principal
Altere o mtodo onCreateOptionsMenu(Menu
menu) da classe ListaAlunosActivity:
Executando a App...
Eventos de click
Para monitorar o click, precisaremos implementar o mtodo
onOptionsItemSelected da ListaAlunosActivity
Por enquanto, exibiremos apenas uma mensagem num
Toast, quando o usurio clicar no item NOVO:
Executando
Navegao entre telas da
nossa App
Configurada a ActionBar, podemos
incrementar ainda mais nossa App.
Vamos fazer com que o clique no menu
NOVO faa surgir a tela de Formulrio
Usamos objetos do tipo Intent, que recebem um
contexto e uma Activity que deve ser exibida
Depois de configurada nossa Inteno,
podemos iniciar a nova tela (startActivity)
Abrir formulrio
No mtodo de clique da ListaAlunosActivity:
Fechar o Formulrio
ARMAZENANDO DO DADOS
EM BD
MVC em Android

Entrada
de dados

Exibir tela Tela.atualizarVisao() modelo.atualizaEstado()

modelo.getEstado()

Notificao de
mudanas
Persistncia com SQLite
A tela de Listagem da App permite o cadastro do
nome dos alunos e os exibe em uma ListView
Porm, surgem alguns problemas nessa abordagem:
Os dados so perdidos quando a App destruda
Precisamos de outros dados para o Aluno
Como resposta, poderamos:
Persistir os dados em um Bando de Dados
Usar a tela de Formulrio para cadastro e alterao de
dados do Aluno
Criar um bean Aluno
No se esquea dos mtodos get/set
Pensando na arquitetura...
no mtodo onCreate() da Activity, temos de
povoar um bean Aluno com dados da tela:
Ainda, pensando na
arquitetura
A complexidade da Activity aumenta, medida que
novas funcionalidades vo sendo implementadas
uma boa prtica de programao isolar pequenas
responsabilidades em outras classes.
Assim, a Activity passa a realizar o seu trabalho
interagindo com pequenos especialistas
Neste cenrio, possvel implementar o padro de
projeto View Helper, que define a criao de classes
especialistas em ext rair e tratar dados das telas
O Helper

Atributos que
representam os
dados da tela

Atributo que
armazena a
referncia a um
Aluno
O Helper (cont.)
O construtor
recebe um
FormularioActivity
Mtodo construtor que recebe um
FormularioActivity

Associa atributos
do Helper a
Criao do objeto
componentes da
Aluno
tela
O Helper (final)
Retorna Aluno com
dados vindos da tela

Seta os atributos
do aluno nos
campos da tela
Retorna referncia para
um objeto Aluno
Usando o Helper
Agora que aclasse FormularioHelper est
pronta, podemos utiliz-la na classe de
controle FormularioActivity
Para isso, preciso:
criar um atributo FormularioHelper
criar um objeto Helper no mtodo onCreate()
utilizar os dados do Aluno em qualquer mtodo
que necessite desse objeto (reuso)
Nessa App, vamos usar o click do boto para
exibir o nome do aluno
Usando o Helper na View
Definio do novo
atributo
FormularioHelper

Inicializao do helper,
passando uma
referncia para o
objeto atual(this)

Pedindo do Helper
uma referncia a
Aluno Usando o novo objeto
Aluno
Hora de persistir os dados
O ViewHelper extrai os dados de Aluno da tela
Vamos armazenar esses dados em um Banco de
Dados relacional SQLite
Para converter Objetos Java em Relaes do banco
de dados, vamos utilizar o padro de projeto DAO
DAO (Data Access Object) define que, para cada
tabela do banco, criamos uma classe de persitncia
Ex: para a tabela Aluno, teremos uma classe AlunoDAO,
responsvel pelo CRUD do aluno
AlunoDAO
Crie a classe para persistir dados do Aluno:

Filha da classe de
persistncia
Classe DAO para SQLiteOpenHelper
persistir dados de
Aluno
Usando o SQLite
Controle de verso do BD
Criao da Tabela
Em AlunoDAO, crie o mtodo onCreate():
Atualizao da Tabela
Na classe AlunoDAO, crie o mtodo onUpdate():
AlunoDAO.cadastrar()
Atualizao da
FormularioActivity
Agora que a camada de modelo est preparada para
o cadastro do aluno, podemos atualizar nossa tela
de formulrio;
No click do boto de Salvar, vamos:
Pedir um objeto Aluno do Helper;
Abrir uma conexo com BD, criando AlunoDAO;
Cadastrar o novo Aluno no BD; e
Fechar a conexo com o banco de dados
Boto Salvar
Para ver o que foi salvo...
Para visualizar os dados do BD, precisamos
atualizar as camadas de viso, controle e modelo
Na camada de modelo,
criar o mtodo listar()
Nas camadas de viso e controle:
Remover o EditText e Button
Na camada de controle,
alterar o mtodo onCreate() da ListaAlunosActivity para
chamar o mtodo listar() da camada de modelo e apagar
os mtodos:
onSaveInstanceState() e onRestoreInstanceState()
AlunoDAO.listar()
Incio no mtodo para recuperar um Alunos
do BD:
AlunoDAO.listar() (final)
Criar mtodo Aluno.toString()
Atualizao da Tela inicial
Alterar o arquivo: /res/layout/listaalunoslayout.xml
Deixar apenas a ListView
Atualizar camada de controle
No mtodo onCreate() da ListaAlunosActivity,
deixar apenas a associao da ListView
Mudana de tipos
Nossa coleo de Alunos deve deixar de ser
List<String> e se tornar List<Aluno>
Alterar, tambm, o tipo do ArrayAdapter
Carga dos dados
Na ListaAlunosActivity, criar o mtodo carregarLista() para
acesso ao DAO e carregar a coleo de Alunos
Carga no OnResume()
Na classe ListaAlunosActivity, criar o mtodo
onResume()
Nesse mtodo, fazer a chamada a carregarLista()
Executando App
Completando o sistema
Para completar o cadastro de alunos, falta
implementar as rotinas de:
Alterar; e
Excluir Alunos
Para alterar um registro, comum o uso de
um click curto, indicando sua seleo
Na excluso, comum um click longo, que
abre um pequeno menu, para selecionar uma
ao
EXCLUSO DE CLIENTE
Menu de Contexto
No Android, h o ContextMenu, que abre um menu
exclusivo para um item da lista
Para avisar ao Android que a ListView possui um
menu de contexto, preciso marc-la:
registerForContextMenu()
Criar um arquivo .xml para descrever os itens que
devem ser exibidos no ContextMenu
No mtodo onCreateContextMenu() da Activity, usar
um Inflater para inflar as opes do menu:
Opes: Ligar, Enviar SMS, Achar no Mapa, Navegar no
site, Enviar E-mail e Deletar, etc...
Atualizao das Strings
Incluir novas chaves em /res/values/strings.xml
Criando o Menu de Contexto
Na pasta /res/menu,
criar um Android XML
File
Informe o nome do
novo arquivo:
menu_contexto
AlunoDAO.deletar()
Novo Atributo
Na classe ListaAlunosActivity, incluir um
atributo para marcar o aluno selecionado no
Click Longo da ListView
Atualizao do onCreate
Atualize o mtodo ListaAlunosActivity.onCreate():

No consome o Click Curto,


para
que o ContextMenu seja
exibido
Confirmao de excluso
ContextMenu da Activity
Executando a App
Executando a App
Resultado...
EDITANDO DADOS DO ALUNO
Edio dos dados do aluno
Criar a funcionalidade para alterar os dados de um
aluno
Ao acionar o click longo da ListView, a App exibe um
menu de contexto, com possveis aes para o
Aluno
No click curto, chamar a tela de formulrio,
carregada com os dados do aluno selecionado
Como enviar o aluno selecionado na
ListaAlunosActivity para FormularioActivity?
Vamos usar Intents para enviar objetos Serializveis de
uma Activity para outra
Passo a passo
Para realizar a edio de dados do Aluno,
precisamos:
Tornar o bean Aluno Serializvel
Implementar o mtodo AlunoDAO.alterar(Aluno);
Enviar um objeto Aluno da ListaAlunosActivity
para FormularioActivity;
Carregar o formulrio com os dados do Aluno; e
Verificar se necessrio cadastrar ou alterar os
dados do Aluno;
Aluno Serializvel
AlunoDAO.alterar()
Valores que sero
enviados para o BD

Valores dos
parmetros
da clusula
WHERE

Atualizao dos
dados do Aluno
Transio de telas
Na ListaAlunosActivity, atualize o click da ListView:
Inteno de navegar
de ListaAlunosActivity
para FormularioActivity

Recupera o
aluno
selecionado

Compartilha o objeto
Inicia a tela de Aluno com a nova tela
Formulrio
Atualizar formulrio
Adicione o mtodo setAluno(Aluno) em FormularioHelper
Dados na tela
Atualize o mtodo FormularioActivity.onCreate():

Recupera o objeto
Aluno enviado pela
ListaAlunosActivity
Alterar ou Cadastrar?
Atualize o click do boto salvar da FormularioActivity
Execute a App
Permisses de Acesso
Vez por outra, pode ser necessrio que nossa App
acesse recursos do prprio device, como:
Cmera, Arquivos, Internet etc
Para que o acesso seja autorizado, precisamos
registrar esses interesses no AndroidManifest.xml
Incluir a tag uses-permission e informar o valor para
sua propriedade android:name
Exemplo para solicitao de acesso cmera:
<uses-permission
android:name="android.permission.CAMERA"/>
Permisses de Acesso
Inclua as solicitaes de Acesso entre as tags:
<uses-sdk /> e <application>
Permisses de Acesso
Inclua as seguintes permisses no AndroidManifest.xml:
Intents implcitas
Em nossa aplicao, precisamos realizar uma
chamada telefnica para um aluno;
O Android nos oferece duas estratgias para isso:
acessar o telefone em baixo nvel e controlar todo o ciclo
de vida da chamada (pode no ser uma boa ideia)
usar uma Intent que j sabe fazer ligaes telefnicas:
Intent.ACTION_CALL
O Android oferece vrias Activities prontas para
acesso a funcionalidades do device
Aes do ContextMenu
Altere o mtodo onContextItemSelected da
ListaAlunos:
Aes do ContextMenu
Altere o mtodo onContextItemSelected da ListaAlunos:
Inclua opes para ver Aluno no Mapa e Navegar no site

Padro para
Busca em mapa

Item que Navega


no site do Aluno
Aes do ContextMenu
Altere o mtodo onContextItemSelected da ListaAlunos:
ltima opo: Enviar e-mail para aluno.
Teste do envio de e-mail

Click LONGO
Teste do envio de e-mail

Selecione o item
Enviar E-mail
Teste do envio de e-mail

Escolha a
Forma de
Envio

Escolha a
Forma de
Envio
Completando a App
Para completar o cadastro do aluno,
queremos usar a cmera para capturar sua
foto;
O arquivo .jpeg da foto ficar armazenado no
device
No SQLite, guardaremos apenas o caminho
para o arquivo fsico
Na hora de carregar a foto, recupera-se o
caminho armazenado no SQLite, acessa o
device e faz-se a carga a imagem na tela.
Recordando...
No Android, tambm existem as classes tradicionais
de arquivos:
FileInputStream e FileOutputStream;
A Activity tem mtodos para gerar esses objetos:
FileInputStream stream = openFileInput("arquivo.txt");
E se voc precisar trabalhar com memria externa?
File diretorio = Enviroment.getExternalStorageDirectory()
Devolve um diretrio externo, provavelmente, um
sdcard
Usando a Cmera
O android nos oferece duas formas de
manipular cmera, assim como ocorreu com a
Chamada Telefnica
usar e controlar todo o ciclo de vida e opes do
uso da cmera, como, por exemplo, habilita flash
e controlar a entrada de luz
chamar uma Activity especialista no tratamento da
cmera. Essa Activity recebe como parmetro, o
local para salvar a foto capturada.
Parece que a 2a alternativa mais simples.
Carregar jpeg com a foto
Crie
Converte um
Arquivooem
mtodo
um FormularioHelper.carregarFoto()
Objeto JAVA

Definio de uma
Imagem reduzida

Atualiza o
atributo foto
do Aluno

Atualiza a imagem
na Tela
Alterar o FormularioHelper
para contemplar a foto
Chamando a cmera
Para acessar a cmera, vamos seguir a estratgia
de chamar uma Intent implcita, especialista em
cmera:
Intent irParaCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

Podemos informar o local para salvar a foto:


irParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, localFoto);

E esperar o retorno, com nome do arquivo gerado.


Para isso, informamos um cdigo para a requisio
(requestCode), comumente associado a uma
constante:
startActivityForResult(irParaCamera, FAZER_FOTO);
Chamando a cmera (cont.)
O retorno do mtodo startActivityForResult() vem no
callback method onActivityResult()
@Override
protected void onActivityResult(
int requestCode, int resultCode, Intent data) { }

O requestCode == FAZER_FOTO
J o resultCode pode ser:
RESULT_OK: ocorreu tudo bem. :-)
RESULT_CANCELED: em caso de problemas ou
cancelamento :-(
Novas mudanas no
formulrio
Na classe FormularioActivity, inclua novos atributos
para lidar com a cmera:
Click da Imagem
No mtodo FormularioActivity.onCreate(),
implemente o click da foto:
Click da Imagem
No mtodo FormularioActivity.onCreate(),
implemente o click da foto: Local em que
a Foto ser
armazenada

Referncia para
o Local de
armazenamento
Intent Implcita
para uso da
cmera

Chamando a
Cmera
Click da Imagem
No mtodo FormularioActivity.onCreate(),
implemente o click da foto:

Inicia a Activity da
Cmera. A resposta
lanada no mtodo de
Callback Parmetro: local de
onActivityResult() armazenamento

Parmetro: local de
armazenamento Chamando a
Cmera
Verificao do resultado
Na ForumlarioActivity, crie o mtodo onActivityResult(), para
verificar o resultado retornado pela Intent da Cmera:

Tratamento
da resposta
da Intent da
cmera
Testando... Capture a
imagem
Click na
ImageView

Salve a
imagem
Desafio...
Quando cadastramos um aluno, o formulrio est
vazio;
Se clicar na foto, a cmera chamada;
A foto , ento, salva no dispositivo;
Assim, exibida na tela de formulrio;
Porm, se girarmos a tela, o que acontece?
Isso mesmo, a foto perdida.
Como Resolver esse problema, recorrente em
Android Apps?
Ideia fantstica: tente usar o Bundle.

Anda mungkin juga menyukai