2012-06-28 21 views
5

Tengo un problema con EntityClickedListener en Bing Maps. Codifiqué siguiendo el ejemplo dado:Adición de escucha de evento de clic a marcador

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

Sin embargo, al hacer clic en el la Pushpin no hace nada. Creé un mensaje de Toast para ver exactamente qué hay en los metadatos, pero no pasa nada. Mirando a través de la ruta de la aplicación, te puedo decir que Bing utiliza un servicio de datos para recuperar su información:

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<String, Object> metadata = new HashMap<String, Object>(); 
      metadata.put("record", r); 
      el.add(p, metadata); 
     } 

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

    el.updateLayer(); 
    } 
}; 

También he editado el archivo JavaScript para eliminar algunas comprobaciones que pueden haber impedido la Listener de trabajo:

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 
}; 

¿He editado el archivo JavaScript correctamente? Yo mismo no sé JavaScript y he estado siguiendo this guide. Se está agregando el Pushpin y estoy viendo en mi BingMapsView, pero el método OnClick no se ejecuta. ¿Se me escapa algo?

La ruta que toma Bing para crear escuchas y eventos para Pushpin hacer clic en eventos es casi un laberinto en mi opinión. Tiene que haber una manera más simple de hacer esto que me estoy perdiendo. ¿Alguien puede dar algún consejo?

+0

puede ser un problema de superposición de vista –

+0

¿Alguien tiene código de trabajo del 'EntityClicknerist' para Bing Maps? Si puedes darme algún código, puedo intentar resolverlo yo mismo. Me he estado rasgando los pelos durante las últimas dos semanas. –

+0

Hola @Yawus, has probado este enlace, http://bingmapsandroidsdk.codeplex.com/discussions/263960/ –

Respuesta

2

¡Finalmente he encontrado la respuesta! Edite los siguientes métodos en el archivo JavaScript de forma tal que el script no verifique los metadatos que no existen.

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 
}; 

A continuación, cambiar el método de ShowInfoBox en el archivo JavaScript para

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

Este código canaliza directamente al detector de clics que su código en Activity en lugar de jugar un rato con él en el código JavaScript. La diferencia con el JavaScript que edité anteriormente es que el parámetro para el método entityClicked debería ser entity.entityId, no entityId.

Cuestiones relacionadas