2012-06-28 54 views
5

Tôi gặp sự cố với EntityClickedListener trong Bản đồ Bing. Tôi đã mã hóa nó theo ví dụ được đưa ra:Thêm trình xử lý sự kiện nhấp chuột vào 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(); 
    } 
}); 

Tuy nhiên, nhấp vào Pushpin thì không có gì. Tôi đã tạo một thông báo Toast để xem chính xác những gì trong siêu dữ liệu nhưng không có gì xảy ra. Nhìn qua con đường ứng dụng, tôi có thể nói rằng Bing sử dụng một dịch vụ dữ liệu để lấy thông tin của mình:

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

Tôi cũng thay đổi nội dung tệp JavaScript để loại bỏ một số kiểm tra có thể đã ngăn chặn các Listener từ làm việc:

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

Tôi đã chỉnh sửa tệp JavaScript chính xác chưa? Tôi không biết JavaScript bản thân mình và tôi đã theo dõi this guide. Các Pushpin đang được thêm vào và tôi đang nhìn thấy trên BingMapsView của tôi, nhưng phương pháp OnClick không thực thi. Có cái gì tôi đang mất tích?

Đường dẫn mà Bing cần để tạo Người nghe và sự kiện cho Pushpin sự kiện nhấp gần như là một mê cung theo ý kiến ​​của tôi. Có phải là một cách đơn giản hơn để làm điều này mà tôi đang thiếu. Bất cứ ai có thể đưa ra lời khuyên nào?

+0

có thể là vấn đề của lớp phủ chế độ xem –

+0

Có ai có mã hoạt động của 'EntityClickListener' cho Bản đồ Bing không? Nếu bạn chỉ có thể cho tôi một số mã, tôi có thể tự mình tìm ra nó. Tôi đã xé mái tóc của tôi ra khỏi cái này trong vài tuần qua. –

+0

Xin chào @Yawus, bạn đã thử liên kết này chưa, http://bingmapsandroidsdk.codeplex.com/discussions/263960/ –

Trả lời

2

Tôi cuối cùng đã tìm thấy câu trả lời! Chỉnh sửa các phương thức sau trong tệp JavaScript sao cho tập lệnh không kiểm tra siêu dữ liệu không tồn tại.

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

Sau đó, thay đổi phương pháp ShowInfoBox trong file Javascript để

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

Mã này phễu thẳng đến nhấp chuột nghe bạn mã trong Activity của bạn thay vì rối tung xung quanh với nó trong JavaScript. Sự khác biệt so với JavaScript tôi đã chỉnh sửa trước đó là tham số cho phương thức entityClicked thực sự là entity.entityId không phải là entityId.

Các vấn đề liên quan