Anda di halaman 1dari 8

Creando la nota con el formulario

Lo que queremos ahora es que cuando hacemos click en Add Item vayamos a otra pantalla donde podamos escribir el ttulo y el texto de la nota. Demos a guardar y aparezca en la lista de notas. Para eso vamos a tener que crear otra actividad (pantalla-controlador). Pensad que por cada pantalla que queramos tener vamos a tener que tener una nueva actividad. Antes de eso vamos a permitir borrar notas, para ello vamos a Notas.java. Aadimos la siguiente lnea al final del mtodo onCreate()
?

1 registerForContextMenu(getListView());

Queremos que al hacer click en un elemento de lista nos salga un men desde donde podamos borrarlo. Aadimos un nuevo mtodo que sobreescribe a uno de Android:
?

1 2 3 4 5
?

@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); }

Hace falta insertar ms variables en Notas.java


1 2 3 4 5
?

private static final int ACTIVITY_CREATE=0; private static final int ACTIVITY_EDIT=1; private static final int INSERT_ID = Menu.FIRST; private static final int DELETE_ID = Menu.FIRST + 1;

y en strings.xml
1 2 3 4 5
<string <string <string <string <string name="menu_delete">Delete Note</string> name="title">Title</string> name="body">Body</string> name="confirm">Confirm</string> name="edit_note">Edit Note</string>

Ahora que ya podemos seleccionar la nota a borrar, vamos a crear el mtodo que efectivamente lo borra:

01 02 03 04 05 06 07 08 09 10 11

@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); }

Volvemos a hacer un switch para comprobar la posicin del botn del men y si es la segunda borramos la nota y recargamos la lista. Conseguimos el ID de la nota gracias agetMenuInfo() y al mtodo registerForContextMenu() que hemos insertado antes al final deonCreate(). Volvamos ahora al mtodo auxiliar para crear nuevas notas, borramos lo que tenamos y vamos a cargar una nueva actividad:
?

1 private void createNote() { 2 Intent i = new Intent(this, NoteEdit.class); startActivityForResult(i, ACTIVITY_CREATE); 3 } 4

Lo que hacemos es crear un nuevo Intent, una nueva actividad, en este caso NoteEdit que todava no hemos creado. Ejecuta su comienzo y espera el resultado. Con el resultado luego llamar a la funcin onActivityResult() que implementaremos ms tarde. Si no nos interesa saber el resultado basta con llamar a la funcin startActivity() Vamos a hacer algo parecido para editar las notas que ya tenemos. Pero antes de nada vamos a permitir utilizar el Cursor en toda la clase, para eso aadimos la variable de clase:
?

1 private Cursor mNotesCursor;

refactorizamos onCreate() que quedara ahora as:


?

1 @Override

2 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 3 setContentView(R.layout.notepad_list); 4 mDbHelper = new NotasDbAdapter(this); 5 mDbHelper.open(); fillData(); 6 registerForContextMenu(getListView()); 7 } 8 9

y nuestro mtodo privado fillData()


?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

private void fillData() { // Recupera todas las notas de la DB y las guarda en el cursor mNotesCursor = mDbHelper.fetchAllNotes(); startManagingCursor(mNotesCursor); // Array con los campos que queremos mostrar en la lista String[] from = new String[]{NotasDbAdapter.KEY_TITLE}; // array con las variables asociadas para esos campos int[] to = new int[]{R.id.text1}; SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to); setListAdapter(notes); }

Ahora ya podemos fijarnos en el mtodo que se ejecute al hacer click sobre un elemento de la lista. Se llama onListItemClick() y lo sobreescribimos:
?

01 02 03 04 05 06 07 08 09 10 11 12 13

@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(NotasDbAdapter.KEY_ROWID, id); i.putExtra(NotasDbAdapter.KEY_TITLE, c.getString( c.getColumnIndexOrThrow(NotasDbAdapter.KEY_TITLE))); i.putExtra(NotasDbAdapter.KEY_BODY, c.getString( c.getColumnIndexOrThrow(NotasDbAdapter.KEY_BODY))); startActivityForResult(i, ACTIVITY_EDIT); }

Lo que estamos haciendo es mover el Cursor a la posicin en la que estamos, crear el Intent y pasarle como argumentos el Id, ttulo y texto. Para pasar como argumentos utilizamos la funcin putExtra(). Otra funcin

muy til. Por ltimo lo ejecutamos esperando el resultado. Va siendo hora de implementar el mtodo onActivityResult() que es el que se ejecuta cuando recibimos el resultado de haber creado o editado una nota con startActivityForResult()
?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

@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(NotasDbAdapter.KEY_TITLE); String body = extras.getString(NotasDbAdapter.KEY_BODY); mDbHelper.createNote(title, body); fillData(); break; case ACTIVITY_EDIT: Long mRowId = extras.getLong(NotasDbAdapter.KEY_ROWID); if (mRowId != null) { String editTitle = extras.getString(NotasDbAdapter.KEY_TITLE); String editBody = extras.getString(NotasDbAdapter.KEY_BODY); mDbHelper.updateNote(mRowId, editTitle, editBody); } fillData(); break; } }

Si estamos creando la nota, la guarda en la base de datos. Si la estamos editando, la actualiza y en ambos casos recarga la lista de notas. Ya tenemos la lgica ms o menos, vamos ahora a crear el layout del formulario. Para eso creamos el archivo /res/layout/note_edit.xml y lo rellenamos con:
?

01 02 <LinearLayout 03 xmlns:android="http://schemas.android.com/apk/res/android" 04 android:orientation="vertical" 05 android:layout_width="fill_parent" android:layout_height="fill_parent"> 06 07 <LinearLayout android:orientation="horizontal" 08 android:layout_width="fill_parent"

<?xml version="1.0" encoding="utf-8"?>

android:layout_height="wrap_content"> 09 10 <TextView android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:text="@string/title" /> 13 <EditText android:id="@+id/title" android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:layout_weight="1"/> 16 </LinearLayout> 17 18 <TextView android:layout_width="wrap_content" 19 android:layout_height="wrap_content" android:text="@string/body" /> 20 <EditText android:id="@+id/body" 21 android:layout_width="fill_parent" 22 android:layout_height="wrap_content" 23 android:layout_weight="1" android:scrollbars="vertical" /> 24 25 <Button android:id="@+id/confirm" 26 android:text="@string/confirm" 27 android:layout_width="wrap_content" 28 android:layout_height="wrap_content" /> 29 30 </LinearLayout> 31 32 33

Este es un layout ya ms complicado. Lo que hace es crear dos campos de texto, uno para el ttulo y otro para el texto; y el botn que guarda lo que hemos escrito. Utilizando una mezcla de configuraciones de alturas conseguimos la apariencia que queremos. En el prximo tutorial entraremos ms en detalle en los layouts. Vamos a crear la clase NoteEdit.java ahora que ya tenemos su layout. Voy a copiar el cdigo final comentado y explico detalles al final:
?

01 02 03 04 05 06 07 08 09

/* * Copyright (C) 2008 Google Inc. */ package com.android.demo.notepad1; import import import import android.app.Activity; android.content.Intent; android.os.Bundle; android.view.View;

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

import android.widget.Button; import android.widget.EditText; public class NoteEdit extends Activity { private EditText mTitleText; private EditText mBodyText; private Long mRowId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Fijamos el layout de esta actividad setContentView(R.layout.note_edit); // Objetos que referencian a los campos editables del layout mTitleText = (EditText) findViewById(R.id.title); mBodyText = (EditText) findViewById(R.id.body); Button confirmButton = (Button) findViewById(R.id.confirm); // Si hay argumentos, los cogemos mRowId = null; Bundle extras = getIntent().getExtras(); if (extras != null) { String title = extras.getString(NotasDbAdapter.KEY_TITLE); String body = extras.getString(NotasDbAdapter.KEY_BODY); mRowId = extras.getLong(NotasDbAdapter.KEY_ROWID); // Insertamos los valores actuales de la nota en los campos if (title != null) { mTitleText.setText(title); } if (body != null) { mBodyText.setText(body); } } // Listener para el botn de confirmar confirmButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Bundle bundle = new Bundle(); // Guardamos los nuevos valores en un Bundle bundle.putString(NotasDbAdapter.KEY_TITLE, mTitleText.getText().toString()); bundle.putString(NotasDbAdapter.KEY_BODY, mBodyText.getText().toString()); if (mRowId != null) { bundle.putLong(NotasDbAdapter.KEY_ROWID, mRowId); }

60 61 62 est esperando 63 64 65 } 66 67 }); 68 } 69 } 70 71

// y los mandamos de vuelta al mtodo que los Intent mIntent = new Intent(); mIntent.putExtras(bundle); setResult(RESULT_OK, mIntent); finish();

Hay que fijarse en cmo cogemos la referencia al campo de texto (mediante la clase R.java por supuesto)
mTitleText = (EditText) findViewById(R.id.title);

En cmo cogemos los argumentos que hemos pasado antes con el mtodo putExtra() y cmo asignamos los valores actuales
mTitleText.setText(title);

El ltimo paso tras crear una nueva actividad es declararla en el archivo AndroidManifest.xml. Recordarlo bien porque es un tpico fallo que nos hace perder muchas horas.
?

1 <activity android:name=".NoteEdit"></activity>

Tambin se puede introducir la nueva actividad con los paneles de control en vez de directamente sobre el cdigo (Application -> Add Application Node -> Activity y rellenamos el nombre) Es hora de ejecutar el programa de nuevo para ir viendo cmo evoluciona. Ya podemos editar las notas que creamos antes y crear nuevas con la opcin Add Item del men. Probad a dar hacia atrs cuando estis en el formulario. Veris cmo salta una excepcin.

Resumen

Hoy hemos tocado muchos temas y muy variados:

Hemos creado nuestro primer modelo con su conexin a la base de datos (adaptador de por medio para facilitarnos la vida).

Hemos visto ms layouts para mostrar listas y formularios. Hemos creado una actividad de lista que os puede servir de modelo para vuestras apps. Permite crear nuevas notas, editarlas y borrarlas. Aunque mejor esperad a la semana que viene para tomarla como modelo ya que haremos algunos cambios importantes.

Hemos creado una segunda actividad por lo que ya podemos decir que nuestra app es medianamente compleja, al menos tiene 2 pantallas!

El prximo da arreglaremos los pequeos fallos que nos hemos dejado, mejoraremos el cdigo para hacerlo ms ptimo, y aprenderemos muchas ms vistas en otros ejemplos, como por ejemplo cmo mostrar tu posicin en el mapa. Por hoy creo que es suficiente. Repasad el tutorial, ved la API de Android y si tenis alguna duda preguntad en Foros del Web o en los comentarios de esta entrada e intentar responder.

Anda mungkin juga menyukai