O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Apresentacao android por Júlio Cesar Bueno Cotta

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio

Confira estes a seguir

1 de 94 Anúncio
Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Quem viu também gostou (19)

Anúncio

Semelhante a Apresentacao android por Júlio Cesar Bueno Cotta (20)

Mais recentes (20)

Anúncio

Apresentacao android por Júlio Cesar Bueno Cotta

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

×