Apresentação introdutória da    plataforma Android           Por: Júlio Cesar Bueno Cotta   Mestrando em Ciência da Comput...
Sumário○ Introdução     ■ Material didático○ O que interessa!○ Preparando o ambiente...     ■ Antes de começar a programar...
AvisoAtenção, muitos códigos fonte serão mostrados nestaapresentação, não utilize Ctrl + C e Ctrl + V!Escreva-os, você est...
Material didáticoMuito material na internet sobre Android: ● Para usuários; ● Para desenvolvedores;
Material didáticoMuito material na internet sobre Android: ● Para usuários; ● Para desenvolvedores;O que interessa para no...
Material didáticoMas se Inglês não é seu forte, temos muito material emPortuguês...    ○ Portal Android (forum)    ○ Andro...
Antes de começarmos a programar..Vamos precisar de algumas ferramentas:    ○ JDK    ○ Eclipse 3.5    ○ Eclipse plugin for ...
Configurando o Eclipse- Faça o download do JDK para seu sistema operacional e instale;- Faça o download do Eclipse classic...
Configurando o EclipseFaça junto comigo...Vamos "dizer" ao Eclipse a localização do SDK Android nonosso HD, baixar o emula...
Introdução ao sistema...● Android é um sistema operacional multi-usuário no qual cada  aplicação é executada sob um usuári...
Introdução ao sistema...● Android é um sistema operacional multi-usuário no qual cada  aplicação é executada sob um usuári...
Introdução ao sistema...Componentes de uma aplicação:ActivitiesUma Activity representa uma tela de interface com o usuário...
Introdução ao sistema...Exemplos...
Introdução ao sistema..ServicesUm Service é um componente que é executado em background executandooperações de longa duraç...
Introdução ao sistema..Content providersUm content provider gerencia um conjunto compartilhado de dados deaplicações.Conte...
Activities...LifeCycleO mais básico é sabersobre como funcionamas Activities...onCreate()onResume()onPause()onStop()onDest...
Finalmente..Hello World!Criar um novo Android Projeto, nomeio de "HelloAndroid".O wizard vai pedir algumas informações:  ●...
Nossa primeira ActivityHelloAndroid.javapackage com.example.helloandroid;import android.app.Activity;import android.os.Bun...
Nossa primeira ActivityHelloAndroid.javapackage com.example.helloandroid;import android.app.Activity;import android.os.Bun...
Nossa primeira Activity
A estrutura básica de um projeto                    AndroidProjeto  src/  gen/  res/  AndroidManifest.xml  default.propert...
Hello World again, mas pouco diferenteHelloAndroid.javapackage com.example.helloandroid;import android.app.Activity;import...
Hello World again, mas pouco diferente/res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="h...
Hello World again, mas pouco diferente/res/values/strings.xml<?xml version="1.0" encoding="utf-8"?><resources>   <string n...
Hello WorldParabéns, você acaba de executar seu primeiro programa                      Android!
Hello World complete!Você quer tentar o NotePad?
Hello World complete!Você quer tentar o NotePad?
NotePad       ○ O tutorial do NotePad é dividido em três execícios.       ○ Em cada exercício partes diferentes do sistema...
NotePadAntes de desenvolver o projeto..Vamos pensar um pouco em como será a aplicação.Sim, levantamento de requisitos!"Eu ...
NotePadAgora que já temos formalizado mentalmente o que         iremos fazer, vamos trabalhar!
NotePad V1Fazer o download dos projetos em:http://developer.android.com/resources/tutorials/notepad/codelab/NotepadCodeLab...
NotePad V1      ○ Exercício número 1!Missão do exercício:Construir uma lista simples de notas que permita ao usuário adici...
NotePad V1Vamos estudar os arquivos fornecidos no projeto.Abra o arquivo NotesDbAdapter.javaNote que:  ○ SQLite nativo;  ○...
NotePad V1/*** Retorna todas as notas no banco de dados em um Cursor.**/public Cursor fetchAllNotes() {    return mDb.quer...
NotePad V1/*** Retorna somente a nota com o valor de rowId**/public Cursor fetchNote(long rowId) throws SQLException {    ...
NotePad V1mDb.query(           true,           DATABASE_TABLE,           new String[] {KEY_ROWID,KEY_TITLE,KEY_BODY},     ...
NotePad V1A tela com lista de notas fica definida em um arquivo XML.Abrir o arquivo notepad_list.xml<?xml version="1.0" en...
NotePad V1<LinearLayout>             <RelativeLayout>              <TableLayout></LinearLayout>            </RelativeLayou...
NotePad V1Voltando ao layout do projeto...<ListView android:id="@android:id/list"/><TextView android:id="@android:id/empty...
NotePad V1Mas onde está a definição dos itens da nossa lista?Neste caso, cada linha da nossa lista conterá somente umtexto...
NotePad V1Agora, abra Notepadv1.javaPara que possamos mostrar uma lista na tela, temos queutilizar como base uma ListActiv...
NotePad V1Declare no inicio da classe um objeto para manipular os dadosdo banco de dados:  private NotesDbAdapter mDbHelpe...
NotePad V1Declare no inicio da classe um objeto para manipular os dadosdo banco de dados:  private NotesDbAdapter mDbHelpe...
NotePad V1Deixe o método OnCreate() assim: @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(...
NotePad V1Então vamos implementa-lo:private void fillData() {    // Get all of the notes from the database and create the ...
NotePad V1Porque implementar o método fillData() ao invés desimplesmente colocar aquele código no corpo do métodoonCreate(...
NotePad V1Porque implementar o método fillData() ao invés desimplesmente colocar aquele código no corpo do métodoonCreate(...
NotePad V1private void fillData() {    // Get all of the notes from the database and create the item list    Cursor c = mD...
NotePad V1Precisamos de um modo de deixar o usuário adicionar notas anossa aplicação, para isso utilizaremos, inicialmente...
NotePad V1Declare no inicio da classe:public static final int INSERT_ID = Menu.FIRST;  @Override  public boolean onCreateO...
NotePad V1 @Override  public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {    case INSERT_...
NotePad V1Declare no fim da classe:private void createNote() {     String noteName = "Note " + mNoteNumber++;     mDbHelpe...
TrollMas seu programa não faz nada quepresta! Que isso?!So tem como colocar notas vazias eCom titulo automático!
NotePad V2Você quer tentar o NotePad V2?
NotePad V2Você quer tentar o NotePad V2?               Depois do almoço? :-D
NotePad V2      ○ Exercício número 2!Missão do exercício:Nesta versão vamos adicionar a possibilidade de apagar uma nota e...
NotePad V2Crie um novo projeto Android no Eclipse(File > New > Android Project) e configure para utilizar umcódigo fonte j...
NotePad V2Vamos dar um confere no que mudou do do V1 para o V2./res/values/strings.xmlHá novas strings definidas./src/com/...
NotePad V2Vamos dar uma olhada no método fillData(), ele foi modificado pautilizar o Cursor mNotesCursorprivate void fillD...
NotePad V2                 Pois bem...Como podemos deixar o usuário apagar uma nota?
NotePad V2                 Pois bem...Como podemos deixar o usuário apagar uma nota?  Ele deve, de algum modo, selecionar ...
NotePad V2Antes de mais nada, vamos adicionar a seguinte linha aoonCreate() do NotePadV2:             registerForContextMe...
NotePad V2Para saber qual item da lista foi selecionado a classeListActivity possui alguns métodos...Se você exectuar um l...
NotePad V2Lembre-se, o que você quer é adicionar uma opção ao objeto "menu" de modoque permita que o item selecionado seja...
NotePad V2Você ainda não especificou o que irá acontecer quando ousuário escolher esse item de menu...    @Override    pub...
NotePad V2...switch(item.getItemId()) {    case DELETE_ID:      AdapterContextMenuInfo info =      (AdapterContextMenuInfo...
NotePad V2                   "Isso não é magia, é tecnologia!"public Cursor fetchAllNotes() {  return mDb.query(          ...
NotePad V2mNotesCursor recebe o retorno de fetchAllNotes() e é passado comoparâmetro para o construtor de SimpleCursorAdap...
NotePad V2Vamos modificar o método createNote() para permitir a criaçãode notas de maneira mais "profissional".Vamos criar...
NotePad V2No arquivo NotePadV2.java temos o método:  private void createNote() {     // TODO: fill in implementation  }Que...
NotePad V2No arquivo NotePadV2.java temos o método:  private void createNote() {     Intent i = new Intent(this, NoteEdit....
NotePad V2Três perguntas podem vir a sua mente...1° Porque tenho que identificar o motivo pelo qual criei umaIntent?2° Por...
NotePad V2Três perguntas podem vir a sua mente.1° Porque tenho que identificar o motivo pelo qual criei umaIntent? Porque ...
NotePad V2Ignore o Eclipse reclamando que não existe a classe NoteEdit.java e vamos continuar preenchendo o corpo dos méto...
NotePad V2Ignore o Eclipse reclamando que não existe a classe NoteEdit.java e vamos continuar preenchendo o corpo dos méto...
NotePad V2...      i.putExtra(NotesDbAdapter.KEY_ROWID, id);      i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(      c...
NotePad V2@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {...Parte mostrada anteriomen...
NotePad V2Ele está passando todos os dados de uma Note para a ActivityNoteEdit.class.NoteEdit não precisa buscar no banco ...
NotePad V2Método completo:   @Override   protected void onListItemClick(ListView l, View v, int position, long id) {     s...
NotePad V2Quando NoteEdit terminar de executar será chamado o métodoonActivityResult(), nele iremos fazer a real edição da...
NotePad V2@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {   super.onActivityRes...
NotePad V2...Continuação...case ACTIVITY_EDIT:  Long mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);    if (mRowId != n...
NotePad V2@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult...
NotePad V2Agora vamos estudar o layout da tela de edição de Notes, abrao arquivo /res/layout/note_edit.xmlElementos novos:...
NotePad V2A classe NoteEdit.java irá utilizar o layout note_edit.xml e"amarrar" objetos Java aos objetos descritos no arqu...
NotePad V2Crie a classe NoteEdit.java e preencha o onCreate() com:  private EditText mTitleText;  private EditText mBodyTe...
NotePad V2  if (extras != null) {      //Se chegar aqui estamos editando uma nota!      String title = extras.getString(No...
NotePad V2confirmButton.setOnClickListener(new View.OnClickListener() {   public void onClick(View view) {     Bundle bund...
NotePad V2Antes de executar o V2, temos que adicionar a ActivityNoteEdit ao AndroidManifest.xml, este é o arquivo de contr...
NotePad V2<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"packag...
NotePad V2<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"packag...
NotePad V2Esta aplicação tem somente duas Activities e não possuipermissões.Entre as possíveis permissões existentes, temo...
NotePad V2Agora sim, execute a aplicação no emulador e vamos ver oresultado!
NotePad V2Parabéns, você acaba de terminar o segundo exercício!
Próximos SlideShares
Carregando em…5
×

Apresentacao android por Júlio Cesar Bueno Cotta

4.076 visualizações

Publicada em

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

Publicada em: Tecnologia
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
4.076
No SlideShare
0
A partir de incorporações
0
Número de incorporações
6
Ações
Compartilhamentos
0
Downloads
196
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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. AvisoAtenção, muitos códigos fonte serão mostrados nestaapresentaçã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áticoMuito material na internet sobre Android: ● Para usuários; ● Para desenvolvedores;
  5. 5. Material didáticoMuito 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áticoMas se Inglês não é seu forte, temos muito material emPortuguê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 AndroidVocê 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 descompacteem "Meus Documentos";- Abra o Eclipse e vá em Help > Install New Software > Add...> AddRepositoryhttps://dl-ssl.google.com/android/eclipse/Fonte:http://developer.android.com/sdk/installing.htmlhttp://developer.android.com/sdk/eclipse-adt.html#installing
  9. 9. Configurando o EclipseFaça junto comigo...Vamos "dizer" ao Eclipse a localização do SDK Android nonosso HD, baixar o emulador da versão do Android desejada ecriar uma maquina virtual Android.Como esta parte demora um pouco, vamos deixar sendo executada econtinuar a apresentação, mas qualquer dúvida é so me perguntar.Um tutorial desta parte é encontrado aquihttp://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:ActivitiesUma Activity representa uma tela de interface com o usuário, é a unidadebásica para desenvolvimento de aplicações Android.Uma Activity é implementada como uma subclasse de Activity ou umasubclasse das classes filhas de Activity, exemplo ListActivity, TabActivity eMapActivity.
  13. 13. Introdução ao sistema...Exemplos...
  14. 14. Introdução ao sistema..ServicesUm Service é um componente que é executado em background executandooperações de longa duração. Services não possiuem interfaces com o usuário,mas pode se comunicar com outros componentes através de chamadasremotas.Um Service é implementado como uma subclasse de Service.
  15. 15. Introdução ao sistema..Content providersUm content provider gerencia um conjunto compartilhado de dados deaplicações.Content provider é implementado como uma subclassede ContentProvider e deve implementar um conjunto de métodos para ser util eacessível por outras aplicações.Broadcast receiversUm broadcast receiver é um componente que responde a uma grandevariedade 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...LifeCycleO mais básico é sabersobre como funcionamas 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: HelloAndroidFonte:http://developer.android.com/resources/tutorials/hello-world.html
  18. 18. Nossa primeira ActivityHelloAndroid.javapackage 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 ActivityHelloAndroid.javapackage 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 AndroidProjeto 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 diferenteHelloAndroid.javapackage 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 WorldParabé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. NotePadAntes 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 naaplicação.""Eu gostaria de poder adicionar notas.""Eu gostaria de poder editar uma nota."
  30. 30. NotePadAgora que já temos formalizado mentalmente o que iremos fazer, vamos trabalhar!
  31. 31. NotePad V1Fazer o download dos projetos em:http://developer.android.com/resources/tutorials/notepad/codelab/NotepadCodeLab.zipCrie um novo projeto Android no Eclipse (File > New > AndroidProject) e configure para utilizar um código fonte já existente (opçãoCreate 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çãode opções de menu e a utilização do SQLite para armazenar as notas.
  33. 33. NotePad V1Vamos estudar os arquivos fornecidos no projeto.Abra o arquivo NotesDbAdapter.javaNote 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 V1mDb.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_TABLEWHERE KEY_ROWID + "=" + rowId;"
  37. 37. NotePad V1A 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 V1Voltando 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 pelosdesenvolvedores do SDK Android."Se o objeto ListView de id list estiver vazio, mostre o conteúdo do TextViewde id empty"
  40. 40. NotePad V1Mas onde está a definição dos itens da nossa lista?Neste caso, cada linha da nossa lista conterá somente umtexto 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 V1Agora, abra Notepadv1.javaPara que possamos mostrar uma lista na tela, temos queutilizar como base uma ListActivity.Então vamos mudar a declaração de herança da classepublic class Notepadv1 extends ListActivity
  42. 42. NotePad V1Declare no inicio da classe um objeto para manipular os dadosdo banco de dados: private NotesDbAdapter mDbHelper;Através dele iremos executar as operações de CRUD, você selembra o que significa CRUD?
  43. 43. NotePad V1Declare no inicio da classe um objeto para manipular os dadosdo banco de dados: private NotesDbAdapter mDbHelper;Através dele iremos executar as operações de CRUD, você selembra o que significa CRUD? Create Retrieve Update Delete
  44. 44. NotePad V1Deixe 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 oEclipse reclamando..
  45. 45. NotePad V1Entã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 V1Porque implementar o método fillData() ao invés desimplesmente colocar aquele código no corpo do métodoonCreate()?O que o método fillData() faz?
  47. 47. NotePad V1Porque implementar o método fillData() ao invés desimplesmente colocar aquele código no corpo do métodoonCreate()?Nos vamos precisar de chamar aquele código em outrosmé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 V1private 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 V1Precisamos de um modo de deixar o usuário adicionar notas anossa aplicação, para isso utilizaremos, inicialmente, o eventode pressionar botão físico de Menu.Vamos criar o menu com a mensagem "Add nota", para issosobrescrevemos o método onCreateOptionsMenu de ListActitivy.Para poder perceber qual item do nosso menu foi apertadotemos que sobrescrever outro método, o onOptionsItemSelected.Estes métodos são como queijo e goiabada, eles secompletam!
  50. 50. NotePad V1Declare 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 V1Declare 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. TrollMas seu programa não faz nada quepresta! Que isso?!So tem como colocar notas vazias eCom titulo automático!
  54. 54. NotePad V2Você quer tentar o NotePad V2?
  55. 55. NotePad V2Você 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 vamosadicionar uma segunda Activity que nos permita adicionar e editar notas.O que aprenderemos:Como adicionar uma nova Activity, ao Android manifest, como passar dadosentre Activities, e a utilizar um layout de tela mais avanço. Também vamos vero funcionamento do método startActivityForResult().
  57. 57. NotePad V2Crie um novo projeto Android no Eclipse(File > New > Android Project) e configure para utilizar umcódigo fonte já existente (opção Create project from existingsource) do projeto NotePadv2.
  58. 58. NotePad V2Vamos dar um confere no que mudou do do V1 para o V2./res/values/strings.xmlHá novas strings definidas./src/com/android/demo/notepad2/NotePadV2.javaNovas constantes, novos métodos são sobrescritos e adefinição do Cursor mNotesCursor.
  59. 59. NotePad V2Vamos dar uma olhada no método fillData(), ele foi modificado pautilizar o Cursor mNotesCursorprivate 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 dalista para podermos saber sobre qual item ele quer aplicar uma ação.
  62. 62. NotePad V2Antes de mais nada, vamos adicionar a seguinte linha aoonCreate() do NotePadV2: registerForContextMenu(getListView());Ela permite que os itens da lista (ListView) se registrem nomenu de contexto.Como nossa Activity estende ListActivity basta usargetListView() para recuperar a lista que está sendo usada nolayout. setContentView(R.layout.notes_list);
  63. 63. NotePad V2Para saber qual item da lista foi selecionado a classeListActivity 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 V2Lembre-se, o que você quer é adicionar uma opção ao objeto "menu" de modoque 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 emR.string.menu_delete. <string name="menu_delete">Delete Note</string>
  65. 65. NotePad V2Você ainda não especificou o que irá acontecer quando ousuá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 selecionadodentro 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 oconteú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 quaseque faz mágica!Veja o próximo slide..
  68. 68. NotePad V2mNotesCursor recebe o retorno de fetchAllNotes() e é passado comoparâmetro para o construtor de SimpleCursorAdapter.O SimpleCursorAdapter() procura por uma coluna "_id" e já associa cada itemda 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 V2Vamos modificar o método createNote() para permitir a criaçãode notas de maneira mais "profissional".Vamos criar uma nova tela (leia-se Activity) para permitir aentrada 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 corpoda 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 V2No arquivo NotePadV2.java temos o método: private void createNote() { // TODO: fill in implementation }Que não faz nada...
  71. 71. NotePad V2No 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 ocontexto como primeiro parâmetro e qual Activity comosegundo parâmetro para o construtor da Intent.O método startActivityForResult() inicia uma Intent e tambémrecebe como parâmetro a constante ACTIVITY_CREATE queserve como identificador do porque a Intent foi iniciada.
  72. 72. NotePad V2Três perguntas podem vir a sua mente...1° Porque tenho que identificar o motivo pelo qual criei umaIntent?2° Porque aquele método tem no nome "ForResult" ?3° Nós já almoçamos?
  73. 73. NotePad V2Três perguntas podem vir a sua mente.1° Porque tenho que identificar o motivo pelo qual criei umaIntent? Porque nos vamos iniciar a mesma Activity para criar umanota e para editar uma nota e temos que saber diferenciarcada caso.2° Porque aquele método tem no nome "ForResult" ?Porque quando a Activity iniciada pelo método terminar suaexecuçã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 V2Ignore o Eclipse reclamando que não existe a classe NoteEdit.java e vamos continuar preenchendo o corpo dos métodos...@Overrideprotected 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 denotas. O que deve acontecer com fizermos isso?
  75. 75. NotePad V2Ignore o Eclipse reclamando que não existe a classe NoteEdit.java e vamos continuar preenchendo o corpo dos métodos...@Overrideprotected 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 adicionadosna 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 serpassado para a Activity associada a Intent "i". NotesDbAdapter.KEY_TITLE é o identificador e o resultado de c.getString() ovalor.
  77. 77. NotePad V2@Overrideprotected 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 V2Ele está passando todos os dados de uma Note para a ActivityNoteEdit.class.NoteEdit não precisa buscar no banco de dados asinformações relativas a Note que estará sendo editada, bastapegar a partir dos Extras incluídos na chamada.
  79. 79. NotePad V2Mé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áveisglobais.
  80. 80. NotePad V2Quando NoteEdit terminar de executar será chamado o métodoonActivityResult(), nele iremos fazer a real edição dasinformações no banco de dados. @Override protected void onActivityResult(int requestCode, intresultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); // TODO: fill in rest of method }
  81. 81. NotePad V2@Overrideprotected 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 emNoteEdit. 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) oupara editar uma nota (ACTIVITY_EDIT), combase no requestCode sabemosqual é o caso.
  83. 83. NotePad V2@Overrideprotected 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 V2Agora vamos estudar o layout da tela de edição de Notes, abrao arquivo /res/layout/note_edit.xmlElementos 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 V2A 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áveispara a Activity, se sim, mostra-los nos campos de texto.Também precisamos definir o "valor de retorno" da Activity, ouseja, definir quais dados serão passados a Activity NotePadV2quando NoteEdit terminar sua execução.
  86. 86. NotePad V2Crie a classe NoteEdit.java e preencha o onCreate() com: private EditText mTitleText; private EditText mBodyText; private Long mRowId;@Overrideprotected 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 V2confirmButton.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 V2Antes de executar o V2, temos que adicionar a ActivityNoteEdit ao AndroidManifest.xml, este é o arquivo de controleda aplicação, nele listamos quais Activities serão chamadas nodecorrer da execução da aplicação, quais permissões aaplicaçã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 V2Esta aplicação tem somente duas Activities e não possuipermissõ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 V2Agora sim, execute a aplicação no emulador e vamos ver oresultado!
  94. 94. NotePad V2Parabéns, você acaba de terminar o segundo exercício!

×