Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad

febrero 20, 2010

Continuamos con la segunda parte del tutorial para el desarrollo de una aplicación para Android paso a paso. La primera parte la puedes consultar en Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad.

En este segundo post, vamos a crear una segunda actividad que nos permita crear y editar notas. Además, vamos a poder tener la posibilidad de eliminar notas a través del un menú contextual.

Objetivos:
• Crear una nueva actividad.
• Realizar llamadas a la nueva actividad.
• Paso de datos entre las actividades.
• Crear un nuevo menu contextual.

Paso 1

Vamos a crear un menú contextual que nos permita eliminar las notas creadas por el usuario. Este menú se activará al seleccionar una nota:

1. Relacionamos la lista de notas (ListView) con el menu contextual:

1
registerForContextMenu(getListView());

2. Creamos el menú contextual con la opción de eliminar una nota:

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

3. Ahora que tenemos el menú creado y relacionado con el listado, tenemos que atender a las pulsaciones en el menú contextual:

1
2
3
4
5
6
7
8
9
10
11
12
@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);
}

Paso 2

Como hemos visto antes, vamos a dar la posibilidad al usuario de crear y editar notas. Para ello, necesitamos una actividad que controle la interfaz de usuario.

1
2
3
4
5
6
7
8
9
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
public class NoteEdit extends Activity {
    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();
        if (extras != null) {
            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);
            }
        }
 
    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();
    }});
    }
}

Paso 3

Ya tenemos la interfaz de usuario, y la actividad para controlarla. Vamos a abrir la nueva actividad desde el listado, para crear una nueva nota. Modificamos el método createNote() de la siguiente manera:

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

Paso 4

Para editar las notas ya creadas, creamos un evento para atender a las pulsaciones de los elementos de las listas. Pasamos los datos de la nota a la nueva actividad.

1
2
3
4
5
6
7
8
9
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(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);
}

Paso 5

Los métodos creados anteriormente createNote() y onListItemClick() nos devuelven datos, por lo que necesitamos un método para manejar la respuesta. onActivityResult() es el método ejecutado cuando una actividad devuelve resultados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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 rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
            if (rowId != null) {
            String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
            String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
            mDbHelper.updateNote(rowId, editTitle, editBody);
    }
    fillData();
    break;
}

Paso 6

La nueva actividad que hemos definido anteriormente, hay que añadirla a AndroidManifest.xml. Esto permite al sistema conocer los componentes de la aplicación.
Eclipse include un editor para el manifiesto que facilita la edición del fichero AndroidManifest.xml. Para añadir una nueva actividad:

1. Abrir el fichero AndroidManifest.xml
2. Seleccionar la pestaña Application.
3. Pulsamos Add en la sección de Application Nodes.
4. En el cuadro de diálogo, seleccionar «Create a new element at the top level, in Application» y Activity. Pulsar OK.
5. Seleccionar la nueva actividad creada, y en el campo de texto Name, escribir .NoteEdit.

Paso 7

Ya hemos terminado esta segunda entrega del tutorial. Si ejecutamos la aplicación, editamos una nota y pulsamos el botón atrás, veremos que se produce un error. Veremos como solucionar estos problemas en el siguiente post.

Cualquier pregunta o duda (o corrección) en los comentarios.

Ya puedes consultar la tercera parte del tutorial: Tutorial Android paso a paso III: Desarrollo de la aplicación Notepad

Tags ; , , ,

19 comentarios

    Ruben Mar 26, 2010

    Hola! Perdona que empiece a preguntar tan pronto pero la linea de código 1 del paso 1..¿¿donde tengo que ponerla??

    Muchas gracias y un saludo.

    Responder
    Jon Mar 30, 2010

    Hola Ruben, tienes que ponerlo dentro del método onCreate.

    Responder
    Jon Dic 29, 2010

    Hola Rafa, tienes que definirlo así:

    public static final int DELETE_ID = Menu.FIRST;

    y justo antes del método onCreate.

    Un saludo.

    Responder
    Diego May 20, 2011

    Hola,

    en primer lugar muchas gracias por tu trabajo.

    He seguido el tutorial pero no me funciona, puesto que si selecciono una nota si me sale el context menu para elegir la opcion de borrarla, sin embargo, aunque seleccione la opción no se me borra la nota.

    ¿Por qué puede ser?

    Mi metodo es

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch(item.getItemId()){
    case DELETE_ID:
    AdapterContextMenuInfo info=(AdapterContextMenuInfo) item.getMenuInfo();
    mDbHelper.deleteNote(info.id);
    fillData();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    Muchas gracias

    Responder
    Jon May 21, 2011

    Hola Diego, estaría bien saber que error te da exactamente.

    Para saberlo, utiliza LogCat de Eclipse.

    Un saludo.

    Responder
    Diego May 21, 2011

    Hola, gracias por tu contestación.

    El error que muestra el logCat es

    Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43c11440

    Muchas gracias

    Responder
    Diego May 21, 2011

    Hola,

    consegui solucionar ya el error, era fallo mio, ya que el código para borrar una nota estaba en el método onOptionsItemSelected en lugar de en el onContextItemSelected, tanto métodos con nombres parecidos me liaron.

    Gracias de todas formas.

    Un saludo, Diego

    Responder
    Pablo May 30, 2011

    Hola muchísimas gracias por el tutorial esta genial,

    pero tengo un problema lo he copiado tal cual viene en la solución y aun así no me aparece el menu para borrar item.

    Tienes idea de que puede ser?

    Un Saludo y gracias.

    Responder
    David Jun 29, 2011

    Hola, muy buen trabajo

    Responder
    juan Jul 12, 2011

    Hola muy buenos tutoriales, pero tengo una dudilla que me pasa siempre sobre el R.java
    en el primer paso del tutorial, R.(lo que fuese) no funcionaba, tenia que poner R.com.exercise…etc xq el R.java nose porque no iba, ahora en estos nuevos no me acepta ni mi antigua ruta ni la nueva, sabes por que puede ser?
    tampoco me aparecen los R.java cuando importo
    gracias

    Responder
    Noreply Oct 13, 2011

    Hola jon muy bueno el tutorial, ya lo estoy terminando… pero me dan los siguientes errores:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();
    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 = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID) : null;
    if (mRowId == null) {
    Bundle extras = getIntent().getExtras();
    mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) : null;
    }

    * note_edit, tittle, body, confirm , me da error en estos cuatros parametros, no los puedo declarar, es decir los declaro en el R.java pero luego cuando le doy guardar me los borra, ya los declare en el strings.xmls nose que puede ser, es lo unico que me da error

    Responder
    Noreply Oct 13, 2011

    Me salvas la vida si me resolves eso..

    Responder
    Fredy Oct 14, 2011

    Me pasa lo mismo que a «Noreply»: no reconoce «R.layout.note_edit», «R.id.title», «R.id.body» y «R.id.confirm», agregué el note_edit como un archivo XML en la carpeta layout pero no funciona. Probé agregándolos al archivo R pero elimina el código generado porque ese archivo no puede ser modificado manualmente. Gracias por tu respuesta Jon.

    Responder
    Fredy Oct 14, 2011

    «Noreply», ya logré que me reconozca note_Edit y title. En efecto, se tiene que generar el archivo XML note_edit para hacer la interfaz gráfica para la edición de las notas. Sólo falta que me reconozca body y confirm.

    Responder
    Noreply Oct 18, 2011

    Chicos ya lo hice funcionar, tiene que hacer el archivo note_edit como xml sino fijense en el notepad 3 con la solucion que descargaron esta el archivo, lo copian y lo pegan en el suyo.

    Responder
    David MZ Abr 24, 2012

    Hola monstruo, antes de nada decirte que esto está de lujo. Dicho esto, un par de cosillas:
    ACTIVITY_EDIT y CREATE me las da como error, donde las agrego?
    y en onListItemClick, Cursor c= mNotesCursor, mNotesCursor no me lo reconoce, donde lo declaro?
    Gracias.

    Responder
    David MZ Abr 24, 2012

    Viendo la solucion ya se de que va gracias. Solucionado

    Responder
    David MZ Abr 24, 2012

    Nuevo problema, crea una nota nueva, pero cuando le doy a confirmar no me sale la nota en la lista y, si creando la lista, le doy hacia atras, peta.
    Alguna idea. Gracias

    Responder

Responde a David MZ Cancelar la respuesta

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.