Interfaces de usuario [Desarrollo de aplicaciones para Android] M. en C. Sergio Luis Pérez Pérez UAM C UAJIMALPA , M ÉXICO, D. F. Trimestre 14-P Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 1 / 33 Actividades e intenciones Actividades e intenciones 1 Actividades e intenciones 2 Creación de menús 3 Uso de la vista ListView Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 2 / 33 Actividades e intenciones Actividades e intenciones I Una actividad en Android es equivalente a lo que conocemos como ventanas. Lo ideal es asociar una clase por actividad. Todas las actividades que se desarrollen deben heredar de Activity. Los pasos generales para crear nuevas actividades son: 1 Crear un nuevo layout para la actividad que se desea crear. 2 Crear una nueva clase descendiente de Activity. 3 Asociar el layout creado a la nueva clase. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 3 / 33 Actividades e intenciones Actividades e intenciones II 4 Activar la nueva actividad desde alguna otra actividad (si es que no es la principal). 5 Registrar la nueva actividad en el archivo AndroidManifest.xml. Para realizar la comunicación entre actividades se utilizan instancias de intenciones, que se realizan mediante la clase Itent. Para enviar datos de una actividad a otra se utiliza el método putExtra de la clase Intent. Intent nueva intencion = new Intent(this, ActividadALanzar.class); nueva intencion.putExtra(“nombre dato”, “valor dato”) startActivity(nueva intencion); Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 4 / 33 Actividades e intenciones Actividades e intenciones III La actividad que recibe los datos requiere una instancia de la clase Bundle. Para obtener los datos que vengan de otra actividad se utilizará el método getTipoDeDato de la clase Bundle. Bundle extras = getIntent().getExtras(); TipoDeDato dato = extras.getTipoDeDato(“nombre dato”); La actividad lanzada también puede devolver datos a la que la invocó, una vez que termine. Del lado de la actividad lanzadora se utiliza el método startActivityForResult en lugar del método startActivity. Intent nueva intencion = new Intent(this, ActividadALanzar.class); startActivityForResult(nueva intencion, codigoDeSolicitud); Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 5 / 33 Actividades e intenciones Actividades e intenciones IV Además se sobre-escribe el método onActivityResult, Ejemplo: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode == codigoDeSolicitud && resultCode == RESULT OK){ TipoDeDato dato = data.getExtras().getTipoDeDato(“dato”); } } Finalmente, en alguna parte de la actividad llamada se debe utilizar un código como el siguiente: public void regresarDeActividad(View V){ Intent intencionRegreso = new Intent(); intencionRegreso.putExtra(“dato”, “valor dato”); setResult(RESULT OK, intencionRegreso); finish();} Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 6 / 33 Actividades e intenciones Actividades e intenciones V Ejercicio: crear una actividad que se visualice al pulsar un botón de otra actividad. 1 Cree una aplicación de Android que contenga al menos un botón o bien utilice una que ya tenga creada. 2 En el directorio res/layout crear un nuevo archivo Android XML file con el nombre que prefiera y que contenga a una vista de tipo TextView. 3 Agregue los atributos de id y text a la vista TextView en el xml. 4 Cree una nueva clase, llamada AcercaDe, para asociarla con dicha actividad. Dicha clase deberá heredar de Activity y sobre-escribir el método onCreate. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 7 / 33 Actividades e intenciones Actividades e intenciones VI 5 En la clase principal de la aplicación agregue un método que será asociado a un botón que, al presionarse, lanzará la actividad creada. Para ello requerirá crear una instancia de tipo Intent. public void mostrarAcercaDe(View view){ Intent nueva intencion = new Intent(this, AcercaDe.class); startActivity(nueva intencion); } 6 Asocie el evento onClick de algún botón al método creado (android:onClick=“mostrarAcercaDe”). 7 Luego registre la nueva actividad creada en el archivo AndroidManifest.xml. 1 En el archivo AndroidManifest.xml seleccione la pestaña de Application. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 8 / 33 Actividades e intenciones Actividades e intenciones VII 2 En la opción de Application Nodes presione el botón de agregar (Add). 3 Rellene los campos necesarios (al menos el campo Name y opcionalmente Theme y Label) y guarde los cambios. 8 Ejecute la aplicación y observe los resultados. 9 Realice lo mismo ahora con otro botón y con una nueva actividad, pero ahora debe enviar datos a la actividad lanzada y recibir datos al finalizar ésta. 10 Ejecute la aplicación y observe los resultados. 11 Finalmente, realice un método escuchador por código para algún botón, el cual permita finalizar la aplicación. Para ello realice los siguientes pasos: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 9 / 33 Actividades e intenciones Actividades e intenciones VIII Cree un botón en la actividad principal llamado Salir. Cree un método llamado finalizar que implemente la interfaz escuchadora del botón Salir. public void salirDeActividad(int referencia){ Button boton = (Button) findViewById(referencia); boton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { finish(); } }); } Dentro del método onCreate mande llamar el método creado (por ejemplo: salirDeActividad(R.id.boton salir);). Ejecute la aplicación y observe los resultados. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 10 / 33 Actividades e intenciones Actividades e intenciones IX Las intenciones son la forma de realizar acciones o tareas. Las intenciones permiten lanzar actividades o servicios desde las aplicaciones. Las intenciones se clasifican en dos tipos: Explicitas: indican exactamente cuál es el componente que se desea lanzar. Se utiliza el constructor Intent(Context contexto, Class<? > clase). Ejemplo: Intent intencion = new Intent(this, NombreDeLaClase.class); startActivity(intencion); Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 11 / 33 Actividades e intenciones Actividades e intenciones X Implı́citas: solicitan tareas abstractas (como la intención de enviar mensajes) y se realizan en tiempo de ejecución. Se utiliza el constructor Intent(String accion, Uri uri). Ejemplo: Intent intencion = new Intent(Intent.ACTION DIAL, URI.parse(“tel:1234567890”)); startActivity(intencion); El principal uso de las intenciones es para: Lanzar actividades mediante startActivity(). Lanzar servicios mediante startService(). Lanzar anuncios de tipo broadcast mediante sendBoradcast(). Comunicar servicios mediante bindService(). Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 12 / 33 Actividades e intenciones Actividades e intenciones XI La intenciones podrán ser lanzadas por la aplicaciones o bien por el sistema. Los principales criterios que deben tomarse en cuenta al crear intenciones son: Nombre del componente: se indica el componente que se desea lanzar mediante su nombre completo. Acción: es la cadena de caracteres donde se indica la acción a realizar. Puede ser predefinida o propia. Categorı́a: sirve para complementar las acciones mediante información adicional del componente a lanzar. Datos: permiten referenciar a los datos con los que se trabajará. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 13 / 33 Actividades e intenciones Actividades e intenciones XII Extras: permiten especificar la información adicional con la que se trabajará en el componente que será lanzado. Para esto se utiliza el método putExtra(). Ejemplos de acciones predefinidas son: Constante Acción ACTION CALL Inicia una llamada telefónica ACTION EDIT Permite la edición de datos ACTION MAIN Inicia como la actividad principal ACTION SYNC Sincroniza los datos del dispositivo en un servidor ACTION BATTERY LOW Advertencia baterı́a baja ACTION SCREEN ON Activa la pantalla Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 14 / 33 Actividades e intenciones Actividades e intenciones XIII Ejemplos de categorı́as predefinidas son: Constante Descripción CATEGORY BROWSABLE Indica que la actividad lanzada puede mostrar los datos referenciados por un enlace. CATEGORY HOME La actividad muestra la pantalla de inicio del dispositivo (o bien tecla HOME). CATEGORY PREFERENCE Indica que la actividad a lanzar es un panel de preferencias. Ejercicio: Creación de intenciones implı́citas. 1 Cree un nuevo proyecto que contenga en la actividad principal cinco botones con los siguientes nombres: Abrir un sitio Web Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 15 / 33 Actividades e intenciones Actividades e intenciones XIV Realizar una llamada. Abrir Google Maps. Tomar una fotografı́a. Escribir un correo. 2 Después cree los siguientes métodos y asocie cada uno de ellos al correspondiente botón (mediante el atributo onClick). public void abrirPaginaWeb(View vista){ Intent intencion = new Intent(Intent.ACTION VIEW, Uri.parse(“https://computacion.cs.cinvestav.mx/ sperez/”)); startActivity(intencion); } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 16 / 33 Actividades e intenciones Actividades e intenciones XV public void realizarLlamada(View vista){ Intent intencion = new Intent(Intent.ACTION CALL, Uri.parse(“tel:5554756506”)); startActivity(intencion); } public void abrirGoogleMaps(View vista){ Intent intencion = new Intent(Intent.ACTION VIEW, Uri.parse(“geo:41.656313,-0.877351”)); startActivity(intencion); } public void tomarFoto(View vista){ Intent intencion = new Intent(“android.media.action.IMAGE CAPTURA”); startActivity(intencion); } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 17 / 33 Actividades e intenciones Actividades e intenciones XVI public void escribirCorreo(View vista){ Intent intencion = new Intent(Intent.ACTION SEND); intencion.setType(“text/plain”); intencion.putExtra(Intent.EXTRA SUBJECT, “Descripcion del asunto”); intencion.putExtra(Intent.EXTRA TEXT, “Texto del correo”); intencion.putExtra(Intent.EXTRA EMAIL, new String[]“[email protected]”); startActivity(intencion); } 3 Para que sea posible realizar llamadas en el archivo AndroidManifest.xml se debe insertar la siguiente lı́nea que proporciona los permisos adecuados a nuestra aplicación. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 18 / 33 Actividades e intenciones Actividades e intenciones XVII <uses-permission android:name=“android.permission.CALL PHONE”/ > 4 Ejecute la aplicación y observe los resultados. Nota: si la aplicación es ejecutada en el emulador puede ser que algunos botones no funcionen por lo que se recomienda utilizar un dispositivo real. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 19 / 33 Creación de menús Creación de menús 1 Actividades e intenciones 2 Creación de menús 3 Uso de la vista ListView Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 20 / 33 Creación de menús Creación de menús I Se pueden asociar menús a las actividades, los cuales pueden ser desplegados al presionar el botón menú del dispositivo. Estos menús son bastante útiles pues se mantienen ocultos hasta que dicho botón es presionado. Para crear un menú se realizan los siguientes pasos: 1 Sobre el directorio res pulse el botón derecho y solicite crear un nuevo archivo XML eligiendo en la opción Resource Type = Menu, el nombre puede ser menu.xml. 2 En el nuevo archivo menu.xml que aparece, mediante el botón Add, agregue un par de elementos de tipo item. 3 Agregue las propiedades adecuadas a los items como tı́tulo y algunas imágenes. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 21 / 33 Creación de menús Creación de menús II 4 Para que el menú funcione primero es necesario sobre-escribir el método onCreateOptionsMenu en el código java de la actividad principal, el cual asociará dicho menú al botón menú del dispositivo (en el emulador se activa con la tecla F2). @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true;//se hace visible el menu } 5 Para activar la funcionalidad deseada al presionar cada elemento de menú, se debe sobre-escribir el método onOptionsItemSelected, Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 22 / 33 Creación de menús Creación de menús III también en el código java de la actividad principal. @Override public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id.menuItem1:{ metodoMenuItem1(null); }break; case R.id.menuItem2:{ metodoMenuItem2(null); }break; default:break; } return true;//permite terminar el elemento correctamente } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 23 / 33 Uso de la vista ListView Uso de la vista ListView 1 Actividades e intenciones 2 Creación de menús 3 Uso de la vista ListView Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 24 / 33 Uso de la vista ListView Uso de la vista ListView I La vista ListView permite visualizar una lista vertical deslizable de varios elementos. Cada uno de los elementos de ListView puede definirse como layouts. Cualquier actividad que vaya a visualizar un ListView debe heredar de ListActivity. Para crear un ListView se realizan los siguientes pasos: 1 Se diseña un layout que contenga un ListView. 2 Se diseña un layout el cual simplemente se repetirá en la lista. 3 Se crea una actividad que visualice el layout con el ListView. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 25 / 33 Uso de la vista ListView Uso de la vista ListView II 4 Finalmente, se personaliza cada uno de los elementos del ListView. Un ListView deben ir dentro de un FrameLayout y acompañados de una vista como TextView con la finalidad de desplegar algún otro valor en caso de que no haya elementos en la lista. <FrameLayout · · · > <TextView android:id=“@android:id/empty” .../ > <ListView android:id=“@android:id/list” .../ > < /FrameLayout> En el método onCreate() de la clase que corresponda al ListView debe agregarse el método setListAdapter con la finalidad de asociar los objetos de una lista al ListView. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 26 / 33 Uso de la vista ListView Uso de la vista ListView III setListAdapter(new ArrayAdapter<String> (this, android.R.layout.layoutLista, R.id.titulo, Lista)); setListAdapter proporciona el cursor para un ListView. El ArrayAdapter espera por defecto las referencias de recursos previstas en un TextView. ArrayAdapter permite también diseños mas complejos. Puede encontrar más información en http://developer.android.com/reference/android/widget/ArrayAdapter.h En el ejemplo anterior tenemos: this: contexto de la aplicación. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 27 / 33 Uso de la vista ListView Uso de la vista ListView IV android.R.layout.layoutLista: es la referencia de recurso que se utilizará para todos los elementos de la lista. R.id.titulo: identifica el id de la vista que sera desplegada. Lista: contiene la información que deberá ser desplegada en los elementos del ListView. Ejercicio: crear un ListView visualizando sus elementos como layouts. 1 Cree un nuevo layout de tipo LinearLayout e incluya un FrameLayout el cual contendrá dentro el ListView deseado. La estructura del xml debe ser parecida a la siguiente: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 28 / 33 Uso de la vista ListView Uso de la vista ListView V <LinearLayout · · · > <TextView . . . / > <FrameLayout · · · > <TextView android:id=“@android:id/empty” .../ > <ListView android:id=“@android:id/list” .../ > < /FrameLayout> < /LinearLayout> 2 Registre la nueva actividad en el documento AndroidManifest.xml. 3 Realice un layout que represente a cada uno de los elementos de la lista. La propiedad más importante es el alto del elemento y se denota mediante: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 29 / 33 Uso de la vista ListView Uso de la vista ListView VI “?android:attr/listPreferredItemHeight” que es un parámetro estándar de configuración del sistema. <RelativeLayout . . . android:layout width=“fill parent” android:layout height=“?android:attr/listPreferredItemHeight”> <ImageView android:layout width=“?android:attr/listPreferredItemHeight” android:layout height=“fill parent” android:src=“@drawable/imagen1”/ > <TextView android:layout toRightOf=“@id/icono” android:layout alignParentTop=“true” android:textAppearance=“?android:attr/textAppearanceLarge” android:singleLine=“true”/ >< /RelativeLayout> Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 30 / 33 Uso de la vista ListView Uso de la vista ListView VII 4 Ejecute la aplicación y observe los resultados. Si se desea personalizar cada elemento del ListView (con diferentes textos, imágenes, etc.) entonces se debe crear el propio ListView heredando de la clase BaseAdapter. El constructor de la clase personalizada sólo requiere recibir la lista de elementos (registro de records, referencias de imágenes, etc.) y la actividad correspondiente, ası́ como llamar a la clase padre con super(). Para implementar la funcionalidad completa se deben sobre-escribir los siguientes métodos: View getView(int position, View convertView, ViewGroup parent): permite construir un objeto View con el layout correspondiente a la posición denotada por position. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 31 / 33 Uso de la vista ListView Uso de la vista ListView VIII int getCount(): permite conocer el número de elementos en la lista. Object getItem(int position): devuelve el position-ésimo elemento de la lista. long getItemId(int position): devuelve el position-ésimo identificador del correspondiente elemento de la lista. El único método que merece la pena detallar es getView(). Se construye un objeto View, a partir de un layout predefinido, mediante el uso del método inflate de la clase LayoutInflater. Se coloca el texto e imagen que corresponda. Finalmente se debe llamar al método setListAdapter en la clase Java que desplegará al ListView, de forma similar a la siguiente: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 32 / 33 Uso de la vista ListView Uso de la vista ListView IX setListAdapter(new MiListView (this, argumentos)); @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = actividad.getLayoutInflater(); View vista = inflater.inflate(R.layout.mi layout elemento, null, true); TextView texto = (TextView) vista.findViewById(R.id.titulo); texto.setText(lista.elementAt(position)); ImageView imagen = (ImageView) vista.findViewById(R.id.icono); imagen.setImageResource(R.drawable.imagenDeseada); return vista; } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 33 / 33