1. Apresentação introdutória da
plataforma Android
Por: Júlio Cesar Bueno Cotta
Mestrando em Ciência da Computação UFABC
Graduado em Ciência da Computação UFV
2. Sumário
○ Introdução
■ Material didático
○ O que interessa!
○ Preparando o ambiente...
■ Antes de começar a programar...
■ Configurando o Eclipse
○ Finalmente..Hello World!
○ NotePad V1
○ NotePad V2
○ NotePad V3
3. Aviso
Atenção, muitos códigos fonte serão mostrados nesta
apresentação, não utilize Ctrl + C e Ctrl + V!
Escreva-os, você está aprendendo, não pode ter preguiça!
E afinal de contas são poucas linhas..por slide. :-D
5. Material didático
Muito material na internet sobre Android:
● Para usuários;
● Para desenvolvedores;
O que interessa para nos:
http://developer.android.com/
Inglês é importante!
6. Material didático
Mas se Inglês não é seu forte, temos muito material em
Português...
○ Portal Android (forum)
○ Android Brasil - dev (Lista de e-mail)
○ Android Brasil (Lista de e-mail de usuários)
○ Android Brasil - Projetos
○ Eu Android (blog)
○ AndroidBlog
○ BlogDoAndroid
○ e muito mais...
7. Antes de começarmos a programar..
Vamos precisar de algumas ferramentas:
○ JDK
○ Eclipse 3.5
○ Eclipse plugin for Android
○ SDK Android
Você pode utilizar qualquer IDE,
mas o Google recomenda o Eclipse,
então, porque não?!
8. Configurando o Eclipse
- Faça o download do JDK para seu sistema operacional e instale;
- Faça o download do Eclipse classico e descompacte o arquivo em
"Meus Documentos";
- Faça o download do SDK do Android na versão .zip e descompacte
em "Meus Documentos";
- Abra o Eclipse e vá em Help > Install New Software > Add...> Add
Repository
https://dl-ssl.google.com/android/eclipse/
Fonte:
http://developer.android.com/sdk/installing.html
http://developer.android.com/sdk/eclipse-adt.html#installing
9. Configurando o Eclipse
Faça junto comigo...
Vamos "dizer" ao Eclipse a localização do SDK Android no
nosso HD, baixar o emulador da versão do Android desejada e
criar uma maquina virtual Android.
Como esta parte demora um pouco, vamos deixar sendo executada e
continuar a apresentação, mas qualquer dúvida é so me perguntar.
Um tutorial desta parte é encontrado aqui
http://www.androidbrasilprojetos.org/tutoriais/instalando-e-configurando-o-
android-sdkeclipse/
10. Introdução ao sistema...
● Android é um sistema operacional multi-usuário no qual cada
aplicação é executada sob um usuário Linux diferente.
● Por padrão, o sistema atribui para cada aplicação um ID de
usuário Linux e organiza as permissões de todos os arquivos da
aplicação de modo que somente o usuário com aquele ID tenha
acesso aos arquivos.
● Cada processo tem sua própria maquina virtual (VM), assim o
código de uma aplicação é executado de maneira independente
das outras.
11. Introdução ao sistema...
● Android é um sistema operacional multi-usuário no qual cada
aplicação é executada sob um usuário Linux diferente.
● Por padrão, o sistema atribui para cada aplicação um ID de
usuário Linux e organiza as permissões de todos os arquivos da
aplicação de modo que somente o usuário com aquele ID tenha
acesso aos arquivos.
● Cada processo tem sua própria maquina virtual (VM), assim o
código de uma aplicação é executado de maneira independente
das outras.
Segurança e controle!
12. Introdução ao sistema...
Componentes de uma aplicação:
Activities
Uma Activity representa uma tela de interface com o usuário, é a unidade
básica para desenvolvimento de aplicações Android.
Uma Activity é implementada como uma subclasse de Activity ou uma
subclasse das classes filhas de Activity, exemplo ListActivity, TabActivity e
MapActivity.
14. Introdução ao sistema..
Services
Um Service é um componente que é executado em background executando
operações de longa duração. Services não possiuem interfaces com o usuário,
mas pode se comunicar com outros componentes através de chamadas
remotas.
Um Service é implementado como uma subclasse de Service.
15. Introdução ao sistema..
Content providers
Um content provider gerencia um conjunto compartilhado de dados de
aplicações.Content provider é implementado como uma subclasse
de ContentProvider e deve implementar um conjunto de métodos para ser util e
acessível por outras aplicações.
Broadcast receivers
Um broadcast receiver é um componente que responde a uma grande
variedade de mensagens de broadcast do sistema.Um broadcast receiver é
implementado como uma subclasse de BroadcastReceiver e cada broadcast é
integrado como uma Intent.
16. Activities...LifeCycle
O mais básico é saber
sobre como funcionam
as Activities...
onCreate()
onResume()
onPause()
onStop()
onDestroy()
Fonte:
http://developer.android.com/guide/topics/fundamentals/activities.html
17. Finalmente..Hello World!
Criar um novo Android Projeto, nomeio de "HelloAndroid".
O wizard vai pedir algumas informações:
● Project name: HelloAndroid
● Application name: Hello, Android <<= Nome que aparece na tela
● Package name: com.example.helloandroid
● Create Activity: HelloAndroid
Fonte:
http://developer.android.com/resources/tutorials/hello-world.html
18. Nossa primeira Activity
HelloAndroid.java
package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
19. Nossa primeira Activity
HelloAndroid.java
package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
21. A estrutura básica de um projeto
Android
Projeto
src/
gen/
res/
AndroidManifest.xml
default.properties
Arquivo muito importante do projeto:
AndroidManifest.xml
Vamos falar dele depois...
22. Hello World again, mas pouco diferente
HelloAndroid.java
package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Igual a primeira versão do arquivo!
23. Hello World again, mas pouco diferente
/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>
24. Hello World again, mas pouco diferente
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello, Android! I am a string resource!</string>
<string name="app_name">Hello, Android</string>
</resources>
28. NotePad
○ O tutorial do NotePad é dividido em três execícios.
○ Em cada exercício partes diferentes do sistema são
exploradas.
○ É muito didático!
○ É completo (lifecycle)!
○ Tratamento de eventos assincronos e acesso a DB.
○ Comunicação entre Activities.
Original em : http://developer.android.com/resources/tutorials/notepad/notepad-ex1.html
29. NotePad
Antes de desenvolver o projeto..
Vamos pensar um pouco em como será a aplicação.
Sim, levantamento de requisitos!
"Eu gostaria de poder listar todas as notas guardadas na
aplicação."
"Eu gostaria de poder adicionar notas."
"Eu gostaria de poder editar uma nota."
30. NotePad
Agora que já temos formalizado mentalmente o que
iremos fazer, vamos trabalhar!
31. NotePad V1
Fazer o download dos projetos em:
http://developer.android.com/resources/tutorials/notepad/codelab/NotepadCodeLab.zip
Crie um novo projeto Android no Eclipse (File > New > Android
Project) e configure para utilizar um código fonte já existente (opção
Create project from existing source) do projeto NotePadv1.
32. NotePad V1
○ Exercício número 1!
Missão do exercício:
Construir uma lista simples de notas que permita ao usuário adicionar notas,
mas não permita edita-las.
O que aprenderemos:
Este exercício demonstra o básico sobre ListActivity, a criação e manipulação
de opções de menu e a utilização do SQLite para armazenar as notas.
33. NotePad V1
Vamos estudar os arquivos fornecidos no projeto.
Abra o arquivo NotesDbAdapter.java
Note que:
○ SQLite nativo;
○ Constantes de banco são uma boa prática de programação;
○ Métodos para CRUD (Create,Read,Up,Del);
○ Android trabalha com Cursores;
34. NotePad V1
/**
* Retorna todas as notas no banco de dados em um Cursor.
**/
public Cursor fetchAllNotes() {
return mDb.query(
DATABASE_TABLE,
new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY},
null, null, null, null, null);
}
35. NotePad V1
/**
* Retorna somente a nota com o valor de rowId
**/
public Cursor fetchNote(long rowId) throws SQLException {
Cursor mCursor =
mDb.query(
true,
DATABASE_TABLE,
new String[] {KEY_ROWID,KEY_TITLE,
KEY_BODY}, KEY_ROWID + "=" + rowId,
null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
36. NotePad V1
mDb.query(
true,
DATABASE_TABLE,
new String[] {KEY_ROWID,KEY_TITLE,
KEY_BODY}, KEY_ROWID + "=" + rowId,
null, null, null, null, null);
query(boolean distinct, String table, String[] columns, String selection, String[]
selectionArgs, String groupBy, String having, String orderBy, String limit)
Query the given URL, returning a Cursor over the result set.
"SELECT KEY_ROWID,KEY_TITLE, KEY_BODY FROM DATABASE_TABLE
WHERE KEY_ROWID + "=" + rowId;"
37. NotePad V1
A tela com lista de notas fica definida em um arquivo XML.
Abrir o arquivo notepad_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_notes"/>
</LinearLayout>
39. NotePad V1
Voltando ao layout do projeto...
<ListView android:id="@android:id/list"/>
<TextView android:id="@android:id/empty"
android:text="@string/no_notes"/>
"list" e "empty" trabalham em conjunto, são ids defindos pelos
desenvolvedores do SDK Android.
"Se o objeto ListView de id list estiver vazio, mostre o conteúdo do TextView
de id empty"
40. NotePad V1
Mas onde está a definição dos itens da nossa lista?
Neste caso, cada linha da nossa lista conterá somente um
texto com o título da nota.
Criar o arquivo notes_row.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/text1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
41. NotePad V1
Agora, abra Notepadv1.java
Para que possamos mostrar uma lista na tela, temos que
utilizar como base uma ListActivity.
Então vamos mudar a declaração de herança da classe
public class Notepadv1 extends ListActivity
42. NotePad V1
Declare no inicio da classe um objeto para manipular os dados
do banco de dados:
private NotesDbAdapter mDbHelper;
Através dele iremos executar as operações de CRUD, você se
lembra o que significa CRUD?
43. NotePad V1
Declare no inicio da classe um objeto para manipular os dados
do banco de dados:
private NotesDbAdapter mDbHelper;
Através dele iremos executar as operações de CRUD, você se
lembra o que significa CRUD?
Create
Retrieve
Update
Delete
44. NotePad V1
Deixe o método OnCreate() assim:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notepad_list);
mDbHelper = new NotesDbAdapter(this);
mDbHelper.open();
fillData();
}
Nos ainda não declaramos fillData(), mas não se incomode com o
Eclipse reclamando..
45. NotePad V1
Então vamos implementa-lo:
private void fillData() {
// Get all of the notes from the database and create the item list
Cursor c = mDbHelper.fetchAllNotes();
startManagingCursor(c);
String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };
// Now create an array adapter and set it to display using our row
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
}
46. NotePad V1
Porque implementar o método fillData() ao invés de
simplesmente colocar aquele código no corpo do método
onCreate()?
O que o método fillData() faz?
47. NotePad V1
Porque implementar o método fillData() ao invés de
simplesmente colocar aquele código no corpo do método
onCreate()?
Nos vamos precisar de chamar aquele código em outros
métodos!
O que o método fillData() faz?
Atualiza a lista na tela com o conteúdo do banco de dados!
Vamos dar mais uma olhada naquele código..
48. NotePad V1
private void fillData() {
// Get all of the notes from the database and create the item list
Cursor c = mDbHelper.fetchAllNotes();
startManagingCursor(c);
String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };
// Now create an array adapter and set it to display using our row
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
}
49. NotePad V1
Precisamos de um modo de deixar o usuário adicionar notas a
nossa aplicação, para isso utilizaremos, inicialmente, o evento
de pressionar botão físico de Menu.
Vamos criar o menu com a mensagem "Add nota", para isso
sobrescrevemos o método onCreateOptionsMenu de ListActitivy.
Para poder perceber qual item do nosso menu foi apertado
temos que sobrescrever outro método, o onOptionsItemSelected.
Estes métodos são como queijo e goiabada, eles se
completam!
50. NotePad V1
Declare no inicio da classe:
public static final int INSERT_ID = Menu.FIRST;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, INSERT_ID, 0, R.string.menu_insert);
return result;
}
No arquivo strings.xml, adicione:
<string name="menu_insert">Add Item</string>
51. NotePad V1
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case INSERT_ID:
createNote();
break;
}
return super.onOptionsItemSelected(item);
}
Está quase acabando..só criarmos o método createNote()
52. NotePad V1
Declare no fim da classe:
private void createNote() {
String noteName = "Note " + mNoteNumber++;
mDbHelper.createNote(noteName, "");
fillData();
}
Cria notas vazias com nome "Note 1", "Note 2"...
Hora de testar..Execute a aplicação..
(Run As > Android Application.)
53. Troll
Mas seu programa não faz nada que
presta! Que isso?!
So tem como colocar notas vazias e
Com titulo automático!
56. NotePad V2
○ Exercício número 2!
Missão do exercício:
Nesta versão vamos adicionar a possibilidade de apagar uma nota e vamos
adicionar uma segunda Activity que nos permita adicionar e editar notas.
O que aprenderemos:
Como adicionar uma nova Activity, ao Android manifest, como passar dados
entre Activities, e a utilizar um layout de tela mais avanço. Também vamos ver
o funcionamento do método startActivityForResult().
57. NotePad V2
Crie um novo projeto Android no Eclipse
(File > New > Android Project) e configure para utilizar um
código fonte já existente (opção Create project from existing
source) do projeto NotePadv2.
58. NotePad V2
Vamos dar um confere no que mudou do do V1 para o V2.
/res/values/strings.xml
Há novas strings definidas.
/src/com/android/demo/notepad2/NotePadV2.java
Novas constantes, novos métodos são sobrescritos e a
definição do Cursor mNotesCursor.
59. NotePad V2
Vamos dar uma olhada no método fillData(), ele foi modificado pa
utilizar o Cursor mNotesCursor
private void fillData() {
mNotesCursor = mDbHelper.fetchAllNotes();
startManagingCursor(mNotesCursor);
String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };
// Now create an array adapter and set it to display using our row
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor,
from, to);
setListAdapter(notes);
}
60. NotePad V2
Pois bem...
Como podemos deixar o usuário apagar uma nota?
61. NotePad V2
Pois bem...
Como podemos deixar o usuário apagar uma nota?
Ele deve, de algum modo, selecionar um item da
lista para podermos saber sobre qual item ele quer
aplicar uma ação.
62. NotePad V2
Antes de mais nada, vamos adicionar a seguinte linha ao
onCreate() do NotePadV2:
registerForContextMenu(getListView());
Ela permite que os itens da lista (ListView) se registrem no
menu de contexto.
Como nossa Activity estende ListActivity basta usar
getListView() para recuperar a lista que está sendo usada no
layout.
setContentView(R.layout.notes_list);
63. NotePad V2
Para saber qual item da lista foi selecionado a classe
ListActivity possui alguns métodos...
Se você exectuar um long press sobre um item da lista será
criado um menu de contexto chamando o método:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// TODO: fill in rest of method
}
Não confundir com public boolean onCreateOptionsMenu(Menu menu)!
64. NotePad V2
Lembre-se, o que você quer é adicionar uma opção ao objeto "menu" de modo
que permita que o item selecionado seja removido!
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}
Quando você executar um long press apareceráum menu com o texto escrito em
R.string.menu_delete. <string name="menu_delete">Delete Note</string>
65. NotePad V2
Você ainda não especificou o que irá acontecer quando o
usuário escolher esse item de menu...
@Override
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()) {
case DELETE_ID:
AdapterContextMenuInfo info =
(AdapterContextMenuInfo) item.getMenuInfo();
mDbHelper.deleteNote(info.id);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
66. NotePad V2
...
switch(item.getItemId()) {
case DELETE_ID:
AdapterContextMenuInfo info =
(AdapterContextMenuInfo) item.getMenuInfo();
mDbHelper.deleteNote(info.id);
...
onContextItemSelected() é chamado pelo sistema quando um item é
selecionado, veja que para saber qual item do menu foi selecionado é
utiliado a constante DELETE_ID. O ID do elemento selecionado
dentro do DB é info.id!
Mas como isso é possível?
67. NotePad V2
"Isso não é magia, é tecnologia!"
public Cursor fetchAllNotes() {
return mDb.query(
DATABASE_TABLE,
new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY},
null, null, null, null, null);
}
Quando buscamos todas as notas no banco, o Cursor retornado, traz o
conteúdo da coluna KEY_ROWID.
public static final String KEY_ROWID = "_id";
Se você utilizar a coluna ID como "_id" na suas aplicações, o Android quase
que faz mágica!
Veja o próximo slide..
68. NotePad V2
mNotesCursor recebe o retorno de fetchAllNotes() e é passado como
parâmetro para o construtor de SimpleCursorAdapter.
O SimpleCursorAdapter() procura por uma coluna "_id" e já associa cada item
da lista a ser mostrado (NotesDbAdapter.KEY_TITLE) com aquele ID!
private void fillData() {
mNotesCursor = mDbHelper.fetchAllNotes();
startManagingCursor(mNotesCursor);
String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor,
from, to);
setListAdapter(notes);
}
69. NotePad V2
Vamos modificar o método createNote() para permitir a criação
de notas de maneira mais "profissional".
Vamos criar uma nova tela (leia-se Activity) para permitir a
entrada de dados para a criação e edição das notas.
Na nova tela, vamos entrar com o título da nota e com o corpo
da nota, mas toda a parte de acesso ao DB fica em NotePad.
java e teremos que retornar esses valores.
A mesma tela pode criar ou editar uma nota, ok?
70. NotePad V2
No arquivo NotePadV2.java temos o método:
private void createNote() {
// TODO: fill in implementation
}
Que não faz nada...
71. NotePad V2
No arquivo NotePadV2.java temos o método:
private void createNote() {
Intent i = new Intent(this, NoteEdit.class);
startActivityForResult(i, ACTIVITY_CREATE);
}
Declara a intenção de lançar uma nova Activity passando o
contexto como primeiro parâmetro e qual Activity como
segundo parâmetro para o construtor da Intent.
O método startActivityForResult() inicia uma Intent e também
recebe como parâmetro a constante ACTIVITY_CREATE que
serve como identificador do porque a Intent foi iniciada.
72. NotePad V2
Três perguntas podem vir a sua mente...
1° Porque tenho que identificar o motivo pelo qual criei uma
Intent?
2° Porque aquele método tem no nome "ForResult" ?
3° Nós já almoçamos?
73. NotePad V2
Três perguntas podem vir a sua mente.
1° Porque tenho que identificar o motivo pelo qual criei uma
Intent?
Porque nos vamos iniciar a mesma Activity para criar uma
nota e para editar uma nota e temos que saber diferenciar
cada caso.
2° Porque aquele método tem no nome "ForResult" ?
Porque quando a Activity iniciada pelo método terminar sua
execução, nós vamos querer saber qual foi o resultado dela.
3° Nós já almoçamos?
Espero que sim, senão eu estarei morrendo de fome!
74. NotePad V2
Ignore o Eclipse reclamando que não existe a classe NoteEdit.
java e vamos continuar preenchendo o corpo dos métodos...
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// TODO: fill in rest of method
}
Este método é chamado quando clicamos em um item da lista de
notas. O que deve acontecer com fizermos isso?
75. NotePad V2
Ignore o Eclipse reclamando que não existe a classe NoteEdit.
java e vamos continuar preenchendo o corpo dos métodos...
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Cursor c = mNotesCursor;
c.moveToPosition(position);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
...Continua....
76. NotePad V2
...
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
...
Você passa valores de uma Activity para outra através de Extras adicionados
na Intent antes de iniciar a nova Activity.
Cada Extra defini um identificador único e um valor.
Exemplo:
"NotesDbAdapter.KEY_ROWID" é um identificador e "id" um valor a ser
passado para a Activity associada a Intent "i".
NotesDbAdapter.KEY_TITLE é o identificador e o resultado de c.getString() o
valor.
77. NotePad V2
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
...Parte mostrada anteriomente...
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
startActivityForResult(i, ACTIVITY_EDIT);
}
O que o método onListItemClick() está fazendo?
78. NotePad V2
Ele está passando todos os dados de uma Note para a Activity
NoteEdit.class.
NoteEdit não precisa buscar no banco de dados as
informações relativas a Note que estará sendo editada, basta
pegar a partir dos Extras incluídos na chamada.
79. NotePad V2
Método completo:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Cursor c = mNotesCursor;
c.moveToPosition(position);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
startActivityForResult(i, ACTIVITY_EDIT);
}
Acesso a variável local é muito mais "barato" do que acesso a variáveis
globais.
80. NotePad V2
Quando NoteEdit terminar de executar será chamado o método
onActivityResult(), nele iremos fazer a real edição das
informações no banco de dados.
@Override
protected void onActivityResult(int requestCode, int
resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
// TODO: fill in rest of method
}
81. NotePad V2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Bundle extras = intent.getExtras();
switch(requestCode) {
case ACTIVITY_CREATE:
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelper.createNote(title, body);
fillData(); break;
...Continua... Retiramos dos "Extras" valores que foram adicionados em
NoteEdit. Não são os mesmos valores dos slides atras.
82. NotePad V2
...Continuação...
case ACTIVITY_EDIT:
Long mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
if (mRowId != null) {
String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelper.updateNote(mRowId, editTitle, editBody);
}
fillData();break;
}
NoteEdit pode ter sido chamada par criar uma nota (ACTIVITY_CREATE) ou
para editar uma nota (ACTIVITY_EDIT), combase no requestCode sabemos
qual é o caso.
83. NotePad V2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Bundle extras = intent.getExtras();
switch(requestCode) {
case ACTIVITY_CREATE:
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelper.createNote(title, body); fillData(); break;
case ACTIVITY_EDIT:
Long mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
if (mRowId != null) {
String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelper.updateNote(mRowId, editTitle, editBody);
}
fillData(); break;
}
84. NotePad V2
Agora vamos estudar o layout da tela de edição de Notes, abra
o arquivo /res/layout/note_edit.xml
Elementos novos:
<EditText android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button android:id="@+id/confirm"
android:text="@string/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
85. NotePad V2
A classe NoteEdit.java irá utilizar o layout note_edit.xml e
"amarrar" objetos Java aos objetos descritos no arquivo XML.
Depois disso precisamos verificar se foram passadas variáveis
para a Activity, se sim, mostra-los nos campos de texto.
Também precisamos definir o "valor de retorno" da Activity, ou
seja, definir quais dados serão passados a Activity NotePadV2
quando NoteEdit terminar sua execução.
86. NotePad V2
Crie a classe NoteEdit.java e preencha o onCreate() com:
private EditText mTitleText;
private EditText mBodyText;
private Long mRowId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_edit);
mTitleText = (EditText) findViewById(R.id.title);
mBodyText = (EditText) findViewById(R.id.body);
Button confirmButton = (Button) findViewById(R.id.confirm);
mRowId = null;
Bundle extras = getIntent().getExtras();
...Continua...
87. NotePad V2
if (extras != null) {
//Se chegar aqui estamos editando uma nota!
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
if (title != null) {
mTitleText.setText(title);
}
if (body != null) {
mBodyText.setText(body);
}
}
...Continua...
89. NotePad V2
Antes de executar o V2, temos que adicionar a Activity
NoteEdit ao AndroidManifest.xml, este é o arquivo de controle
da aplicação, nele listamos quais Activities serão chamadas no
decorrer da execução da aplicação, quais permissões a
aplicação possui, entre outros.
92. NotePad V2
Esta aplicação tem somente duas Activities e não possui
permissões.
Entre as possíveis permissões existentes, temos:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
Mais explicações aqui:
http://developer.android.com/guide/topics/security/security.html