title: Android: ItemizedOverlay onTouchEvent and onTap overlapping
body: <p>I am trying to place a marker on a map overlay and then present a dialog when the user selects the drawable.  The problem is the events seem to overlap.  After I click the map and the marker is drawn, the onTap fires immediately afterwards, and because I have just drawn the marker, it is directly under the onTap event, so my dialog always fires.  Does anyone have any suggestions on how to make these events mutually exclusive?</p>
  
  <p>Here is the code for the map activity:</p>
  
  <pre><code>public class SelectGameLocation extends MapActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener  {
  
      private MapView mapView = null;
      private SelectGameLocationItemizedOverlay selectLocationOverlay = null;
      private List&lt;Overlay&gt; 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;
      }
  }
  </code></pre>
  
  <p>and the code for the overlay class:</p>
  
  <pre><code>public class SelectGameLocationItemizedOverlay extends ItemizedOverlay {
  
      private Context context = null;
      private List&lt;OverlayItem&gt; overlays = new ArrayList&lt;OverlayItem&gt;();
  
      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&lt;OverlayItem&gt; 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();
      }
  
  }
  </code></pre>