Creación de opciones en el Menú y un Dialog

“Desarrollo de Aplicaciones Móviles en Android”
Ejercicio Básico C: Creación de opciones en el Menú y un
Dialog
A. Descripción
El ejercicio consistirá en crear dos opciones en el menú de una aplicación de Android, las cuales nos permitan añadir y eliminar elementos de la lista. Para simplificarlo añadiremos y eliminaremos por el final de la lista.


B. Implementación
Los menús son una parte importante de toda aplicación, y más en Android, ya que nos permite mostrar numerosa información cuando el usuario la solicite. En este ejercicio vamos a ver como implementar menús en pantalla.
Crearemos una sola opción en el menú, la cual contendrá a su vez un submenú con dos opciones, la de añadir y la de eliminar elemento de la lista. Dichas opciones deberán quedar identificadas por un entero, de la siguiente manera:

private static final int OPTION_MENU_1 = Menu.FIRST;

private static final int OPTION_MENU_2 = Menu.FIRST + 1;

Para incluir opciones en el menú, debemos utilizar el método onCreateMenuOptions(), el cual nos permite detallar las partes que tendrá nuestro menú. Un ejemplo es el siguiente:

/* Creates the menu items */
public boolean onCreateOptionsMenu(Menu  menu) { menu.add(0, MENU_NEW_GAME, 0, "New Game"); menu.add(0, MENU_QUIT, 0, "Quit");
return true;

}
También se pueden incluir submenús en nuestra aplicación, para ello únicamente debemos crear un submenú y añadirlo a la opción del menú. Un ejemplo (dentro del método onCreateOptionsMenu()):

SubMenu fileMenu = menu.addSubMenu("File");
fileMenu.add("new"); fileMenu.add("open"); 
fileMenu.add("save");
Donde el método addSubMenu()es el siguiente:

addSubMenu (int groupId, int itemId, int order, CharSequence title)

Cuyos parámetros son los siguientes:

groupId – El identificador de grupo al cual pertenece éste item. Se usa NONE si no está en ninguno.
itemId - Identificador único de opción. Usa NONE si no necesita tener un único identificador.
Order – El orden del item. Usar NONE si no importa el orden
Title – El texto que se mostrará en la opción.




Para obtener el nuevo dato que insertaremos, utilizaremos un AlertDialog, que es un diálogo emergente que permite realizar diferentes acciones. Cuando queremos mostrar un Diálogo, realizamos la llamada a showDialog(int), pasándole un entero que identifique únicamente al diálogo que queremos mostrar. Cuando un diálogo es creado por primera vez, Android llama al método onCreateDialog() de nuestra actividad, que es donde se debe crear la instancia del diálogo. A éste método Android le pasa el mismo ID que se realizó en la llamada a showDialog(int). Después de crear el objeto Dialog deberemos devolverlo al final del método.

La mejor manera de definir el método onCreateDialog(), es con una sentencia switch que compruebe el identificador del Dialog pasado en el método. Un ejemplo puede ser el siguiente:

static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;


protected Dialog onCreateDialog(int id) {  Dialog dialog;switch(id) {
case DIALOG_PAUSED_ID:
// Definimos el Dialog para PAUSE_ID
break;
case DIALOG_GAMEOVER_ID:
// Definimos el Dialog para GAMEOVER
break;
default:
dialog = null;
}
return dialog;

}

Así para mostrar los diálogos, realizaríamos la llamada a showDialog() con el identificador del diálogo que queramos, por ejemplo:

showDialog(DIALOG_PAUSED_ID);

La ejecución del ejercicio debería quedar de la siguiente manera:


Para crear nuestro propio diálogo, que tendrá el aspecto de la figura anterior, debemos crear un layout con el contenido del mismo. Así el LinearLayout tendrá un TextView (“Nuevo Dato”) y un EditText donde insertar dicho dato.

Para la creación de la vista en tiempo de ejecución, deberemos “inflar” la vista desde un layout (es decir, obtener la vista desde un fichero xml donde se defina la misma). Para ello, utilizamos un objeto LayoutInflater, obteniendo dicho objeto en el contexto actual, para posteriormente “inflar” la vista desde el fichero que contiene el xml:

LayoutInflater factory = LayoutInflater.from(this);

final View newView = factory.inflate(R.layout.view, null);
C. Pasos a seguir
1. Cargar el código del proyecto Ejercicio Basico C Menus y dialogs -> Inicial


2. Creamos las constantes que diferenciarán las opciones del menú.


3. Añadir el submenú con 2 opciones al menú de la aplicación sobreescribiendo el método onCreateOptionsMenu(). La opción principal tendrá como nombre “Opciones”, y las dos opciones del submenú “Añadir elemento” y “Eliminar elemento”.

SubMenu sub = menu.addSubMenu (
SubMenu.NONE, MENU_ADD_OR_DEL, SubMenu.NONE, "Opciones");


sub.add(SubMenu.NONE, MENU_ADD, SubMenu.NONE, "Añadir");
4. Detectar que opción del menú o submenú fue seleccionada sobreescribiendo el método onOptionsItemSelected(), mediante un switch del identificador del ítem (item.getItemId()).

public boolean onOptionsItemSelected  (MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD:
break;
}
return super.onOptionsItemSelected(item);

}
5. Realizar las acciones necesarias para eliminar un elemento del final de la lista.


6. Creamos un nuevo layout (“dialog_text_entry.xml”), que contendrá un LinearLayout con el TextView y el EditText necesario. NOTA: Al TextView le establecemos el andr oid: id a data_view, y el Texto a “Nuevo Dato”. Mientras que el EditText, deberá tener como identificador dato_edit. Se deja en manos del alumno modificar otras propiedades para que el aspecto visual mejore.


7. Ahora debemos sobreescribir el método onCreateDialog(), quedando de la siguiente manera:

@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOGO_NUEVO_DATO:
LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView =

factory.inflate(R.layout.dialog_text_entry, null);
return new AlertDialog.Builder(Actividad.this)
.setTitle("Inserta nuevo dato")
.setView(textEntryView)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick( DialogInterface dialog, int whichButton) {

/* Insertamos el nuevo elemento */

}
})
.setNegativeButton("Cancelar",
new DialogInterface.OnClickListener() {
public void onClick( DialogInterface dialog, int whichButton) {

/* No hacemos nada */
}
})
.create();

}

return null;
}


8. Realizar las acciones necesarias para insertar un elemento por el final de la lista.
Utilizamos el método add(), y actualizamos el Adapter del array de elementos mediante la siguiente función: NOTA: ¡OJO! Con dónde poner el actualizarArray().

public void actualizarArray() {
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mArray));

}