Aprende Android

Vaya al Contenido

Menu Principal

Construcción de menús

¿Qué vamos a ver?

  • Construcción de un menú con opciones (cuando se presiona la tecla menú del móvil)

  • Construcción de un menú contextual (lista emergente de elementos de menú, que se presenta cuando presionamos un instante un elemento)


Comencemos con el menú con opciones


Empecemos creando una carpeta en la carpeta “res” del directorio, a la que llamaremos “menu”.
Dentro de esa capeta “menu”, vamos a agregar un archivo al que vamos a llamar “list_menu.xml” (que no se te olvide poner la extensión al archivo al darle el nombre).

Abrimos ese archivo y escribimos el siguiente código:

<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android">
   <item
     android:icon="@android:drawable/ic_menu_add"
     android:id="@+id/menu_insert"
     android:title="@string/menu_insert" />
</menu>

Ahora nos vamos al archivo “strings.xml” y creamos un nuevo string:

     
<string name="menu_insert">Agregar recordatorio</string>

Nos vamos al archivo “ReminderListActivity.class” y escribimos al final (antes de la última llave) el siguiente código:

@Override
     public boolean onCreateOptionsMenu(Menu menu) {
           super.onCreateOptionsMenu(menu);
           MenuInflater mi = getMenuInflater();
           mi.inflate(R.menu.list_menu, menu);
           return true;
}


Una vez se ha creado el menú, cuando se hace clic en él, se tiene que realizar una acción. Para ello, al final del archivo de la clase, copia el siguiente código:

@Override
  public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
        case R.id.menu_insert:
              createReminder();
              return true;
        }
        return super.onMenuItemSelected(featureId, item);
  }

Un poquito de explicación:

En la línea 2 está el método al que se llama cuando se selecciona un elemento del menú. El parámetro featureId, identifica al grupo en el que se encuentra el menú. El parámetro item identifica el elemento del menú en el que se hizo clic.
En la siguiente línea, se determina con qué elemento se está trabajando, comparando el Id del item del menú, con los elementos del menú que tenemos. Se obtiene el Id del menú mediante el método getItemId().
En la línea 5 del código anterior, se consigue que se cree una tarea a través de createReminder(), si el elemento del menú donde se hizo clic era el de agregar una tarea.
En la siguiente, se informa al método onMenuItemSelected(), que la selección del menú se ha manipulado.

Se utiliza el createReminder(), para permitir al usuario pasar al ReminderEditActivity, para crear una nueva tarea. Para ello, escribiremos el siguiente método al final del archivo ReminderListActivity.class:

private static final int ACTIVITY_CREATE=0;
     private void createReminder() {
           Intent i = new Intent(this, ReminderEditActivity.class);

           startActivityForResult(i, ACTIVITY_CREATE);   
      
  
Este código crea una nueva intención que inicia el ReminderEditActivity.

startActivityForResult()” se activa cuando la activity ha concluido.

Se utilizan los siguientes parámetros:

  • Intent i: Es la intención que inicia el ReminderEditActivity.

  • ACTIVITY_CREATE: Constante que se define en la parte superior del código.


En la parte final de la clase ReminderListActivity, se escribe el siguiente código, que completa la actividad:

@Override
     protected void onActivityResult(int requestCode, int resultCode, Intent intent)
     {
     super.onActivityResult(requestCode, resultCode, intent);
     // Aquí se recarga la lista

           fillData();


Este código se necesitará para volver a cargar las tareas de la base de datos de SQLite.

Ahora vamos con el menú contextual

Se crea cuando presionamos unos segundos sobre un view.
Se trata de una ventana flotante que aparece sobre la actividad en curso, que permite a los usuarios elegir entre varias opciones.

Su creación es bastante similar a la de un menú de opciones. Se puede definir en XML e inflarse mediante el mismo mecanismo que se utiliza en la creación de un menú de opciones.

Primero es necesario llamar al registerForContextMenu().

La aplicación necesita un mecanismo para eliminar una tarea cuando ya no la necesitemos; para ello utilizamos un menú contextual, que aparece tras presionar unos segundos sobre la tarea a eliminar.

Para crear este menú, vamos a hacerlo mediante la creación de un archivo XML en la carpeta res/menu, que daremos el nombre de “list_menu_item_longpress.xml”, escribiendo el siguiente código en el archivo creado:

<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:id=”@+id/menu_delete”
     android:title=”@string/menu_delete” />
</menu>


En este punto, hay que acordarse de crear el nuevo recurso “menu_delete” en el archivo “strings.xml”:

<string name="menu_delete">Borrar tarea</string>

Como podrás comprobar, a estas alturas se te han borrado todos los errores de la clase ReminderListActivity.

Carguemos el menú


Para cargar el menú, vamos a escribir el siguiente código al final de la clase ReminderListActivity:

@Override
     public void onCreateContextMenu(ContextMenu menu, View v,
                 ContextMenuInfo menuInfo) {
           super.onCreateContextMenu(menu, v, menuInfo);
           MenuInflater mi = getMenuInflater();
           mi.inflate(R.menu.list_menu_item_longpress, menu);
     }


Este código realiza la misma función que el onCreateOptionMenu(), pero en esta ocasión se carga el menú contextual.

Ahora vamos a manejar la selección de los elementos del menú con el siguiente código:

@Override
     public boolean onContextItemSelected(MenuItem item) {
           switch(item.getItemId()) {
                 case R.id.menu_delete:
                       AdapterContextMenuInfo info = (AdapterContextMenuInfo)
                            item.getMenuInfo();
                       mDbHelper.deleteReminder(info.id);
                       fillData();
                       return true;
           }
           return super.onContextItemSelected(item);
     }


En la línea 2 colocamos el método que se llama cuando un elemento del menú contextual está seleccionado. El parámetro item es el elemento que se selecciona en el menú contextual.

En la siguiente línea se utiliza la instrucción switch para determinar qué elemento se ha seleccionado.

En la línea 4, tenemos el id del botón menu_delete del list_menu_item_longpress.xml. Si esta opción está seleccionada, el código que le sigue a esta línea, se ejecuta y se elimina la tarea de la base de datos de SQLite.

Aquí acabamos con los menús.

Deciros que podéis jugar con el código, agregando diferentes opciones al menú contextual, al list_menu_item_longpress.xml y cambiar la llamada al onContextMenuItemSelected(), para realizar acciones diferentes.

(Hasta el próximo día, que espero que sea pronto. Ten un poquitin de paciencia, que estoy en ello)

__________________________________________
Para cualquier duda que tengas sobre este ejemplo, cómprate el libro del que estoy sacando los apuntes. Lo puedes encontrar en internet en esta dirección:


http://eu.dummies.com/store/product/Android-Application-Development-For-Dummies.productCd-047077018X.html


Regreso al contenido | Regreso al menu principal