2011-07-19 9 views
8

Actualmente estoy comenzando a desarrollar aplicaciones para Android y he estado siguiendo un this tutorial sobre cómo usar y mejorar la aplicación Google maps.Cancelar una tostada ya abierta en Android

He logrado mostrar en la pantalla el mapa, al tacto obtengo la dirección de una ubicación (a través de Geocodificación inversa) con la muestra de Toast. Pero aquí está mi problema: cuando haces clic en varias veces consecutivas sobre el mapa, obtendrás todos los toasts uno después del otro y cada uno de ellos tomará su tiempo (en mi caso - Toast.LENGTH_LONG) para desaparecer. Quiero que la aplicación cierre automáticamente el tostado más viejo y muestre un nuevo brindis con la nueva dirección en la que se hace clic.

En otros recursos que he encontrado que debería utilizar el método toast.cancel() para este propósito, pero yo experimento problema para usarlo - Ya he overrided la onTouchEvent - ¿Cómo puedo detectar que hay un nuevo toque sobre el mapa mientras que el toast está mostrando ? O tal vez me sugiera una mejor forma de ocultar el ya abierto toast?

He tratado de hacer que mi dirección Toast sea global, pero tampoco funcionaba.

Aquí está mi código de la aplicación:

@Override 
public boolean onTouchEvent(MotionEvent event, MapView mapView) { 
    //---when user lifts his finger--- 
    if (event.getAction() == 1) {     
     GeoPoint p2 = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY()); 
     Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault()); 
     try { 
      List<Address> addresses = geoCoder.getFromLocation(p2.getLatitudeE6()/1E6, 
        p2.getLongitudeE6()/1E6, 1); 
      String add = " "; 
      if (addresses.size() > 0) 
       for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++) 
        add += addresses.get(0).getAddressLine(i) + "\n"; 
      Toast address; 
      address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG); 
      address.show();      
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 
    return false; 
} 
+0

¿Cómo no funciona toast.cancel()? ¿Se lo está llamando? –

+0

Además, recomendaría usar 'ACTION_UP == event.getAction()' en lugar de 'event.getAction() == 1'. Es solo un buen estilo. –

+0

posible duplicado de [Cómo cancelar Toast creado en un método diferente en android?] (Http://stackoverflow.com/questions/5503682/how-to-cancel-toast-created-in-a-different-method-on -android) – Wroclai

Respuesta

22

No mostrar donde tiene Toast address como global, sino que está creando un nuevo objeto pan tostado local, cada vez que se hace clic con:

Toast address; 
address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG); 
address.show(); 

Que anulará el objeto global que está creando. Yo recomendaría tener address como un objeto private static en su clase para asegurar que la dirección siempre será el mismo objeto sin importar cuántas veces haga clic para que siempre esté cancelando el Toast que mostró por última vez (ya que solo hay uno) y retire la declaración local:

private static Toast address; 

...

if (address != null) 
    address.cancel(); 

address = Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG); 
address.show(); 
+0

He movido el 'dirección privada estática de Toast; declaración' como global. Si ahora utilizo el método address.cancel() simplemente cancelará mis brindis y no se mostrará nada: ¿cómo llamar a la cancelación de un brindis solo cuando hay un nuevo toque en la pantalla? –

+0

Simplemente llame a 'address.cancel()' en su onTouchEvent antes de mostrar la nueva tostada; esto cancelará una tostada existente si hay una (ya sea que se muestre o espere que se muestre) He actualizado mi sugerencia para incluir esto. – RivieraKid

+0

He intentado con el 'address = Toast.makeText (getBaseContext(), add, Toast.LENGTH_LONG); address.cancel(); dirección.show(); ' pero obtengo el mismo resultado: la tostada cambia solo cuando termina su vida útil. –

1

que necesita para obtener ejemplo cuando crear la tostada por marca llamada() Después de que antes de mostrar nueva tostadas, usted debe cancelar la edad. Toast.GoodLuck!

+0

¿El 'Toast.makeText' funciona de la misma manera que' make () ' Aquí tengo una pregunta: al comienzo de mi método OnTouchEvent, puedo verificar si hay una tostada ya abierta, si hay una abierta, cancelarla y continuar con la apertura de una nueva. ¿Pero hay un método incorporado para verificar la existencia de una tostada abierta? –

+0

RivieraKid menciona la solución que es igual en mi camino. – duonghv

+0

No recibí el suyo anteriormente, ahora sé cómo se hace, lo entiendo bastante, gracias. –

Cuestiones relacionadas