Búsqueda personalizada

Blog personal para aprender a programar en Android desde cero.

jueves, 22 de abril de 2010

Notepad Tutorial - Ejercicio 2

Ejercicio 2

En este ejercicio añadiremos una segunda Activity para crear, editar y eliminar notas.






Paso 1

Abrimos el proyecto Notepadv2 en Eclipse. El punto de inicio de este proyecto es la solución del ejercicio 1:

  1. File > New > Android Project
  2. Seleccionamos Create project from existing source
  3. Seleccionamos el directorio Notepadv2 que nos hemos descargado antes
  4. La mayoría de propiedades del proyecto se rellenan automáticamente. Seleccionamos el Target, en Android Labs nos recomiendan seleccionar la versión del sdk menor para que sea compatible con la mayor cantidad de dispositivos.
  5. Pulsamos en Finish

Como veis son los mismo pasos que para el ejercicio 1.


Paso 2


En primer lugar, vamos a crear el menú contextual que permitirá a los usuarios borrar las notas una a una. Miramos la clase Notepadv2.
Para que cada elemento de la lista en el ListView sea accesible desde el menú de contexto, llamamos al método registerForContextMenu() pasándole el ListView:

                registerForContextMenu (getListView ());

Como nuestra Activity hereda de la clase ListActivity, getListView()nos devuelve el objeto local ListView. Ahora, cada elemento del ListView activa el menú contextual.


Ahora completamos el método onCreateContextMenu(), que será similar al menú de opciones. Añadiremos una línea para poder eliminar una nota desde el menú:


        public boolean onCreateContextMenu(Menu menu, View v
                ContextMenuInfo menuInfo) {
                        super.onCreateContextMenu(menu, v, menuInfo);
                        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
        }



Paso 3

Ahora tenemos que controlar lo que hacemos cuando seleccionamos la opción del menú contextual. El método que tenemos que implementar es:

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

Para saber que ítem tenemos que eliminar lo hacemos con un objeto de tipo AdapterContextMenuInfo, que obtenemos con el método getMenuInfo().



Paso 4

Todavía en la clase Notepadv2 creamos el siguiente método:

        private void createNote() {

             Intent i = new Intent(this, NoteEdit.class);
             startActivityForResult(i, ACTIVITY_CREATE);
        }


El método startActivityForResult() lanza el Intent devolvuendo un valor, en este caso un int.



Paso 5

Rellenamos el método:

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


Este método se invoca cada vez que seleccionamos un elemento de la lista. Con Intent.putExtra() añadimos la información de la nota, para así poderla editar más tarde.




Paso 6

Los métodos anteriores createNote() y onListItemClick() se llaman de manera asíncrona. Para controlar el retorno de la llamada lo haremos sobreescribiendo el método onActivityResult(). Esto lo podemos hacer ya que hemos lanzado el Intent con startActivityForResult().


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


Diferenciamos entre la modificación o creación de una nota. En la creación recogemos del Bundle el title y el body, y llamamos a mDbHelper.createNote(). En la modificación primero tenemos que conseguir el Id de la fila, después también conseguimos el title y el body del Bundle y llamamos a mDbHelper.updateNote().




Paso 7

En este paso simplemente echamos un vistazo al fichero note_edit.xml. Es el layout más complejo del ejercicio pero únicamente vemos que de nuevo sólo está layout_weight=1. Este parámetro nos indica la "importancia" o peso del elemento en la vista. Por defecto el valor es 0.
Este es el layout de la pantalla de edición de una nota.


Paso 8

Para poder la pantalla de edición de las notas, creamos un clase que llamamos NoteEdit que herede de Activity y sobreescribimos el método onCreate(Bundle):


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


Paso 9

Ahora completamos el método onClick() que nos faltaba por rellenar:

            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 10

El último paso es añadir nuestra Activity al AndroidManifest.xml para que la Activity sea visible para Android:








  1. Doble click en el fichero AndroidManifest.xml para abrirlo.
  2. Click en la pestaña Application del editor de Manifest.
  3. En la sección Application Nodes pulsamos en Add...
  4. Nos aseguramos que tenemos seleccionado Activity y click en OK.
  5. De nuevo en la sección Application Nodes pulsamos en la nueva Activity, y a la derecha escribimos .NoteEdit en el campo Name*. Pulsamos Intro.


También podemos añadirlo manualmente en el fichero AndroidManifest.xml de la siguiente manera:

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



Y a correr!



















































No hay comentarios:

Publicar un comentario