Android: ItemizedOverlay onTouchEvent et onTap qui se chevauchent

Je suis en train de placer un marqueur sur une carte de superposition et d'en présenter une boîte de dialogue lorsque l'utilisateur sélectionne le drawable. Le problème est que les événements semblent se chevaucher. Après je clique sur la carte et le marqueur est établi, le onTap se déclenche immédiatement après, et parce que j'ai juste dessiné au marqueur, il est directement sous la onTap cas, si mon dialogue se déclenche toujours. Quelqu'un aurait-il des suggestions sur la façon de faire de ces événements mutuellement exclusifs?

Voici le code pour la carte d'activité:

public class SelectGameLocation extends MapActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener  {
private MapView mapView = null;
private SelectGameLocationItemizedOverlay selectLocationOverlay = null;
private List<Overlay> mapOverlays = null;
private GestureDetector gestureDetector = null;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
//set the layout
setContentView(R.layout.activity_select_game_location);
//configure activity for double clicks
gestureDetector = new GestureDetector(this);
gestureDetector.setOnDoubleTapListener(this);
//create and configure mapview
mapView = (MapView) findViewById(R.id.selectGameLocation);
mapView.setBuiltInZoomControls(true);
mapView.setHapticFeedbackEnabled(true);
//configure the overlay to draw the icons on the map
mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.map_icon);
selectLocationOverlay = new SelectGameLocationItemizedOverlay(drawable, this);
mapOverlays.add(selectLocationOverlay);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onDoubleTap(MotionEvent me) {
GeoPoint p = GeoPointHelper.getPointClicked(me, mapView);
mapView.getController().animateTo(p);
mapView.getController().zoomIn();
return true;
}
//Overridden methods but not used
@Override
public boolean onDoubleTapEvent(MotionEvent me) {
return false;
}
@Override
public boolean onDown(MotionEvent me) {
return false;
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapConfirmed(MotionEvent me) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent me) {
return false;
}
}

et le code de la superposition de classe:

public class SelectGameLocationItemizedOverlay extends ItemizedOverlay {
private Context context = null;
private List<OverlayItem> overlays = new ArrayList<OverlayItem>();
public SelectGameLocationItemizedOverlay(Drawable marker, Context context) {
super(boundCenterBottom(marker));
this.context = context;
}
@Override
protected boolean onTap(int index) {
OverlayItem itemClicked = overlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(itemClicked.getTitle());
dialog.setMessage(itemClicked.getSnippet());
dialog.setCancelable(true);
dialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(this.getClass().getName(), "Selected Yes To Add Location");
((SelectGameLocation) context).finish();
}
});
dialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(this.getClass().getName(), "Selected No To Add Location");
dialog.cancel();
}
});
dialog.show();
return true;
}
@Override
public boolean onTouchEvent(MotionEvent me, MapView mapView) {
drawMarker(GeoPointHelper.getPointClicked(me, mapView));
return super.onTouchEvent(me, mapView);
}
private OverlayItem drawMarker(GeoPoint p) {        
OverlayItem overlayitem = new OverlayItem(p, "Select As Game Location?", "Do you want this location to be added as the location for the game?");
getOverlays().clear();
addOverlay(overlayitem);
return overlayitem;
}
public List<OverlayItem> getOverlays() {
return overlays;
}
public void addOverlay(OverlayItem overlay) {
overlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return overlays.get(i);
}
@Override
public int size() {
return overlays.size();
}
}

OriginalL'auteur CWayman | 2011-02-11