5 votes

Ajouter un écouteur d'événements de clic au Pushpin

Je rencontre un problème avec le EntityClickedListener dans Bing Maps. Je l'ai codé en suivant l'exemple donné :

map.setEntityClickedListener(new EntityClickedListener()
{
   @Override
   public void onAvailableChecked(String layerName, int entityId)
   {
      HashMap metadata = map.getLayerManager.GetMetadataByID(layerName, entityId);
      Toast.makeText(Activity.this, metadata.toString(), Toast.LENGTH_LONG)
           .show();
   }
});

Cependant, cliquer sur le Pushpin ne fait rien. J'ai créé un message Toast pour voir exactement ce qu'il y a dans les métadonnées mais rien ne se passe. En examinant le chemin de l'application, je peux dire que Bing utilise un service de données pour récupérer ses informations :

bsds.FindByAreaCompleted = new Handler(){
     public void handleMessage(Message msg) {
     if(msg.obj != null){
        Record[] records = (Record[])msg.obj;
        EntityLayer el = (EntityLayer)bingMapsView.getLayerManager().getLayerByName(Constants.DataLayers.Search);
        double maxLat = -90, minLat = 90, maxLon = -180, minLon = 180;

        for(Record r : records){
            Pushpin p = new Pushpin(r.Location);
            p.Title = r.DisplayName;
            HashMap metadata = new HashMap();
            metadata.put("record", r);
            el.add(p, metadata);
        }

     bingMapsView.setMapView(new LocationRect(maxLat, maxLon, minLat, minLon));

     el.updateLayer();
     }
};

J'ai également modifié le fichier JavaScript pour supprimer certaines vérifications qui auraient pu empêcher le Listener de fonctionner :

this.ShowInfobox = function(entity){
        window.BingMapsInterlop.entityClicked(entity.layerName, entityId);
    };

var Layer = function(name, map, dataLayer)
{
    this.Name = name;

    var entities = new MM.EntityCollection(),
    _map = map;

    this.AddEntities = function(data)
    {
        if(data != null)
        {
            var i = data.length - 1;
            if (i >= 0)
            {
                do
                {
                    data[i].Entity.entityId = data[i].EntityId;
                    data[i].Entity.layerName = name;

                    // Commented out
                    // if(data[i].title != null && data[i].title != undefined && data[i].title != '')
                    // {
                        data[i].Entity.title = data[i].title;

                        MM.Events.addHandler(data[i].Entity, 'click', function(e)
                        {
                            BingMapsAndroid.ShowInfobox(e.target);
                        });
                    // }
                    entities.push(data[i].Entity);
                }
                while (i--)
            }
        }
    };
    // fluff
};

Ai-je correctement modifié le fichier JavaScript? Je ne connais pas moi-même JavaScript et j'ai suivi ce guide. Le Pushpin est ajouté et je le vois sur mon BingMapsView, mais la méthode OnClick ne s'exécute pas. Est-ce que j'ai oublié quelque chose ?

Le chemin que Bing emprunte pour créer des Listeners et des événements pour les événements de clic sur les Pushpin est presque un labyrinthe à mon avis. Il doit y avoir une manière plus simple de le faire que j'ignore. Quelqu'un pourrait-il donner des conseils?

2voto

Jason L Points 1732

J'ai enfin trouvé la réponse! Modifiez les méthodes suivantes dans le fichier JavaScript comme suit afin que le script ne vérifie pas les métadonnées qui n'existent pas.

var Layer = function(name, map, dataLayer)
{
    this.Name = name;

    var entities = new MM.EntityCollection(),
    _map = map;

    this.AddEntities = function(data)
    {
        if(data != null)
        {
            var i = data.length - 1;
            if (i >= 0)
            {
                do
                {
                    data[i].Entity.entityId = data[i].EntityId;
                    data[i].Entity.layerName = name;

                    // Commenté
                    // if(data[i].title != null && data[i].title != undefined && data[i].title != '')
                    // {
                        data[i].Entity.title = data[i].title;

                        MM.Events.addHandler(data[i].Entity, 'click', function(e)
                        {
                            BingMapsAndroid.ShowInfobox(e.target);
                        });
                    // }
                    entities.push(data[i].Entity);
                }
                while (i--)
            }
        }
    };
    // fluff
};

Ensuite, modifiez la méthode ShowInfoBox dans le fichier JavaScript pour

this.ShowInfobox = function (entity) {
        window.BingMapsInterlop.entityClicked(entity.layerName, entity.entityId);
    };

Ce code redirige directement vers le gestionnaire de clics que vous avez codé dans votre Activity au lieu de jouer avec dans le JavaScript. La différence par rapport au JavaScript que j'ai édité précédemment est que le paramètre de la méthode entityClicked devrait en fait être entity.entityId et non entityId.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X