2011-09-30 12 views

Respuesta

42

Lo haces simplemente creando Thread que dura mientras se muestra Toast y luego puedes terminar 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 crear 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(); 
       } 
      } 
      }; 
+2

¡Genial! Thx :) Así que puedes agregar Toast.LENGTH_LONG al método sleep, para tener la coincidencia exacta –

+0

RIP para aquellos que votaron negativamente sin mencionar el motivo :) –

9

android.widget.Toast no ofrece ningún oyente para informar cuando haya terminado.

Puede llamar a Toast.getDuration() para saber cuánto durará, y hacer su propio TimerTask para ejecutarse en el momento en que Toast se desvanece y realizar sus tareas allí.

1

No estoy seguro de que pueda hacer esto con Toasts, sin embargo, puede reemplazar las tostadas por un diálogo simple (y reutilizar el diseño de Toast si lo desea), y luego puede usar métodos como onDetachedFromWindow para enganchar el cierre de la actividad a la ventana.

2

Actualmente no hay devoluciones de llamadas cuando se está terminando un Toast, pero si necesita saber cuándo se cerrará, puede iniciar un hilo de fondo que dormirá unos milisegundos igual a la duración Toast, y luego ejecuta la operación necesaria. Esta es solo una forma de resolver el problema, estoy seguro de que hay más soluciones. Espero que esto ayude.

7

Sí, pero esto es una forma truco

Android pan tostado no tiene una forma de establecer una devolución de llamada después de que se terminó.

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 se puede hacer:

  1. Establecer la tostada
  2. Establecer un hilo contador basado en el LENGTH_LONG (3,5 s) o LENGTH_SHORT (2s) para cerrar la actividad.
  3. toast.show() y thread.start();
+0

no hacen suposiciones acerca de los retrasos ! Estos pueden cambiar en diferentes versiones de API. –

+0

Lo sé, pero esa es la única forma de hacer lo que él quiere ahora. –

+2

Quizás tenga razón, getDuration solo devuelve LENGTH_SHORT o LENGTH_LONG, que son constantes 0/1. No es tiempo real en ms. –

0

Afaik the INotificationManager API (que se utiliza debajo del 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 Toast se muestra u oculta sin usar el reflejo para seleccionar la clase interna que representa la notificación de transitorios.

0

Llamas a las tostadas, estas terminan usando el Onstop(). Su brindis ahora aparecerá.

0

Extienda la clase Toast-Class y use su propia devolución de llamada.

+0

hmmm .. algunos detalles más? – Tima

+0

no creo que esta sea una opción ... Toast usa INotificationManager, por lo que no hay forma de notificar a la persona que llama. –

2

Así es como lo hago ...

Tenga en cuenta que este clase incluye una llamada para cerrar la actividad que lo llamó. Puedes sacar eso si es necesario.

Además, tenga en cuenta que los tiempos de reposo siguen la duración del brindis, pero he agregado un medio segundo extra para dar un pequeño margen antes de que la actividad termine.

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 trozo de código que se parece a esto, llamarlo:

Context c = getApplicationContext(); 
    CharSequence msg = "Form Data Submitted!"; 
    int duration = Toast.LENGTH_SHORT; 

    runOnUiThread(new Toaster(this, c, msg, duration)); 
0

No estoy seguro de lo que su caso de uso es, pero es lo que realmente necesita esperar para el brindis para cerrar para finalizar tu actividad?

En mi caso, tengo una actividad que es un punto de entrada a la aplicación desde una url (lo que permite 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 de una validación, que muestran una tostada y terminar 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 demuestra la tostada y no tener que esperar hasta que ya no está representada antes de llamar acabado(). Inicialmente, pensé que esto no estaba funcionando, pero luego descubrí que era porque olvidé llamar a show() en el brindis.

11

Primero debe mostrar Toast luego después de 2 segundos, 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); 
1

acabo de hacer una biblioteca simple para que la "cuestión" 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 
       } 
      }); 
Cuestiones relacionadas