Apresentacao android por Júlio Cesar Bueno Cotta
-
Upload
gprimola -
Category
Technology
-
view
4.339 -
download
1
description
Transcript of 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
NotePad V2
Agora sim execute a aplicaccedilatildeo no emulador e vamos ver o resultado
NotePad V2
Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio
NotePad V2
Parabeacutens vocecirc acaba de terminar o segundo exerciacutecio