Un submenú puede ser añadido dentro de cualquier otro menú excepto dentro de otro submenú. Los submenús son muy útiles cuando la aplicación presenta muchas opciones que pueden ser organizadas por temas, por ejemplo: archivo, edición, herramientas, etc.
Un submenú se añade a otro menú existente mediante el método addSubMenu(). Este método devuelve el objeto de tipo SubMenu y entonces con este objeto devuelto se pueden añadir opciones al submenú con el método add().
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
SubMenu fileMenu = menu.addSubMenu("File");
SubMenu editMenu = menu.addSubMenu("Edit");
fileMenu.add("new");
fileMenu.add("open");
fileMenu.add("save");
editMenu.add("undo");
editMenu.add("redo");
return result;
}
Las llamadas para los artículos seleccionados del submenú son hechas dentro de la llamada al método de selección del menú padre, en este ejemplo se harían dentro del método onOptionsItemSelected().
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, EDIT_ID, 0, "Edit");
menu.add(0, DELETE_ID, 0,"Delete");
}
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case EDIT_ID:
editNote(info.id);
return true;
case DELETE_ID:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
En el onCreateContextMenu(), no sólo se pasa el ContextMenu al cual añadiremosMenuItems, sino tambiénla Vista que fue seleccionada y un objetode tipo ContextMenuInfo, que proporciona la información adicional sobre el objeto que fue seleccionado. En este ejemplo, en el onCreateContextMenu() sólo se han añadido dos opciones al menú. En la llamada a onContextItemSelected(), solicitamosel AdapterContextMenuInfo del MenuItem, que proporciona la información sobre el artículo actualmente seleccionado. Todo lo que necesitamos de este el ID para el artículo seleccionado, para editar o eliminar una nota, encontramos el ID con el campo: AdapterContextMenuInfo.info del objeto. Este ID es pasado al editNote() y al deleteNote(), estos métodos se programan con la acción respectiva a tomar.
Finalmente para registrar el Menú de contexto al ListView pasamos la lista entera al método registerForContextMenu(View):
registerForContextMenu(getListView());
Se puede pasar cualquier tipo de objeto declarado en la Vista para registrar el menú de contexto. En este ejemplo getListView() devuelve el objeto de tipo ListView usado en la actividad de la aplicación, como parte de esto, cada artículo de la lista es registrado al menú de contexto.
El layout es la arquitectura para la interfaz de usuario de una Actividad. Define la estructura de disposición y contiene todos los elementos que le aparecen al usuario. Usted puede declarar su layout de dos formas:
·Declarar elementos UI en XML: Androide proporciona un vocabulario XML que corresponde a las clases View y subclases, tales como: widgets y su disposicion.
·Elementos de disposición Instanciados en tiempo de ejecución: Su aplicación puede crear objetos ViewGroup y View (y manipular sus propiedades) en tiempo de ejecución.
Androide le brinda la facilidad de utilizar ambas formas para declarar y manejar los objetos de UI de su aplicación. Por ejemplo, usted podría declarar las disposiciones por defecto de su aplicación en XML, incluso los elementos que aparecerán en pantalla con sus propiedades y después añadir el código en su aplicación que modificaría el estado estos objetos, en tiempo de ejecución.
La ventaja a la declaración de su UI en XML es que esto le permite separar mejor la presentación de su del código de la aplicación que controla su comportamiento. Las descripciones UI son externas a su código de aplicación, lo que significa que usted puede modificarlo o adaptarlo sin necesidad de modificar su código fuente y compilar de nuevo. Por ejemplo, usted puede crear layout en XML para orientaciones de pantalla diferentes, tamaños de pantalla de dispositivo diferentes, y lenguajes diferentes. Además, la declaración del layout en XML hace más fácil para visualizar la estructura de su UI, entonces es más fácil eliminar los fallos de la aplicación.
Un rasgo fundamental de Androide es que una aplicación puede hacer uso de los elementos de otras aplicaciones (siempre y cuando ésta lo permita). Por ejemplo si usted tiene que mostrar una lista de contactos y hay otra aplicación que lo hace y lo ha puesto a disposición de nosotros, usted puede pedir esta lista de contactos para que haga su trabajo. Su aplicación no incorpora el código de la otra aplicación, simplemente ejecuta el trozo de código necesario cuando se necesite.
Para esto el sistema debe ser capaz de iniciar un proceso de aplicación cuando este sea requerido e instanciar los objetos de Java para aquella parte. Por lo tanto a diferencia de muchas de las aplicaciones de otros sistemas, androide no tiene un punto de entrada único para toda la aplicación (no tiene la función main(), por ejemplo). En su caso presenta componentes esenciales que el sistema puede instanciar y correr cuando sean necesario. Existen cuatro de tipos de componentes:
1.Actividades (Activities)
Una actividad presenta una interfaz visual para el usuario mediante la cual éste puede realizar determinada tarea. Por ejemplo una aplicación de mensajería puede presentar una actividad con una lista de usuarios a enviar los mensajes, una segunda actividad para escribir el mensaje al usuario seleccionado y otras actividades para examinar viejos mensajes guardados o realizar algunos cambios. Cada actividad aunque trabajen en conjunto, es independiente de las demás, cada una es implementada como una subclase de la clase base Activity.
2.Servicios (Services)
Un servicio no presenta una interfaz visual para el usuario, corre en un segundo plano por un determinado período de tiempo. Por ejemplo, un servicio podría tocar la música de fondo mientras el usuario está realizando otras tareas, o podría calcular determinados datos y pasarle el resultado a alguna actividad que lo necesite. Un servicio extiende de la clase base Service.
3.Receptores de emisión (Broadcast receivers)
Un receptor de emisión solamente recibe y reacciona para recibir anuncios, por ejemplo, que la batería se está agotando o que el usuario cambió alguna preferencia de lenguaje. Una aplicación puede presentar cualquier número de receptores de emisión, todos heredan de la clase base BroadcastReceiver. Los receptores de emisión no muestran una interfaz de usuario. Sin embargo, ellos pueden iniciar una actividad en respuesta a la información que reciben, o pueden usar NotificationManager para alertar al usuario.
4.Proveedores de contenido(Content providers)
Un proveedor de contenido hace un específico juego de datos de la aplicación para hacerlos disponibles a otras aplicaciones, los datos pueden ser almacenados en un sistema de archivos o en una base de datos SQLite, o en cualquier otra manera que tenga sentido. Hereda de la clase base ContentProvider y pone a disposición una serie de métodos que permiten a otras aplicaciones recuperar y almacenar los datos que él controla, sin embargo las aplicaciones no llaman a estos métodos directamente, sino que usan un objeto del tipo ContentResolver que puede conectarse con cualquier ContentProvider y llamar a sus métodos.