2010-07-13 4 views
4

j'ai une application qui utilise le code mapview-overlay-manager pour dessiner des marqueurs de la carte sur un MapView utilisant le LazyLoadManager à partir d'une API Web. Comme je fais glisser la carte, les marqueurs chargent/déchargent comme prévu.Popup ballons disparaissent de façon aléatoire après tassement de OverlayItem sur MapView

Sur le robinet d'un marqueur, je gonfle un fichier balloon.xml et l'utilise pour montrer un ballon au-dessus du marqueur. C'est là que se trouve le problème. Cela fonctionne, mais soudainement (ce que je ne peux pas répéter de manière cohérente), la superposition du ballon cessera d'apparaître sur l'écran.

C'est bizarre, car le marqueur montre encore qu'il a été tapoté, mais le ballon cesse d'apparaître. J'ai vérifié que le ballon n'est pas nul (ce qui n'est pas le cas), et que itemInfo n'est pas nul. Il n'est tout simplement pas ajouté à MapView après l'appel de .addView (...), mais tous les paramètres sont valides. Note latérale: À chaque fois que cela se produit, toutes les superpositions deviennent foncées et les ombres de superposition passent du semi-transparent au noir. Je n'ai aucune idée de ce qui en est la cause, mais cela arrive en même temps, ce qui me fait croire que c'est un problème de dessin.

Le code pour le problème ci-dessus est ci-dessous. Tous les conseils/idées/etc seraient appréciés.

@Override 
     public boolean onSingleTap(MotionEvent e, ManagedOverlay overlay, GeoPoint point, ManagedOverlayItem item) { 

      if(mBalloon != null) 
      { 
       mMapView.removeView(mBalloon); 
       mBalloon = null; 
      } 

      if(item != null) { 
       //Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show(); 
       MapView.LayoutParams balloonLayoutParams = new MapView.LayoutParams(350, MapView.LayoutParams.WRAP_CONTENT, item.getItemInfo().getMarkerPoint(mMapView.getProjection()), MapView.LayoutParams.BOTTOM_CENTER); 


       if(mBalloon == null) { 
        if(mLayoutInflater == null) { 
         mLayoutInflater = getLayoutInflater(); 
        } 
        ViewGroup parent = (ViewGroup)mMapView.getParent(); 
        mBalloon = (BalloonLayout) mLayoutInflater.inflate(R.layout.balloon_layout, parent, false); 


       } 

       TextView title = (TextView)mBalloon.findViewById(R.id.title); 
       title.setText(item.getItemInfo().getTitle()); 

       TextView subTitle = (TextView)mBalloon.findViewById(R.id.subTitle); 
       subTitle.setText(item.getItemInfo().getBalloonSubTitle()); 

       if(DEBUG) Log.d(TAG, "Setting on click listener."); 
       ((ImageButton)mBalloon.findViewById(R.id.go_button)).setOnClickListener(new ViewItemInfoListener(item.getItemInfo())); 

       mMapView.addView(mBalloon, balloonLayoutParams); 
      } 
      return false; 

     } 
    }); 

    // Fires off the background event to get the 
    overlayManager.populate(); 
} 

Répondre

0

Ok, j'ai trouvé le problème. Il existe une méthode parent appelant cette méthode. Malheureusement, cette méthode a été appelée deux fois. Une fois sur onFocusChanged() et une fois dans onCreate(). Enlever l'un d'entre eux a résolu le problème. Les icônes et les ballons se sont dessinés deux fois à cause de cela.

0

Avez-vous envisagé lors d'une onDrag: supprimer tous les marqueurs et enregistrer dans une liste temporaire, lancer une minuterie (prob 200-500 ms), puis après expiration de la temporisation repeupler les marqueurs. Si un autre OnDrag se produit avant l'expiration du temporisateur, redémarrez le temporisateur.

Questions connexes