traspas
Transcripción
traspas
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Android avanzado Sesión 5: Notificaciones © 2012-2013 Depto. Ciencia de la Computación e IA Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Puntos a tratar • Notificaciones Toast • Personalización • Notificaciones de la Barra de Estado • Configuración y uso • Cuadros de Diálogo • Diálogo de Alerta • Diálogo de Confirmación • Diálogo de Selección © 2012-2013 Depto. Ciencia de la Computación e IA 2 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones Toast • Avisos, no requieren confirmación por parte del usuario. • Apariencia por defecto o configurable. • Duración: LENGTH_LONG (3.5 segundos) LENGTH_SHORT (2 segundos) btnDefecto.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Toast toast1 = Toast.makeText(getApplicationContext(), "Toast por defecto", Toast.LENGTH_SHORT); toast1.show(); } }); © 2012-2013 Depto. Ciencia de la Computación e IA 3 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones Toast • Alineación: • void setGravity(int gravity, int xOffset, int yOffset) • Gravity values: CENTER, LEFT, BOTTOM, ... o con alguna combinación de éstas btnGravity.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Toast toast2 = Toast.makeText(getApplicationContext(), "Toast con gravity", Toast.LENGTH_SHORT); toast2.setGravity(Gravity.CENTER|Gravity.LEFT,0,0); toast2.show(); } }); © 2012-2013 Depto. Ciencia de la Computación e IA 4 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones Toast • Personalizar apariencia, layout del Toast: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lytLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:background="#555555" android:padding="5dip" > <ImageView android:id="@+id/imgIcono" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/marcador" /> <TextView android:id="@+id/txtMsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textColor="#FFFFFF" android:paddingLeft="10dip" /> </LinearLayout> © 2012-2013 Depto. Ciencia de la Computación e IA 5 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones Toast • Personalizar apariencia, código: btnLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.lytLayout)); TextView txtMsg=(TextView)layout.findViewById(R.id.txtMsg); txtMsg.setText("Toast Personalizado"); Toast toast3 = new Toast(getApplicationContext()); toast3.setDuration(Toast.LENGTH_SHORT); toast3.setView(layout); toast3.show(); } }); © 2012-2013 Depto. Ciencia de la Computación e IA 6 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones de la Barra de Estado © 2012-2013 Depto. Ciencia de la Computación e IA 7 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones • • • • • • Las Notification son el mecanismo típico que utilizan los servicios para comunicarse con el usuario. No roban el foco a la aplicación actual. Permanecen el tiempo que haga falta hasta ser vistas o descartadas. Permiten mostrar distintos tipos de información. Pueden responder a la pulsación. Se pueden actualizar. © 2012-2013 Depto. Ciencia de la Computación e IA 8 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones • Primero: • Obtenemos acceso al servicio de notificaciones. • Configuramos la notificación superior. //Obtenemos una referencia al servicio de notificaciones String ns = Context.NOTIFICATION_SERVICE; NotificationManager notManager = (NotificationManager) getSystemService(ns); //Configuramos la notificación int icono = android.R.drawable.stat_sys_warning; long hora = System.currentTimeMillis(); Notification notif = new Notification(icono, "Alerta!", hora); © 2012-2013 Depto. Ciencia de la Computación e IA 9 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones • Segundo: • Configuramos el PendingIntent • Configuramos la notificación del desplegable //Configuramos el PendingIntent Intent intent = new Intent(context, Activididad.class); PendingIntent pendIntent = PendingIntent.getActivity( contexto, 0, intent, 0); // Configuramos la mensaje del evento notif.setLatestEventInfo( contexto, "Mensaje de Alerta", "Ejemplo de notificación", pendIntent); © 2012-2013 Depto. Ciencia de la Computación e IA 10 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones • Tercero: • Asignar comportamientos • Mostrar la notificación • El id (NOTIF_ALERTA_ID ) sirve para actualizar la misma notificación o poner una nueva, si es un id nuevo. //AutoCancel: cuando se pulsa la notificación ésta desaparece notif.flags |= Notification.FLAG_AUTO_CANCEL ; //Añadir sonido, vibración y luces notif.defaults |= Notification.DEFAULT_SOUND; notif.defaults |= Notification.DEFAULT_VIBRATE; notif.defaults |= Notification.DEFAULT_LIGHTS; notManager.notify(NOTIF_ALERTA_ID, notif); © 2012-2013 Depto. Ciencia de la Computación e IA 11 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Notificaciones • Cerrar la notificación al pulsar sobre ella: • Utilizando los flags de la notificación: //AutoCancel: cuando se pulsa la notificación ésta desaparece notif.flags |= Notification.FLAG_AUTO_CANCEL ; • Desde el método onResume() de la actividad: @Override protected void onResume() { super.onResume(); notManager .cancel(NOTIF_ALERTA_ID ); } © 2012-2013 Depto. Ciencia de la Computación e IA 12 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Ejemplo: notificaciones con AsyncTask private class MiTarea extends AsyncTask<String, String, String>{ public static final int NOTIF_ID = 1; Notification notification; NotificationManager notificationManager; @Override protected void onPreExecute() { super.onPreExecute(); notificationManager = (NotificationManager)getSystemService( Context.NOTIFICATION_SERVICE); notification = new Notification(R.drawable.icon, "Mensaje evento", System.currentTimeMillis()); } @Override protected String doInBackground(String... params) { while(condicionSeguirEjecutando){ if(condicionEvento) publishProgress("Información del evento"); } return null; } @Override protected void onProgressUpdate(String... values) { Intent notificationIntent = new Intent( getApplicationContext(), MiActividadPrincipal.class); PendingIntent contentIntent = PendingIntent.getActivity( getApplicationContext(), 0, notificationIntent, 0); notification.setLatestEventInfo (getApplicationContext(), values[0], contentIntent); notificationManager.notify (NOTIF_ID, notification); } } © 2012-2013 Depto. Ciencia de la Computación e IA 13 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Cuadros de Diálogo © 2012-2013 Depto. Ciencia de la Computación e IA 14 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo de Alerta Permiten mostrar un aviso al usuario. • Asegura la visualización ya que roba el foco de la aplicación. • private void mostrarDialogoAlerta() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Información"); builder.setMessage("Esto es un mensaje de alerta."); builder.setIcon(R.drawable.dialog_icon); builder.setPositiveButton("Aceptar", // acción o null new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.i("Dialogos", "Botón aceptar pulsado"); } }); builder.show(); } © 2012-2013 Depto. Ciencia de la Computación e IA 15 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo de Confirmación private void mostrarDialogoConfirmacion() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Confirmacion"); builder.setMessage("¿Confirma la accion seleccionada?"); builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() public void onClick(DialogInterface Log.i("Dialogos", "Confirmacion } }); builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() public void onClick(DialogInterface Log.i("Dialogos", "Confirmacion } }); builder.show(); } { dialog, int which) { Aceptada."); { dialog, int which) { Cancelada."); © 2012-2013 Depto. Ciencia de la Computación e IA 16 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo de Selección private void mostrarDialogoSeleccion() { final String[] items = {"Español", "Inglés", "Francés"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Selecciona tu idioma"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { Log.i("Dialogos", "Opción elegida: " + items[item]); } }); builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.i("Dialogos", "Selección Cancelada."); } }); builder.show(); } © 2012-2013 Depto. Ciencia de la Computación e IA 17 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo selección única final String[] items = {"Español", "Inglés", "Francés"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("título") .setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mSelectedSingleItem = which; } }) .setPositiveButton("Aceptar", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { Log.i(kLOG, "Selección OK: " + mSelectedSingleItem ); } }) .setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { Log.i(kLOG, "Selección Cancelada."); } }); builder.show(); © 2012-2013 Depto. Ciencia de la Computación e IA 18 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo Selección múltiple final String[] items = {"Español", "Inglés", "Francés"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("título") .setMultiChoiceItems (items, null, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { if (isChecked) { mSelectedMultiChoice.add(which); } else if (mSelectedMultiChoice.contains(which)) { mSelectedMultiChoice.remove(Integer.valueOf(which)); } } }) .setPositiveButton("Aceptar", new DialogInterface.OnClickListener() { // ... }) .setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { // ... }); builder.show(); © 2012-2013 Depto. Ciencia de la Computación e IA 19 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo Personalizado <LinearLayout xmlns:android="http://schemas.android.." android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:src="@drawable/ic_launcher" android:layout_width="match_parent" android:layout_height="64dp" android:background="#FFFFBB33" /> <EditText android:id="@+id/username" android:inputType="textEmailAddress" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Usuario" /> <EditText android:id="@+id/password" android:inputType="textPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Password"/> </LinearLayout> © 2012-2013 Depto. Ciencia de la Computación e IA 20 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Diálogo Personalizado AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = this.getLayoutInflater(); builder.setView(inflater.inflate(R.layout.layout_dialog, null)) .setPositiveButton("Aceptar", new DialogInterface.OnClickListener() { // ... }) .setNegativeButton("Cancelar", new DialogInterface.OnClickListener(){ // ... }); builder.show(); © 2012-2013 Depto. Ciencia de la Computación e IA 21 Experto en Desarrollo de Aplicaciones para Dispositivos Móviles ¿Preguntas...? © 2012-2013 Depto. Ciencia de la Computación e IA 22