2011-03-31 12 views
9

Tengo el siguiente código:Cómo cancelar Toast creado en un método diferente en android?

private Toast movieRecordToast; 

    private void displayNextMovie() { 
     if (movieRecordToast != null) movieRecordToast.cancel(); // cancel previous Toast (if user changes movies too often) 
     movieRecordToast = Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_SHORT); 
     movieRecordToast.show(); 

    private void displayPrevMovie() { 
     if (movieRecordToast != null) movieRecordToast.cancel(); 
     movieRecordToast = Toast.makeText(getApplicationContext(), "Prev", Toast.LENGTH_SHORT); 
     movieRecordToast.show();   

Pero si displayNextMovie se llama rápidamente varias veces y luego displayPrevMovie se llama, "Siguiente" Toast está siendo mostrada y sólo después de que se muestra que "Anterior". Parece que la cancelación no funciona correctamente.

+0

UPD. mirando otras preguntas sobre lo mismo - parece que Android no cancela tostadas demasiado rápido ... –

+1

Como un lado, ¿por qué no tienes una sola función 'private void displayMovieToast (String s)' que toma ya sea "Anterior "o" Siguiente "como argumento? – rajath

Respuesta

28

En lugar de crear una nueva Toast objeto cada vez que desee un nuevo texto que se muestra puede mantener fácilmente en un solo Toast objeto y cancele el Toast actual siempre que lo desee. Antes de que se muestre el siguiente Toast, puede cambiar el texto con la función Toast.setText(). código

muestra:

private Toast mToastText; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Create the object once. 
    mToastText = Toast.makeText(this, "", Toast.LENGTH_SHORT); 
} 

private void displayText(final String message) { 
    mToastText.cancel(); 
    mToastText.setText(message); 
    mToastText.show(); 
} 
+3

Me gusta su solución, pero ahora mis brindis simplemente no aparecen. ¿Algunas ideas? :? – AlvaroSantisteban

+4

En mi caso, el mToastText.cancel() hizo que la tostada no se mostrara. Sin eso, funciona a la perfección. :) – AlvaroSantisteban

+0

Funciona perfectamente para mí, gracias. ¡Esto me estaba molestando por años! – jason

0

Creo que hay muchas maneras en que puede lograr mostrar la información siguiente/anterior al usuario. Me gustaría deshacerme de los brindis y actualizar el texto de un TextView con el nombre de la película siguiente/anterior. Eso eliminaría su problema y también en mi humilde opinión mejora la UI.

Sin embargo, si sus necesidades de diseño piden para las notificaciones tostadas, intente:

private Toast nextMovieRecordToast; 
private Toast prevMovieRecordToast; 


private void displayNextMovie() { 
    if (prevMovieRecordToast != null) prevMovieRecordToast.cancel(); // cancel previous Toast (if user changes movies too often) 
    nextMovieRecordToast = Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_SHORT); 
    nextMovieRecordToast.show();} 

private void displayPrevMovie() { 
    if (nextMovieRecordToast != null) nextMovieRecordToast.cancel(); 
    prevMovieRecordToast = Toast.makeText(getApplicationContext(), "Prev", Toast.LENGTH_SHORT); 
    prevMovieRecordToast.show(); }  
+0

Gracias, @OceanBlue. Sin embargo, creo que su aproximación no funcionará si se llama a displayNextMovie varias veces; habrá una cola de mensajes "Siguiente" –

+0

Bueno, supongo que depende de lo que desee. El usuario verá tostadas "Prev". Los brindis "Siguiente" detrás de ellos se apagarán. Entonces, si ejecuta este código, el efecto debería ser el que desee. Sin embargo ... ¿estás seguro de que tienes que usar tostadas para esto? – OceanBlue

0

La solución de la wroclai es excelente! Sin embargo, atornilla el Toast cuando se va de una tostada de mensaje largo a uno corto y viceversa. Para arreglar esto, en lugar de usar el objeto anterior recípalo. Así que en lugar de esta línea:
mToastText.setText(message);
escribir éste: myToast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
Las animaciones también se ve mejor :)

Cuestiones relacionadas