/**
   * Creates and displays the balloon overlay by recycling the current balloon or by inflating it
   * from xml.
   *
   * @return true if the balloon was recycled false otherwise
   */
  private boolean createAndDisplayBalloonOverlay() {
    boolean isRecycled;
    if (balloonView == null) {
      balloonView = createBalloonOverlayView();
      clickRegion = (View) balloonView.findViewById(R.id.balloon_item_title);
      clickRegion.setOnTouchListener(
          new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
              balloonView.urlClick(v);
              return true;
            }
          });

      clickRegion = (View) balloonView.findViewById(R.id.balloon_item_phone);
      clickRegion.setOnTouchListener(
          new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
              balloonView.phoneClick(v);
              return true;
            }
          });

      clickRegion = (View) balloonView.findViewById(R.id.balloon_item_twitter);
      clickRegion.setOnTouchListener(
          new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
              balloonView.twitterClick(v);
              return true;
            }
          });

      isRecycled = false;
    } else {
      isRecycled = true;
    }

    balloonView.setVisibility(View.GONE);

    List<Overlay> mapOverlays = mapView.getOverlays();
    if (mapOverlays.size() > 1) {
      hideOtherBalloons(mapOverlays);
    }

    if (currentFocussedItem != null) balloonView.setData((BalloonOverlayItem) currentFocussedItem);

    GeoPoint point = currentFocussedItem.getPoint();
    MapView.LayoutParams params =
        new MapView.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT,
            point,
            MapView.LayoutParams.BOTTOM_CENTER);
    params.mode = MapView.LayoutParams.MODE_MAP;

    balloonView.setVisibility(View.VISIBLE);

    if (isRecycled) {
      balloonView.setLayoutParams(params);
    } else {
      mapView.addView(balloonView, params);
    }

    return isRecycled;
  }
 /** Sets the visibility of this overlay's balloon view to GONE. */
 protected void hideBalloon() {
   if (balloonView != null) {
     balloonView.setVisibility(View.GONE);
   }
 }