我EntityClickedListener在Bing地图中遇到问题.我按照给出的例子编写了它:
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();
}
});
Run Code Online (Sandbox Code Playgroud)
但是,点击Pushpin它什么都不做.我创建了一个Toast消息,以确切了解元数据中的内容但没有任何反应.通过应用程序的路径,我可以看出Bing使用数据服务来检索其信息:
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();
}
};
Run Code Online (Sandbox Code Playgroud)
我还编辑了JavaScript文件以删除一些可能阻止其Listener工作的检查:
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
};
Run Code Online (Sandbox Code Playgroud)
我是否正确编辑了JavaScript文件?我自己不懂JavaScript,而且我一直在关注本指南.将Pushpin被添加,我看到我的BingMapsView,但OnClick方法不执行.有什么我想念的吗?
Pushpin在我看来,Bing为点击事件创建监听器和事件所采用的路径几乎是一个迷宫.我必须有一种更简单的方法来做到这一点.有人可以提出任何建议吗?
我终于找到答案了!在 JavaScript 文件中编辑以下方法,以便脚本不会检查不存在的元数据。
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
};
Run Code Online (Sandbox Code Playgroud)
然后,将ShowInfoBoxJavaScript 文件中的方法更改为
this.ShowInfobox = function (entity) {
window.BingMapsInterlop.entityClicked(entity.layerName, entity.entityId);
};
Run Code Online (Sandbox Code Playgroud)
此代码直接传送到您在代码中编写的点击侦听器,Activity而不是在 JavaScript 中对其进行处理。与我之前编辑的 JavaScript 不同的是,该entityClicked方法的参数实际上不应该entity.entityId是entityId。
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |