2011-07-19 3 views
8

Je commence actuellement à développer des applications Android et j'ai suivi un this tutorial sur la façon d'utiliser et d'améliorer l'application Google Maps.Annulation d'un toast déjà ouvert dans Android

J'ai réussi à apparaître sur l'écran de la carte, au toucher j'obtiens l'adresse d'un emplacement (via Reverse Geocoding) avec l'affichage d'un Toast. Mais voici mon problème - lorsque vous cliquez sur un nombre de fois consécutives sur la carte, vous obtiendrez tous les toasts l'un après l'autre et chacun d'entre eux prendra son temps (dans mon cas - Toast.LENGTH_LONG) pour disparaître. Je veux que l'application ferme automatiquement l'ancien toast et affiche un nouveau toast avec la nouvelle adresse cliquée.

Dans d'autres ressources que je trouvais que je devrais utiliser la méthode toast.cancel() à cette fin, mais j'éprouve du mal à l'utiliser - je l'ai déjà overrided la onTouchEvent - comment puis-je détecter il y a une nouvelle touche sur la carte tandis que le toast est montrant ? Ou peut-être que vous me suggérez un meilleur moyen de cacher le toast déjà ouvert?

J'ai essayé de rendre mon adresse Toast globale, mais elle ne fonctionnait pas aussi.

Voici mon code pour l'application:

@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

Comment toast.cancel() ne fonctionne pas? Est-ce qu'on l'appelle? –

+0

Aussi, je recommanderais d'utiliser 'ACTION_UP == event.getAction()' au lieu de 'event.getAction() == 1'. C'est juste du bon style. –

+0

duplication possible de [Comment annuler Toast créé dans une méthode différente sur Android?] (Http://stackoverflow.com/questions/5503682/how-to-cancel-toast-created-in-a-different-method-on -android) – Wroclai

Répondre

22

Vous ne montrez pas où vous avez Toast address comme global, mais vous créez un nouvel objet de Toast locale chaque fois que vous cliquez avec:

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

Qui remplacera l'objet global que vous créez. Je recommande d'avoir address en tant qu'objet private static dans votre classe pour vous assurer que l'adresse sera toujours le même objet, peu importe le nombre de fois que vous cliquez de sorte que vous annulez toujours le Toast que vous avez montré en dernier (puisqu'il n'y en a jamais qu'un) et supprimer la déclaration locale:

private static Toast address; 

...

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

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

J'ai déplacé l'adresse Toast statique privée ; la déclaration en tant que déclaration globale. Si maintenant j'utilise la méthode address.cancel() il annulera juste mon toast et rien ne montrera - comment appeler l'annulation d'un toast seulement quand il y a un nouveau contact sur l'écran? –

+0

Appelez 'address.cancel()' dans votre onTouchEvent avant d'afficher le nouveau toast - cela annulera un toast existant s'il y en a un (affichage ou attente d'être affiché) J'ai mis à jour ma suggestion pour l'inclure. – RivieraKid

+0

J'ai essayé avec le 'address = Toast.makeText (getBaseContext(), ajouter, Toast.LENGTH_LONG); adresse.cancel(); Adresse .show(); ' mais j'obtiens le même résultat - le toast ne change qu'après la fin de sa durée de vie. –

1

vous devez obtenir exemple lors de créer Toast par marque d'appel() Après cela avant de vous montrer nouveau pain grillé, vous devez annuler vieux. Toast.GoodLuck!

+0

Est-ce que 'Toast.makeText' fonctionne de la même manière que' make () '? Ici, j'ai une question - au début de ma méthode OnTouchEvent je peux avoir un contrôle pour un toast déjà ouvert - s'il y en a un ouvert - l'annuler et poursuivre avec l'ouverture d'un nouveau. Mais existe-t-il une méthode intégrée pour vérifier l'existence d'un pain grillé ouvert? –

+0

RivieraKid mentionne la solution qui est la même à ma façon. – duonghv

+0

Je n'avais pas eu le tien auparavant, maintenant je sais comment c'est fait je l'ai tout à fait anéantie - merci. –