SlideShare a Scribd company logo
1 of 94
Download to read offline
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
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
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
Material didático

Muito material na internet sobre Android:

 ● Para usuários;
 ● Para desenvolvedores;
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!
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...
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?!
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
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/
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.
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!
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.
Introdução ao sistema...

Exemplos...
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.
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.
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
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
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);
  }
}
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);
  }
}
Nossa primeira Activity
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...
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!
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"/>
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>
Hello World

Parabé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 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
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."
NotePad




Agora que já temos formalizado mentalmente o que
         iremos fazer, vamos trabalhar!
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.
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.
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;
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);
}
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;
    }
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;"
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>
NotePad V1
<LinearLayout>             <RelativeLayout>              <TableLayout>
</LinearLayout>            </RelativeLayout>             </TableLayout>




fonte: http://developer.android.com/resources/tutorials/views/index.html
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"
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"/>
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
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?
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
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..
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);
 }
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?
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..
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);
 }
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!
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>
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()
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.)
Troll

Mas seu programa não faz nada que
presta! Que isso?!
So tem como colocar notas vazias e
Com titulo automático!
NotePad V2

Você quer tentar o NotePad V2?
NotePad V2

Você 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 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().
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.
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.
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);

  }
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 um item da
lista para podermos saber sobre qual item ele quer
                  aplicar uma ação.
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);
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)!
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>
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);
}
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?
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..
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);

  }
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?
NotePad V2

No arquivo NotePadV2.java temos o método:
  private void createNote() {
     // TODO: fill in implementation

  }
Que não faz nada...
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.
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?
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!
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?
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....
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.
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?
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.
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.
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

  }
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.
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.
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;
}
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" />
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.
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...
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...
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();
   }     }); }
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.
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>
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>
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
NotePad V2

Agora sim, execute a aplicação no emulador e vamos ver o
resultado!
NotePad V2

Parabéns, você acaba de terminar o segundo exercício!

More Related Content

What's hot

Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Matheus Calegaro
 
Jugday - Java Básico
Jugday - Java BásicoJugday - Java Básico
Jugday - Java BásicoPaloma Costa
 
Capítulo 01 - Fundamentos de Android e o HelloWorld
Capítulo 01 - Fundamentos de Android e o HelloWorldCapítulo 01 - Fundamentos de Android e o HelloWorld
Capítulo 01 - Fundamentos de Android e o HelloWorldMarcio Palheta
 
Minicurso de Android
Minicurso de AndroidMinicurso de Android
Minicurso de AndroidEdgar Eler
 
Seminário SD - Ambiente de Desenvolvimento para Android
Seminário SD - Ambiente de Desenvolvimento para AndroidSeminário SD - Ambiente de Desenvolvimento para Android
Seminário SD - Ambiente de Desenvolvimento para AndroidWilliam Higino
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidJosé Alexandre Macedo
 
Atividades e Intenções (Android)
Atividades e Intenções (Android)Atividades e Intenções (Android)
Atividades e Intenções (Android)Natanael Fonseca
 
Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_onRoberson Alves
 
Android Studio: Primeiros Passos
Android Studio: Primeiros PassosAndroid Studio: Primeiros Passos
Android Studio: Primeiros PassosRomualdo Andre
 
Pesl introducao a programacao para android
Pesl   introducao a programacao para androidPesl   introducao a programacao para android
Pesl introducao a programacao para androidRegis Claus
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma AndroidNatanael Fonseca
 
Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Horacio Diamante Mondlane
 
Tutorial de Instalação Eclipse + Android SDK
Tutorial de Instalação Eclipse + Android SDKTutorial de Instalação Eclipse + Android SDK
Tutorial de Instalação Eclipse + Android SDKRonildo Oliveira
 

What's hot (20)

Android Studio
Android StudioAndroid Studio
Android Studio
 
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2
 
Jugday - Java Básico
Jugday - Java BásicoJugday - Java Básico
Jugday - Java Básico
 
Introducao Spring ROO
Introducao Spring ROOIntroducao Spring ROO
Introducao Spring ROO
 
Capítulo 01 - Fundamentos de Android e o HelloWorld
Capítulo 01 - Fundamentos de Android e o HelloWorldCapítulo 01 - Fundamentos de Android e o HelloWorld
Capítulo 01 - Fundamentos de Android e o HelloWorld
 
Minicurso de Android
Minicurso de AndroidMinicurso de Android
Minicurso de Android
 
Curso de Groovy
Curso de GroovyCurso de Groovy
Curso de Groovy
 
Seminário SD - Ambiente de Desenvolvimento para Android
Seminário SD - Ambiente de Desenvolvimento para AndroidSeminário SD - Ambiente de Desenvolvimento para Android
Seminário SD - Ambiente de Desenvolvimento para Android
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
 
Atividades e Intenções (Android)
Atividades e Intenções (Android)Atividades e Intenções (Android)
Atividades e Intenções (Android)
 
Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_on
 
Android Studio: Primeiros Passos
Android Studio: Primeiros PassosAndroid Studio: Primeiros Passos
Android Studio: Primeiros Passos
 
Pesl introducao a programacao para android
Pesl   introducao a programacao para androidPesl   introducao a programacao para android
Pesl introducao a programacao para android
 
Rqt1
Rqt1Rqt1
Rqt1
 
Android Aula 5
Android Aula 5Android Aula 5
Android Aula 5
 
Caelum Day In Rio
Caelum Day In RioCaelum Day In Rio
Caelum Day In Rio
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma Android
 
Android - Conceito e Arquitetura
Android - Conceito e ArquiteturaAndroid - Conceito e Arquitetura
Android - Conceito e Arquitetura
 
Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03Apostila passo a passo como programar em android edição03
Apostila passo a passo como programar em android edição03
 
Tutorial de Instalação Eclipse + Android SDK
Tutorial de Instalação Eclipse + Android SDKTutorial de Instalação Eclipse + Android SDK
Tutorial de Instalação Eclipse + Android SDK
 

Viewers also liked

Dia 1 android diogo henrique
Dia 1 android diogo henriqueDia 1 android diogo henrique
Dia 1 android diogo henriqueDiogo Henrique
 
Hello world ao mundo mobile focado no android
Hello world ao mundo mobile focado no androidHello world ao mundo mobile focado no android
Hello world ao mundo mobile focado no androidCarlos Cavalcanti
 
Android Secomp 2011
Android Secomp 2011Android Secomp 2011
Android Secomp 2011Paulo Cesar
 
Aula 02 fundamentos
Aula 02   fundamentosAula 02   fundamentos
Aula 02 fundamentosfmkoba
 
Desenvolvendo Soluções com Android
Desenvolvendo Soluções com AndroidDesenvolvendo Soluções com Android
Desenvolvendo Soluções com Androidjgbirk
 
Minicurso Programação Android
Minicurso Programação AndroidMinicurso Programação Android
Minicurso Programação AndroidGPrimola
 
Introdução ao desenvolvimento de apps para Android - Dia 1/2
Introdução ao desenvolvimento de apps para Android - Dia 1/2Introdução ao desenvolvimento de apps para Android - Dia 1/2
Introdução ao desenvolvimento de apps para Android - Dia 1/2Matheus Calegaro
 
Implantação de um ERP - Vantagens e Dificuldades
Implantação de um ERP - Vantagens e DificuldadesImplantação de um ERP - Vantagens e Dificuldades
Implantação de um ERP - Vantagens e DificuldadesAndre Dourado
 
SIG: MRP, ERP, CRM e SCM
SIG: MRP, ERP, CRM e SCMSIG: MRP, ERP, CRM e SCM
SIG: MRP, ERP, CRM e SCMFelipe Oliveira
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaNelson Glauber Leal
 

Viewers also liked (19)

Dia 1 android diogo henrique
Dia 1 android diogo henriqueDia 1 android diogo henrique
Dia 1 android diogo henrique
 
Hello World Android
Hello World AndroidHello World Android
Hello World Android
 
Hello world ao mundo mobile focado no android
Hello world ao mundo mobile focado no androidHello world ao mundo mobile focado no android
Hello world ao mundo mobile focado no android
 
Android Secomp 2011
Android Secomp 2011Android Secomp 2011
Android Secomp 2011
 
Aula 02 fundamentos
Aula 02   fundamentosAula 02   fundamentos
Aula 02 fundamentos
 
Minicurso2013
Minicurso2013Minicurso2013
Minicurso2013
 
Hello World Android
Hello World AndroidHello World Android
Hello World Android
 
Desenvolvendo Soluções com Android
Desenvolvendo Soluções com AndroidDesenvolvendo Soluções com Android
Desenvolvendo Soluções com Android
 
Minicurso Programação Android
Minicurso Programação AndroidMinicurso Programação Android
Minicurso Programação Android
 
Slidshared
SlidsharedSlidshared
Slidshared
 
Aula android 01.pdf
Aula android 01.pdfAula android 01.pdf
Aula android 01.pdf
 
Introdução ao desenvolvimento de apps para Android - Dia 1/2
Introdução ao desenvolvimento de apps para Android - Dia 1/2Introdução ao desenvolvimento de apps para Android - Dia 1/2
Introdução ao desenvolvimento de apps para Android - Dia 1/2
 
Implantação de um ERP - Vantagens e Dificuldades
Implantação de um ERP - Vantagens e DificuldadesImplantação de um ERP - Vantagens e Dificuldades
Implantação de um ERP - Vantagens e Dificuldades
 
Cenário do mercado erp
Cenário do mercado erpCenário do mercado erp
Cenário do mercado erp
 
Sistema De Gestao Empresarial Erp
Sistema De Gestao Empresarial ErpSistema De Gestao Empresarial Erp
Sistema De Gestao Empresarial Erp
 
Sobre Erp (Basico)
Sobre Erp (Basico)Sobre Erp (Basico)
Sobre Erp (Basico)
 
SIG: MRP, ERP, CRM e SCM
SIG: MRP, ERP, CRM e SCMSIG: MRP, ERP, CRM e SCM
SIG: MRP, ERP, CRM e SCM
 
Sistema Operacional Android
Sistema Operacional AndroidSistema Operacional Android
Sistema Operacional Android
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certa
 

Similar to Apresentacao android por Júlio Cesar Bueno Cotta

Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma AndroidÉdipo Souza
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - BásicoHugoDalevedove
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo OliveiraRonildo Oliveira
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidRafael Sakurai
 
Configurando o ambiente para desenvolvimento Android
Configurando o ambiente para desenvolvimento AndroidConfigurando o ambiente para desenvolvimento Android
Configurando o ambiente para desenvolvimento AndroidCalebeMiquissene
 
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)Felipe Silveira
 
OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)Ricardo Rufino
 
Minicurso de Desenvolvimento Android - Iguatu - CE
Minicurso de Desenvolvimento Android - Iguatu - CEMinicurso de Desenvolvimento Android - Iguatu - CE
Minicurso de Desenvolvimento Android - Iguatu - CERonildo Oliveira
 
Curso de android
Curso de androidCurso de android
Curso de androidflaviokreis
 
Introdução ao android
Introdução ao androidIntrodução ao android
Introdução ao androidPaulo Remoli
 
Desenvolvendo Aplicativos com Android
Desenvolvendo Aplicativos com AndroidDesenvolvendo Aplicativos com Android
Desenvolvendo Aplicativos com AndroidMayron Cachina
 

Similar to Apresentacao android por Júlio Cesar Bueno Cotta (20)

Phonegap
PhonegapPhonegap
Phonegap
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma Android
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao Android
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
 
Empreendedori$mo com Android
Empreendedori$mo com AndroidEmpreendedori$mo com Android
Empreendedori$mo com Android
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo Oliveira
 
Curso Básico Android - Aula 01
Curso Básico Android - Aula 01Curso Básico Android - Aula 01
Curso Básico Android - Aula 01
 
Apresentação Google Android
Apresentação Google AndroidApresentação Google Android
Apresentação Google Android
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
 
Android - Notas de aula
Android - Notas de aulaAndroid - Notas de aula
Android - Notas de aula
 
Configurando o ambiente para desenvolvimento Android
Configurando o ambiente para desenvolvimento AndroidConfigurando o ambiente para desenvolvimento Android
Configurando o ambiente para desenvolvimento Android
 
Apostilaandroidfatecnormal
ApostilaandroidfatecnormalApostilaandroidfatecnormal
Apostilaandroidfatecnormal
 
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
 
OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)
 
Minicurso de Desenvolvimento Android - Iguatu - CE
Minicurso de Desenvolvimento Android - Iguatu - CEMinicurso de Desenvolvimento Android - Iguatu - CE
Minicurso de Desenvolvimento Android - Iguatu - CE
 
Curso de android
Curso de androidCurso de android
Curso de android
 
Introdução ao android
Introdução ao androidIntrodução ao android
Introdução ao android
 
Desenvolvendo Aplicativos com Android
Desenvolvendo Aplicativos com AndroidDesenvolvendo Aplicativos com Android
Desenvolvendo Aplicativos com Android
 
Androi studio
Androi studioAndroi studio
Androi studio
 
Android
AndroidAndroid
Android
 

Apresentacao android por Júlio Cesar Bueno Cotta

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