apresentacao android por júlio cesar bueno cotta

94
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

Upload: gprimola

Post on 18-Nov-2014

4.339 views

Category:

Technology


1 download

DESCRIPTION

Apresentação feita por: Júlio Cesar Bueno Cotta Google+: https://plus.google.com/118155829934060290839/posts

TRANSCRIPT

Page 1: Apresentacao android por Júlio Cesar Bueno Cotta

Apresentaccedilatildeo introdutoacuteria da plataforma Android

Por Juacutelio Cesar Bueno CottaMestrando em Ciecircncia da Computaccedilatildeo UFABC

Graduado em Ciecircncia da Computaccedilatildeo UFV

Sumaacuterio

Introduccedilatildeo Material didaacutetico

O que interessa Preparando o ambiente

Antes de comeccedilar a programar Configurando o Eclipse

FinalmenteHello World NotePad V1 NotePad V2 NotePad V3

Aviso

Atenccedilatildeo muitos coacutedigos fonte seratildeo mostrados nesta apresentaccedilatildeo natildeo utilize Ctrl + C e Ctrl + V Escreva-os vocecirc estaacute aprendendo natildeo pode ter preguiccedilaE afinal de contas satildeo poucas linhaspor slide -D

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

O que interessa para noshttpdeveloperandroidcom

Inglecircs eacute importante

Material didaacutetico

Mas se Inglecircs natildeo eacute seu forte temos muito material em Portuguecircs

Portal Android (forum) Android Brasil - dev (Lista de e-mail) Android Brasil (Lista de e-mail de usuaacuterios) Android Brasil - Projetos Eu Android (blog) AndroidBlog BlogDoAndroid e muito mais

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 2: Apresentacao android por Júlio Cesar Bueno Cotta

Sumaacuterio

Introduccedilatildeo Material didaacutetico

O que interessa Preparando o ambiente

Antes de comeccedilar a programar Configurando o Eclipse

FinalmenteHello World NotePad V1 NotePad V2 NotePad V3

Aviso

Atenccedilatildeo muitos coacutedigos fonte seratildeo mostrados nesta apresentaccedilatildeo natildeo utilize Ctrl + C e Ctrl + V Escreva-os vocecirc estaacute aprendendo natildeo pode ter preguiccedilaE afinal de contas satildeo poucas linhaspor slide -D

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

O que interessa para noshttpdeveloperandroidcom

Inglecircs eacute importante

Material didaacutetico

Mas se Inglecircs natildeo eacute seu forte temos muito material em Portuguecircs

Portal Android (forum) Android Brasil - dev (Lista de e-mail) Android Brasil (Lista de e-mail de usuaacuterios) Android Brasil - Projetos Eu Android (blog) AndroidBlog BlogDoAndroid e muito mais

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 3: Apresentacao android por Júlio Cesar Bueno Cotta

Aviso

Atenccedilatildeo muitos coacutedigos fonte seratildeo mostrados nesta apresentaccedilatildeo natildeo utilize Ctrl + C e Ctrl + V Escreva-os vocecirc estaacute aprendendo natildeo pode ter preguiccedilaE afinal de contas satildeo poucas linhaspor slide -D

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

O que interessa para noshttpdeveloperandroidcom

Inglecircs eacute importante

Material didaacutetico

Mas se Inglecircs natildeo eacute seu forte temos muito material em Portuguecircs

Portal Android (forum) Android Brasil - dev (Lista de e-mail) Android Brasil (Lista de e-mail de usuaacuterios) Android Brasil - Projetos Eu Android (blog) AndroidBlog BlogDoAndroid e muito mais

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 4: Apresentacao android por Júlio Cesar Bueno Cotta

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

O que interessa para noshttpdeveloperandroidcom

Inglecircs eacute importante

Material didaacutetico

Mas se Inglecircs natildeo eacute seu forte temos muito material em Portuguecircs

Portal Android (forum) Android Brasil - dev (Lista de e-mail) Android Brasil (Lista de e-mail de usuaacuterios) Android Brasil - Projetos Eu Android (blog) AndroidBlog BlogDoAndroid e muito mais

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 5: Apresentacao android por Júlio Cesar Bueno Cotta

Material didaacutetico

Muito material na internet sobre Android

Para usuaacuterios Para desenvolvedores

O que interessa para noshttpdeveloperandroidcom

Inglecircs eacute importante

Material didaacutetico

Mas se Inglecircs natildeo eacute seu forte temos muito material em Portuguecircs

Portal Android (forum) Android Brasil - dev (Lista de e-mail) Android Brasil (Lista de e-mail de usuaacuterios) Android Brasil - Projetos Eu Android (blog) AndroidBlog BlogDoAndroid e muito mais

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 6: Apresentacao android por Júlio Cesar Bueno Cotta

Material didaacutetico

Mas se Inglecircs natildeo eacute seu forte temos muito material em Portuguecircs

Portal Android (forum) Android Brasil - dev (Lista de e-mail) Android Brasil (Lista de e-mail de usuaacuterios) Android Brasil - Projetos Eu Android (blog) AndroidBlog BlogDoAndroid e muito mais

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 7: Apresentacao android por Júlio Cesar Bueno Cotta

Antes de comeccedilarmos a programar

Vamos precisar de algumas ferramentas

JDK Eclipse 35 Eclipse plugin for Android SDK Android

Vocecirc pode utilizar qualquer IDEmas o Google recomenda o Eclipseentatildeo porque natildeo

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 8: Apresentacao android por Júlio Cesar Bueno Cotta

Configurando o Eclipse

- Faccedila o download do JDK para seu sistema operacional e instale- Faccedila o download do Eclipse classico e descompacte o arquivo em Meus Documentos- Faccedila o download do SDK do Android na versatildeo zip e descompacte em Meus Documentos- Abra o Eclipse e vaacute em Help gt Install New Software gt Addgt Add Repository

httpsdl-sslgooglecomandroideclipse

Fonte httpdeveloperandroidcomsdkinstallinghtml httpdeveloperandroidcomsdkeclipse-adthtmlinstalling

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 9: Apresentacao android por Júlio Cesar Bueno Cotta

Configurando o Eclipse

Faccedila junto comigo

Vamos dizer ao Eclipse a localizaccedilatildeo do SDK Android no nosso HD baixar o emulador da versatildeo do Android desejada e criar uma maquina virtual Android

Como esta parte demora um pouco vamos deixar sendo executada e continuar a apresentaccedilatildeo mas qualquer duacutevida eacute so me perguntar

Um tutorial desta parte eacute encontrado aquihttpwwwandroidbrasilprojetosorgtutoriaisinstalando-e-configurando-o-android-sdkeclipse

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 10: Apresentacao android por Júlio Cesar Bueno Cotta

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 11: Apresentacao android por Júlio Cesar Bueno Cotta

Introduccedilatildeo ao sistema

Android eacute um sistema operacional multi-usuaacuterio no qual cada aplicaccedilatildeo eacute executada sob um usuaacuterio Linux diferente

Por padratildeo o sistema atribui para cada aplicaccedilatildeo um ID de usuaacuterio Linux e organiza as permissotildees de todos os arquivos da aplicaccedilatildeo de modo que somente o usuaacuterio com aquele ID tenha acesso aos arquivos

Cada processo tem sua proacutepria maquina virtual (VM) assim o coacutedigo de uma aplicaccedilatildeo eacute executado de maneira independente das outras

Seguranccedila e controle

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 12: Apresentacao android por Júlio Cesar Bueno Cotta

Introduccedilatildeo ao sistema

Componentes de uma aplicaccedilatildeo

ActivitiesUma Activity representa uma tela de interface com o usuaacuterio eacute a unidade baacutesica para desenvolvimento de aplicaccedilotildees AndroidUma Activity eacute implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity exemplo ListActivity TabActivity e MapActivity

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 13: Apresentacao android por Júlio Cesar Bueno Cotta

Introduccedilatildeo ao sistema

Exemplos

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 14: Apresentacao android por Júlio Cesar Bueno Cotta

Introduccedilatildeo ao sistema

ServicesUm Service eacute um componente que eacute executado em background executando operaccedilotildees de longa duraccedilatildeo Services natildeo possiuem interfaces com o usuaacuterio mas pode se comunicar com outros componentes atraveacutes de chamadas remotasUm Service eacute implementado como uma subclasse de Service

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 15: Apresentacao android por Júlio Cesar Bueno Cotta

Introduccedilatildeo ao sistema

Content providersUm content provider gerencia um conjunto compartilhado de dados de aplicaccedilotildeesContent provider eacute implementado como uma subclasse de ContentProvider e deve implementar um conjunto de meacutetodos para ser util e acessiacutevel por outras aplicaccedilotildeesBroadcast receiversUm broadcast receiver eacute um componente que responde a uma grande variedade de mensagens de broadcast do sistemaUm broadcast receiver eacute implementado como uma subclasse de BroadcastReceiver e cada broadcast eacute integrado como uma Intent

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 16: Apresentacao android por Júlio Cesar Bueno Cotta

ActivitiesLifeCycle

O mais baacutesico eacute sabersobre como funcionamas Activities

onCreate()onResume()onPause()onStop()onDestroy()

Fontehttpdeveloperandroidcomguidetopicsfundamentalsactivitieshtml

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 17: Apresentacao android por Júlio Cesar Bueno Cotta

FinalmenteHello World

Criar um novo Android Projeto nomeio de HelloAndroid

O wizard vai pedir algumas informaccedilotildees Project name HelloAndroid Application name Hello Android ltlt= Nome que aparece na tela Package name comexamplehelloandroid Create Activity HelloAndroid

Fontehttpdeveloperandroidcomresourcestutorialshello-worldhtml

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 18: Apresentacao android por Júlio Cesar Bueno Cotta

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 19: Apresentacao android por Júlio Cesar Bueno Cotta

Nossa primeira Activity

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundleimport androidwidgetTextViewpublic class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) TextView tv = new TextView(this) tvsetText(Hello Android) setContentView(tv)

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 20: Apresentacao android por Júlio Cesar Bueno Cotta

Nossa primeira Activity

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 21: Apresentacao android por Júlio Cesar Bueno Cotta

A estrutura baacutesica de um projeto Android

Projeto src gen res AndroidManifestxml defaultproperties

Arquivo muito importante do projetoAndroidManifestxmlVamos falar dele depois

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 22: Apresentacao android por Júlio Cesar Bueno Cotta

Hello World again mas pouco diferente

HelloAndroidjava

package comexamplehelloandroid

import androidappActivityimport androidosBundle

public class HelloAndroid extends Activity Called when the activity is first created Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutmain)

Igual a primeira versatildeo do arquivo

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 23: Apresentacao android por Júlio Cesar Bueno Cotta

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltTextView xmlnsandroid=httpschemasandroidcomapkresandroid androidid=+idtextview androidlayout_width=fill_parent androidlayout_height=fill_parent androidtext=stringhellogt

reslayoutmainxml

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 24: Apresentacao android por Júlio Cesar Bueno Cotta

Hello World again mas pouco diferente

ltxml version=10 encoding=utf-8gtltresourcesgt ltstring name=hellogtHello Android I am a string resourceltstringgt ltstring name=app_namegtHello Androidltstringgtltresourcesgt

resvaluesstringsxml

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 25: Apresentacao android por Júlio Cesar Bueno Cotta

Hello World

Parabeacutens vocecirc acaba de executar seu primeiro programa Android

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 26: Apresentacao android por Júlio Cesar Bueno Cotta

Hello World complete

Vocecirc quer tentar o NotePad

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 27: Apresentacao android por Júlio Cesar Bueno Cotta

Hello World complete

Vocecirc quer tentar o NotePad

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 28: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad

O tutorial do NotePad eacute dividido em trecircs execiacutecios Em cada exerciacutecio partes diferentes do sistema satildeo

exploradas Eacute muito didaacutetico Eacute completo (lifecycle) Tratamento de eventos assincronos e acesso a DB Comunicaccedilatildeo entre Activities

Original em httpdeveloperandroidcomresourcestutorialsnotepadnotepad-ex1html

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 29: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad

Antes de desenvolver o projetoVamos pensar um pouco em como seraacute a aplicaccedilatildeo

Sim levantamento de requisitos Eu gostaria de poder listar todas as notas guardadas na aplicaccedilatildeoEu gostaria de poder adicionar notasEu gostaria de poder editar uma nota

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 30: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad

Agora que jaacute temos formalizado mentalmente o que iremos fazer vamos trabalhar

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 31: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Fazer o download dos projetos em

httpdeveloperandroidcomresourcestutorialsnotepadcodelabNotepadCodeLabzip

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv1

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 32: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Exerciacutecio nuacutemero 1 Missatildeo do exerciacutecio Construir uma lista simples de notas que permita ao usuaacuterio adicionar notas mas natildeo permita edita-las O que aprenderemosEste exerciacutecio demonstra o baacutesico sobre ListActivity a criaccedilatildeo e manipulaccedilatildeo de opccedilotildees de menu e a utilizaccedilatildeo do SQLite para armazenar as notas

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 33: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Vamos estudar os arquivos fornecidos no projeto Abra o arquivo NotesDbAdapterjava

Note que SQLite nativo Constantes de banco satildeo uma boa praacutetica de programaccedilatildeo Meacutetodos para CRUD (CreateReadUpDel) Android trabalha com Cursores

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 34: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Retorna todas as notas no banco de dados em um Cursor public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null)

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 35: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1 Retorna somente a nota com o valor de rowId public Cursor fetchNote(long rowId) throws SQLException Cursor mCursor = mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_TITLE KEY_BODY KEY_ROWID + = + rowId null null null null null) if (mCursor = null) mCursormoveToFirst() return mCursor

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 36: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

mDbquery( true DATABASE_TABLE new String[] KEY_ROWIDKEY_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_ROWIDKEY_TITLE KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + = + rowId

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 37: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1A tela com lista de notas fica definida em um arquivo XMLAbrir o arquivo notepad_listxml

ltxml version=10 encoding=utf-8gtltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

ltListView androidid=androididlist androidlayout_width=wrap_content androidlayout_height=wrap_contentgt ltTextView androidid=androididempty androidlayout_width=wrap_content androidlayout_height=wrap_content androidtext=stringno_notesgt

ltLinearLayoutgt

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 38: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1ltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgtltLinearLayoutgt ltRelativeLayoutgt ltTableLayoutgt fonte httpdeveloperandroidcomresourcestutorialsviewsindexhtml

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 39: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1Voltando ao layout do projeto ltListView androidid=androididlistgt ltTextView androidid=androididempty androidtext=stringno_notesgt

list e empty trabalham em conjunto satildeo ids defindos pelos desenvolvedores do SDK Android Se o objeto ListView de id list estiver vazio mostre o conteuacutedo do TextView de id empty

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 40: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Mas onde estaacute a definiccedilatildeo dos itens da nossa listaNeste caso cada linha da nossa lista conteraacute somente um texto com o tiacutetulo da nota Criar o arquivo notes_rowxml

ltxml version=10 encoding=utf-8gtltTextView androidid=+idtext1 xmlnsandroid=httpschemasandroidcomapkresandroid androidlayout_width=wrap_content androidlayout_height=wrap_contentgt

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 41: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Agora abra Notepadv1java Para que possamos mostrar uma lista na tela temos que utilizar como base uma ListActivity Entatildeo vamos mudar a declaraccedilatildeo de heranccedila da classe

public class Notepadv1 extends ListActivity

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 42: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 43: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Declare no inicio da classe um objeto para manipular os dados do banco de dados

private NotesDbAdapter mDbHelper

Atraveacutes dele iremos executar as operaccedilotildees de CRUD vocecirc se lembra o que significa CRUD

CreateRetrieveUpdateDelete

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 44: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Deixe o meacutetodo OnCreate() assim

Override public void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnotepad_list) mDbHelper = new NotesDbAdapter(this) mDbHelperopen() fillData()

Nos ainda natildeo declaramos fillData() mas natildeo se incomode com o Eclipse reclamando

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 45: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Entatildeo vamos implementa-lo private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 46: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

O que o meacutetodo fillData() faz

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 47: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Porque implementar o meacutetodo fillData() ao inveacutes de simplesmente colocar aquele coacutedigo no corpo do meacutetodo onCreate()

Nos vamos precisar de chamar aquele coacutedigo em outros meacutetodos

O que o meacutetodo fillData() fazAtualiza a lista na tela com o conteuacutedo do banco de dadosVamos dar mais uma olhada naquele coacutedigo

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 48: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

private void fillData() Get all of the notes from the database and create the item list Cursor c = mDbHelperfetchAllNotes() startManagingCursor(c)

String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row c from to) setListAdapter(notes)

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 49: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Precisamos de um modo de deixar o usuaacuterio adicionar notas a nossa aplicaccedilatildeo para isso utilizaremos inicialmente o evento de pressionar botatildeo fiacutesico de Menu Vamos criar o menu com a mensagem Add nota para isso sobrescrevemos o meacutetodo onCreateOptionsMenu de ListActitivy Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro meacutetodo o onOptionsItemSelected

Estes meacutetodos satildeo como queijo e goiabada eles se completam

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 50: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Declare no inicio da classepublic static final int INSERT_ID = MenuFIRST

Override public boolean onCreateOptionsMenu(Menu menu) boolean result = superonCreateOptionsMenu(menu) menuadd(0 INSERT_ID 0 Rstringmenu_insert) return result

No arquivo stringsxml adicione

ltstring name=menu_insertgtAdd Itemltstringgt

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 51: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Override public boolean onOptionsItemSelected(MenuItem item) switch (itemgetItemId()) case INSERT_ID createNote() break return superonOptionsItemSelected(item)

Estaacute quase acabandosoacute criarmos o meacutetodo createNote()

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 52: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V1

Declare no fim da classe

private void createNote() String noteName = Note + mNoteNumber++ mDbHelpercreateNote(noteName ) fillData()

Cria notas vazias com nome Note 1 Note 2

Hora de testarExecute a aplicaccedilatildeo (Run As gt Android Application)

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 53: Apresentacao android por Júlio Cesar Bueno Cotta

Troll

Mas seu programa natildeo faz nada que presta Que issoSo tem como colocar notas vazias eCom titulo automaacutetico

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 54: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Vocecirc quer tentar o NotePad V2

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 55: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Vocecirc quer tentar o NotePad V2

Depois do almoccedilo -D

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 56: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Exerciacutecio nuacutemero 2Missatildeo do exerciacutecio Nesta versatildeo 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 avanccedilo Tambeacutem vamos ver o funcionamento do meacutetodo startActivityForResult()

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 57: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Crie um novo projeto Android no Eclipse (File gt New gt Android Project) e configure para utilizar um coacutedigo fonte jaacute existente (opccedilatildeo Create project from existing source) do projeto NotePadv2

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 58: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Vamos dar um confere no que mudou do do V1 para o V2 resvaluesstringsxmlHaacute novas strings definidas srccomandroiddemonotepad2NotePadV2javaNovas constantes novos meacutetodos satildeo sobrescritos e a definiccedilatildeo do Cursor mNotesCursor

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 59: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Vamos dar uma olhada no meacutetodo fillData() ele foi modificado para utilizar o Cursor mNotesCursorprivate void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 60: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 61: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Pois bem Como podemos deixar o usuaacuterio apagar uma nota

Ele deve de algum modo selecionar um item da lista para podermos saber sobre qual item ele quer

aplicar uma accedilatildeo

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 62: Apresentacao android por Júlio Cesar Bueno Cotta

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 contextoComo nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que estaacute sendo usada no layout

setContentView(Rlayoutnotes_list)

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 63: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Para saber qual item da lista foi selecionado a classe ListActivity possui alguns meacutetodos Se vocecirc exectuar um long press sobre um item da lista seraacute criado um menu de contexto chamando o meacutetodo Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) TODO fill in rest of method Natildeo confundir com public boolean onCreateOptionsMenu(Menu menu)

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 64: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Lembre-se o que vocecirc quer eacute adicionar uma opccedilatildeo ao objeto menu de modo que permita que o item selecionado seja removido Override public void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) superonCreateContextMenu(menu v menuInfo) menuadd(0 DELETE_ID 0 Rstringmenu_delete) Quando vocecirc executar um long press apareceraacuteum menu com o texto escrito em Rstringmenu_delete ltstring name=menu_deletegtDelete Noteltstringgt

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 65: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Vocecirc ainda natildeo especificou o que iraacute acontecer quando o usuaacuterio escolher esse item de menu Override public boolean onContextItemSelected(MenuItem item) switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) fillData() return true return superonContextItemSelected(item)

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 66: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

switch(itemgetItemId()) case DELETE_ID AdapterContextMenuInfo info = (AdapterContextMenuInfo) itemgetMenuInfo() mDbHelperdeleteNote(infoid) onContextItemSelected() eacute chamado pelo sistema quando um item eacute selecionado veja que para saber qual item do menu foi selecionado eacute utiliado a constante DELETE_ID O ID do elemento selecionado dentro do DB eacute infoid

Mas como isso eacute possiacutevel

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 67: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2Isso natildeo eacute magia eacute tecnologia

public Cursor fetchAllNotes() return mDbquery( DATABASE_TABLE new String[] KEY_ROWID KEY_TITLEKEY_BODY null null null null null) Quando buscamos todas as notas no banco o Cursor retornado traz o conteuacutedo da coluna KEY_ROWIDpublic static final String KEY_ROWID = _id Se vocecirc utilizar a coluna ID como _id na suas aplicaccedilotildees o Android quase que faz maacutegica Veja o proacuteximo slide

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 68: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e eacute passado como paracircmetro para o construtor de SimpleCursorAdapterO SimpleCursorAdapter() procura por uma coluna _id e jaacute associa cada item da lista a ser mostrado (NotesDbAdapterKEY_TITLE) com aquele ID

private void fillData() mNotesCursor = mDbHelperfetchAllNotes() startManagingCursor(mNotesCursor) String[] from = new String[] NotesDbAdapterKEY_TITLE int[] to = new int[] Ridtext1 SimpleCursorAdapter notes = new SimpleCursorAdapter(this Rlayoutnotes_row mNotesCursor from to) setListAdapter(notes)

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 69: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Vamos modificar o meacutetodo createNote() para permitir a criaccedilatildeo de notas de maneira mais profissional Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criaccedilatildeo e ediccedilatildeo das notas Na nova tela vamos entrar com o tiacutetulo da nota e com o corpo da nota mas toda a parte de acesso ao DB fica em NotePadjava e teremos que retornar esses valores A mesma tela pode criar ou editar uma nota ok

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 70: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() TODO fill in implementation

Que natildeo faz nada

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 71: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

No arquivo NotePadV2java temos o meacutetodo private void createNote() Intent i = new Intent(this NoteEditclass) startActivityForResult(i ACTIVITY_CREATE) Declara a intenccedilatildeo de lanccedilar uma nova Activity passando o contexto como primeiro paracircmetro e qual Activity como segundo paracircmetro para o construtor da Intent O meacutetodo startActivityForResult() inicia uma Intent e tambeacutem recebe como paracircmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 72: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Trecircs perguntas podem vir a sua mente1deg Porque tenho que identificar o motivo pelo qual criei uma Intent 2deg Porque aquele meacutetodo tem no nome ForResult 3deg Noacutes jaacute almoccedilamos

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 73: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Trecircs perguntas podem vir a sua mente1deg 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 2deg Porque aquele meacutetodo tem no nome ForResult Porque quando a Activity iniciada pelo meacutetodo terminar sua execuccedilatildeo noacutes vamos querer saber qual foi o resultado dela 3deg Noacutes jaacute almoccedilamosEspero que sim senatildeo eu estarei morrendo de fome

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 74: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverrideprotected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id)

TODO fill in rest of method

Este meacutetodo eacute chamado quando clicamos em um item da lista de notas O que deve acontecer com fizermos isso

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 75: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Ignore o Eclipse reclamando que natildeo existe a classe NoteEditjava e vamos continuar preenchendo o corpo dos meacutetodosOverride protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Continua

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 76: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) Vocecirc passa valores de uma Activity para outra atraveacutes de Extras adicionados na Intent antes de iniciar a nova ActivityCada Extra defini um identificador uacutenico e um valorExemploNotesDbAdapterKEY_ROWID eacute um identificador e id um valor a ser passado para a Activity associada a Intent i NotesDbAdapterKEY_TITLE eacute o identificador e o resultado de cgetString() o valor

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 77: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Overrideprotected void onListItemClick(ListView l View v int position long id) Parte mostrada anteriomente

iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT)

O que o meacutetodo onListItemClick() estaacute fazendo

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 78: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Ele estaacute passando todos os dados de uma Note para a Activity NoteEditclass NoteEdit natildeo precisa buscar no banco de dados as informaccedilotildees relativas a Note que estaraacute sendo editada basta pegar a partir dos Extras incluiacutedos na chamada

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 79: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Meacutetodo completo Override protected void onListItemClick(ListView l View v int position long id) superonListItemClick(l v position id) Cursor c = mNotesCursor cmoveToPosition(position) Intent i = new Intent(this NoteEditclass) iputExtra(NotesDbAdapterKEY_ROWID id) iputExtra(NotesDbAdapterKEY_TITLE cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_TITLE))) iputExtra(NotesDbAdapterKEY_BODY cgetString( cgetColumnIndexOrThrow(NotesDbAdapterKEY_BODY))) startActivityForResult(i ACTIVITY_EDIT) Acesso a variaacutevel local eacute muito mais barato do que acesso a variaacuteveis globais

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 80: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Quando NoteEdit terminar de executar seraacute chamado o meacutetodo onActivityResult() nele iremos fazer a real ediccedilatildeo das informaccedilotildees no banco de dados

Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) TODO fill in rest of method

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 81: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Overrideprotected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break Continua Retiramos dos Extras valores que foram adicionados em NoteEdit Natildeo satildeo os mesmos valores dos slides atras

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 82: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Continuaccedilatildeo case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(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 eacute o caso

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 83: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2Override protected void onActivityResult(int requestCode int resultCode Intent intent) superonActivityResult(requestCode resultCode intent) Bundle extras = intentgetExtras() switch(requestCode) case ACTIVITY_CREATE String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelpercreateNote(title body) fillData() break case ACTIVITY_EDIT Long mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID) if (mRowId = null) String editTitle = extrasgetString(NotesDbAdapterKEY_TITLE) String editBody = extrasgetString(NotesDbAdapterKEY_BODY) mDbHelperupdateNote(mRowId editTitle editBody) fillData() break

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 84: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2Agora vamos estudar o layout da tela de ediccedilatildeo de Notes abra o arquivo reslayoutnote_editxmlElementos novos ltEditText androidid=+idtitle androidlayout_width=wrap_content androidlayout_height=wrap_content androidlayout_weight=1gt ltButton androidid=+idconfirm androidtext=stringconfirm androidlayout_width=wrap_content androidlayout_height=wrap_content gt

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 85: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2A classe NoteEditjava iraacute utilizar o layout note_editxml e amarrar objetos Java aos objetos descritos no arquivo XML Depois disso precisamos verificar se foram passadas variaacuteveis para a Activity se sim mostra-los nos campos de texto

Tambeacutem precisamos definir o valor de retorno da Activity ou seja definir quais dados seratildeo passados a Activity NotePadV2 quando NoteEdit terminar sua execuccedilatildeo

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 86: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2Crie a classe NoteEditjava e preencha o onCreate() com private EditText mTitleText private EditText mBodyText private Long mRowId

Overrideprotected void onCreate(Bundle savedInstanceState) superonCreate(savedInstanceState) setContentView(Rlayoutnote_edit)

mTitleText = (EditText) findViewById(Ridtitle) mBodyText = (EditText) findViewById(Ridbody)

Button confirmButton = (Button) findViewById(Ridconfirm)

mRowId = null Bundle extras = getIntent()getExtras()Continua

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 87: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

if (extras = null) Se chegar aqui estamos editando uma nota String title = extrasgetString(NotesDbAdapterKEY_TITLE) String body = extrasgetString(NotesDbAdapterKEY_BODY) mRowId = extrasgetLong(NotesDbAdapterKEY_ROWID)

if (title = null) mTitleTextsetText(title) if (body = null) mBodyTextsetText(body) Continua

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 88: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

confirmButtonsetOnClickListener(new ViewOnClickListener() public void onClick(View view) Bundle bundle = new Bundle() bundleputString(NotesDbAdapterKEY_TITLEmTitleTextgetText()toString())bundleputString(NotesDbAdapterKEY_BODY mBodyTextgetText()toString()) if (mRowId = null) bundleputLong(NotesDbAdapterKEY_ROWID mRowId) Intent mIntent = new Intent() mIntentputExtras(bundle) setResult(RESULT_OK mIntent) finish() )

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 89: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Antes de executar o V2 temos que adicionar a Activity NoteEdit ao AndroidManifestxml este eacute o arquivo de controle da aplicaccedilatildeo nele listamos quais Activities seratildeo chamadas no decorrer da execuccedilatildeo da aplicaccedilatildeo quais permissotildees a aplicaccedilatildeo possui entre outros

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 90: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltapplicationgtltmanifestgt

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 91: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

ltxml version=10 encoding=utf-8gtltmanifest xmlnsandroid=httpschemasandroidcomapkresandroid package=comandroiddemonotepad2gt ltapplication androidicon=drawableicongt ltactivity androidname=Notepadv2 androidlabel=stringapp_namegt ltintent-filtergt ltaction androidname=androidintentactionMAIN gt ltcategory androidname=androidintentcategoryLAUNCHER gt ltintent-filtergt ltactivitygt ltactivity androidname=NoteEditgtltactivitygt ltapplicationgtltmanifestgt

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 92: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Esta aplicaccedilatildeo tem somente duas Activities e natildeo possui permissotildeesEntre as possiacuteveis permissotildees existentes temosltuses-permission androidname=androidpermissionRECEIVE_SMS gtltuses-permission androidname=androidpermissionINTERNET gtltuses-permission androidname=androidpermissionACCESS_NETWORK_STATE gt Mais explicaccedilotildees aquihttpdeveloperandroidcomguidetopicssecuritysecurityhtml

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 93: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio

Page 94: Apresentacao android por Júlio Cesar Bueno Cotta

NotePad V2

Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio