2012-06-28 11 views
5

Sto riscontrando problemi con lo EntityClickedListener in Bing Maps. Ho codificato seguendo l'esempio dato:Aggiunta del listener di eventi Click a Pushpin

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

Tuttavia, cliccando sul il Pushpin non fa nulla. Ho creato un messaggio Toast per vedere esattamente cosa c'è nei metadati, ma non succede nulla. Guardando attraverso il percorso dell'applicazione, posso dire che Bing utilizza un servizio di dati per recuperare le proprie informazioni:

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

Ho anche modificato il file JavaScript per rimuovere alcuni controlli che possono aver impedito l'Listener di lavorare:

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

Ho modificato correttamente il file JavaScript? Non conosco JavaScript me stesso e ho seguito this guide. È stato aggiunto il Pushpin e sto vedendo il mio BingMapsView, ma il metodo OnClick non viene eseguito. C'è qualcosa che mi manca?

Il percorso che Bing impiega per creare ascoltatori ed eventi per gli eventi di clic Pushpin è quasi un labirinto a mio parere. Ci deve essere un modo più semplice per fare questo che mi manca. Qualcuno può dare qualche consiglio?

+0

potrebbe essere un problema di visualizzazione sovrapposizione –

+0

Qualcuno ha codice funzionante di EntityClickListener per Bing Maps? Se puoi darmi un po 'di codice, posso provare a capirlo da solo. Mi sto strappando i capelli per un paio di settimane. –

+0

Ciao @Yawus, hai provato questo link, http://bingmapsandroidsdk.codeplex.com/discussions/263960/ –

risposta

2

Ho finalmente trovato la risposta! Modificare i seguenti metodi nel file JavaScript in modo tale che lo script non controlli i metadati che non esistono.

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

Quindi, modificare il metodo ShowInfoBox nel file JavaScript per

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

Questo codice imbuti dritto al click ascoltatore si codice nel tuo Activity, invece di fare in giro con esso in JavaScript. La differenza dal JavaScript che ho modificato in precedenza è che il parametro per il metodo entityClicked dovrebbe essere in realtà entity.entityId non entityId.