En una acción de snackbar, ¿cómo puedo asegurarme de que es seguro borrar de forma permanente un registro borrado por software de la base de datos?
Estoy utilizando Snackbar en android y he implementado una acción para que el usuario puede deshacer la acción (la acción está borrando todos los elementos de la lista). Eliminar y agregar los elementos de nuevo a la lista ya se ha hecho y funciona bien.
Mi problema es que, los elementos se almacenan en la base de datos sqlite y cómo puedo eliminar los elementos de las tablas? (¿Cómo puedo saber que el usuario no ha hecho clic en el botón deshacer, para que pueda eliminar completamente los datos de la base de datos).
- Cómo deshabilitar el comportamiento de "snack-to-dismiss"
- Cómo configurar el color de texto de la barra de ayuda de la biblioteca de soporte a algo que no sea android: textColor?
- Acción Snackbar getView ()
- Biblioteca de soporte de Android Snackbar con longitud indefinida
- ¿Es una buena práctica incluir todos los diseños en CoordinatorLayout?
Este es el código dentro de OnOptionsItemSelcted ()
case R.id.action_clear: final List<Word> temp = new ArrayList<Word>(data); data.clear(); adapter.notifyDataSetChanged(); View view = findViewById(R.id.layoutFavWords); Snackbar.make(view,"Deleted Saved Selection.", Snackbar.LENGTH_LONG). setAction("Undo", new OnClickListener() { @Override public void onClick(View v) { for(Word word:temp) data.add(word); adapter.notifyDataSetChanged(); } }).show(); break;
Así que si el usuario no ha hecho clic en el botón de deshacer durante el período visible de la barra de menús, entonces necesito borrar permanentemente los datos de la base de datos.
¿Alguna solución para esto?
- Cómo agregar Snackbars en un BroadcastReceiver?
- Envolver la altura del contenido en un SnackBar
- Haz que Snackbar empuje la vista hacia arriba
- Cómo personalizar el diseño de snackBar?
- Android Snackbar se oculta detrás de la interfaz de usuario del sistema
- Android SnackBar: error al inflar SnackbarLayout
- ¿Cómo puedo cambiar la alineación inicial de Android Snackbar de abajo hacia arriba?
- ¿Podemos realizar 2 acciones diferentes en Snack bar al mismo tiempo en android?
Por lo que sé, es por diseño. Debieras:
- Elimine el elemento tan pronto como el usuario toque el botón de borrado;
- Guárdelo temporalmente en una variable de clase;
- Si el usuario teclea Deshacer, vuelva a agregar el elemento a la base de datos.
Este enfoque es más seguro y más robusto; Usted no debe esperar para que la barra se deseche, porque esa acción no podría incluso suceder. Piensa en la fuerza del usuario: dejar de usar la aplicación mientras la barra de menú todavía está encendida: ¿se debería eliminar el elemento o no? Debería.
Una fuente más confiable es este post g + de Ian Lake. En los comentarios se puede leer:
Desea que su interfaz de usuario reaccione de inmediato (no espere a que desaparezca la barra de menús) – la mayoría de los sistemas (en particular los que se sincronizan con un servidor externo) tienen el concepto de un "borrado suave" donde las cosas se marcan como borradas. En esos casos, una acción de deshacer sería simplemente desmarcar el registro como eliminado. Este sistema funciona incluso si el usuario dejara la aplicación antes de que termine el snack (no se puede asumir que la barra de snack siempre completará su animación).
La forma más sencilla de hacerlo es guardar temporalmente el registro en otro lugar (incluso una variable local) y, a continuación, volver a insertarlo si suceden al pulsar el botón de deshacer.
La biblioteca de soporte de Android v23 agregó Snackbar.Callback que puedes usar para escuchar si el snackbar fue rechazado por el usuario o el tiempo de espera.
Ejemplo tomado de la publicación de astinx :
Snackbar.make(getView(), "Hi there!", Snackbar.LENGTH_LONG).setCallback( new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { switch(event) { case Snackbar.Callback.DISMISS_EVENT_ACTION: Toast.makeText(getActivity(), "Clicked the action", Toast.LENGTH_LONG).show(); break; case Snackbar.Callback.DISMISS_EVENT_TIMEOUT: Toast.makeText(getActivity(), "Time out", Toast.LENGTH_LONG).show(); break; } } @Override public void onShown(Snackbar snackbar) { Toast.makeText(getActivity(), "This is my annoying step-brother", Toast.LENGTH_LONG).show(); } }).setAction("Go away!", new View.OnClickListener() { @Override public void onClick(View v) { } }).show();
Ejemplo:
final java.util.Timer timer = new Timer(); Snackbar snackbar = Snackbar.make(...).setAction("Undo", new OnClickListener() { @Override public void onClick(View v) { timer.cancel(); for(Word word:temp) data.add(word); adapter.notifyDataSetChanged(); } }).show(); timer.schedule(new TimerTask() { public void run() { // delete from db } }, snackbar.getDuration());
Puede ser una buena idea agregar un poco al tiempo de snackbar.getDuration () (100-200ms?), Ya que los temporizadores no son muy exactos en términos de tiempo y de esta manera se pueden llamar justo antes de que el snackbar esté a punto de cerrarse, Aunque la posibilidad es bastante pequeña en este caso.
- Android.content.res.Resources $ NotFoundException al establecer programación android.R.attr.listChoiceIndicatorMultiple
- Solución para necesitar una fila _id para CursorAdapter