¿Terminar la actividad después de que el mensaje del pan tostado desaparezca?
¿Alguien sabe, si hay una posibilidad de hacer algo (en mi caso terminar la actividad) en el mensaje de pan tostado será cerrado?
- No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () 3
- Mostrar el widget de brindis debajo de una vista
- ¿Puedo tener un ejemplo de mostrar un brindis usando runOnUiThread.
- Tostadas no aparecen en UnCaughtExceptionHandler
- Java.lang.RuntimeException: No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ();
- Cómo personalizar Tostada en Android?
- Detener una tostada y empezar otra en android
- ¿Cuál es el valor de Toast.LENGTH_LONG y Toast.LENGTH_SHORT?
- Eliminar "Gracias. Su artículo aparecerá en breve. "Tostada de aparecer después de la compra de InApp
- Error debido a la combinación no válida de Toast y OnClickListener
- Tostada no se muestra en el Samsung Galaxy S3 (última actualización 4.1.2)
- Tostadas que llegan varias veces
- ¿Por qué no aparece mi brindis?
Usted lo hace simplemente creando un Thread
que dure mientras el Toast
se muestre y entonces usted puede terminar su Activity
.
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // your other stuff Toast.makeText(this,"This is a Toast", Toast.LENGTH_LONG).show(); thread.start(); }
Ahora cree un hilo que espera (LENGTH_LONG = 3.5) o (LENGTH_SHORT = 2) segundos
Thread thread = new Thread(){ @Override public void run() { try { Thread.sleep(3500); // As I am using LENGTH_LONG in Toast Your_Activity.this.finish(); } catch (Exception e) { e.printStackTrace(); } } };
En primer lugar, debe mostrar Toast
después de 2 segundos, se terminará su activity
.
Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { YourActivity.this.finish(); } }, 2000);
Android.widget.Toast no ofrece ningún oyente para informar cuando está terminado.
Puede llamar a Toast.getDuration () para saber cuánto tiempo durará, y hacer que su propio TimerTask se ejecute en el momento en que Toast se desvanece y realizar sus tareas allí.
Sí, pero este es un truco
Android Toast no tiene una forma de establecer una devolución de llamada después de haber terminado.
Así que lo que puede hacer se basa en este hecho
private static final int LONG_DELAY = 3500; // 3.5 seconds private static final int SHORT_DELAY = 2000; // 2 seconds
Ahora usted puede hacer:
- Configurar el brindis
- Configure un hilo de contador basado en LENGTH_LONG (3.5s) o LENGTH_SHORT (2s) para cerrar la actividad.
- Toast.show () y thread.start ();
En realidad, no hay devoluciones de llamada cuando se está finalizando un Toast
, pero si necesita saberlo, cuándo se cerrará, podrá iniciar un subproceso de fondo que durará varios milisegundos igual a la duración de Toast
y luego ejecutará la operación necesaria . Esta es sólo una manera de resolver el problema, estoy seguro de que hay más soluciones. Espero que esto ayude.
Así es como lo hago …
Tenga en cuenta que esta clase incluye una llamada para cerrar la actividad que lo llamó. Puede sacar eso si es necesario.
Además, tenga en cuenta que los tiempos de sueño rastrean la duración de la tostada, pero he añadido un medio segundo adicional para dar un poco de margen antes de que termine la actividad.
public class Toaster implements Runnable { Context theContext; CharSequence theMessage; int theDuration; Activity theActivity; public Toaster( Activity a, Context c, CharSequence s, int i ) { theActivity = a; theContext = c; theMessage = s; theDuration = i; } @Override public void run() { Toast toast = Toast.makeText(theContext, theMessage, theDuration ); toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 0); toast.show(); Thread t = new Thread( new Runnable() { @Override public void run() { try { Thread.sleep(theDuration == Toast.LENGTH_SHORT ? 2500 : 4000); } catch (InterruptedException e) { e.printStackTrace(); } theActivity.finish(); } }); t.start(); } }
En la actividad, hay un pedazo de código que se parece a esto, para llamarlo:
Context c = getApplicationContext(); CharSequence msg = "Form Data Submitted!"; int duration = Toast.LENGTH_SHORT; runOnUiThread( new Toaster(this, c, msg, duration) );
No estoy seguro de que puedas hacer esto con Toasts, sin embargo, puedes reemplazar el brindis por un simple diálogo (y reutilizar el diseño de Toast si lo deseas), y luego puedes usar métodos como onDetachedFromWindow
para conectar el cierre de la actividad A la ventana.
Acabo de hacer una biblioteca simple para ese "problema" Descargar:
https://github.com/mkiisoft/Toaster
Y usarlo de esta manera:
Toaster.getInstance().makeText(context, "your custom message", Toast.LENGTH_SHORT, new OnToasterFinish() { @Override public void finish() { // Your code over here after the Toast } });
Afaik el INotificationManager API (que se utiliza bajo el capó de la clase de brindis) no tiene ningún soporte para notificar a la persona que llama cuando cierra el Toast.
Tampoco hay forma de comprobar si el Toast está mostrando u oculto sin utilizar la reflexión para seleccionar la clase interna que representa la notificación transitoria.
Llamas a la tostada y terminas usando la tecla Onstop (). Tu brindis aparecerá ahora.
Extienda la clase Toast y utilice su propia devolución de llamada.
No estoy seguro de cuál es su caso de uso, pero ¿realmente necesita esperar a que el brindis termine para terminar su actividad?
En mi caso, tengo una actividad que es un punto de entrada en la aplicación desde una url (permitiendo que la aplicación se abra desde un enlace en un correo electrónico o en una página web). Si la url no pasa un cheque de validación, muestro un brindis y termino la actividad:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... if (!validateUrl()) { Toast.makeText(this, R.string.invalid_url, Toast.LENGTH_LONG).show(); finish(); return; } ... }
Esto muestra el brindis y no tengo que esperar hasta que ya no se muestra antes de llamar a finish (). Inicialmente, pensé que esto no funcionaba, pero luego descubrí que era porque me olvidé de llamar a show () en la tostada!
- ProgressBar en una ActionBar, como la aplicación de GMail con Refresh
- Cómo eliminar el margen superior de TextView?