Marker.remove(),Marker.setPosition 不工作
Marker.remove(), Marker.setPosition not working
你好,我正在使用 Geofire,每当我的查询范围内有一个对象时,我都会尝试使用标记在用户地图上显示它并实时更新标记位置。
我在 geofire onkeyentered 方法中初始化标记,然后当键的位置发生变化时(因此调用 onkeymoved),我使用 marker.setposition 更改标记的位置。但是,标记会在原始位置创建它的副本,然后移动(创建 2 个标记,即使我只使用了 setPosition)
这是 geofire 侦听器的代码:
geoQueryP.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
LatLng drivLoc = new LatLng(location.latitude, location.longitude);
createDriverMarker(key, drivLoc, reference);
}
@Override
public void onKeyExited(String key) {
if(markerPoints.get(key) != null) {
markerPoints.get(key).remove();
markerPoints.remove(key);
}
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
if(markerPoints.get(key) != null) {
markerPoints.get(key).setPosition(new LatLng(location.latitude, location.longitude));
}
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
Toast.makeText(getApplicationContext(), error + " Please Try Again", Toast.LENGTH_LONG).show();
}
});
这是 createDriverMarker 方法的代码:
private void createDriverMarker(String key, LatLng drivLocation, String reference) {
MarkerOptions markerOptions = new MarkerOptions();
locationRelatedFunctions bitmap = new locationRelatedFunctions();
markerOptions.position(drivLocation)
.title(reference)
.icon((bitmap.bitmapDescriptorFromVector(getApplicationContext(), R.drawable.ic_radio_button_checked_black_24dp)));
Marker marker = mMap.addMarker(markerOptions);
markerPoints.put(key, marker);
}
MarkerPoints 是一个 hashmap,初始化如下:
public HashMap<String, Marker> markerPoints;
然后在 onCreate 中:
markerPoints = new HashMap<String, Marker>();
怀疑 onKeyEntered
被调用的次数超过预期 - 但可以补救:
public void onKeyEntered(String key, GeoLocation location) {
LatLng drivLoc = new LatLng(location.latitude, location.longitude);
if (!markerPoints.containsKey(key)) {
createDriverMarker(key, drivLoc, reference);
} else {
// this part is optional given that the 'moved' event may have
// triggered first...
onKeyMoved(key,location);
}
}
您可能想要添加调试以确认额外的 onKeyEntered 调用。
您的 OP 代码中的一个缺陷是沿着相同的行 - 如果 onKeyEntered 为同一个键调用两次,你最终会得到 2 个标记 - 自从第二个 'put' 相同的键以来,一个未被管理覆盖第一个但在地图上保留原始标记。原则上,您的代码应该可以工作 - 但您仍应防范意外事件序列。
更完整的分析需要您发布如何使用位置更新来更新 GeoFire。
你好,我正在使用 Geofire,每当我的查询范围内有一个对象时,我都会尝试使用标记在用户地图上显示它并实时更新标记位置。
我在 geofire onkeyentered 方法中初始化标记,然后当键的位置发生变化时(因此调用 onkeymoved),我使用 marker.setposition 更改标记的位置。但是,标记会在原始位置创建它的副本,然后移动(创建 2 个标记,即使我只使用了 setPosition)
这是 geofire 侦听器的代码:
geoQueryP.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
LatLng drivLoc = new LatLng(location.latitude, location.longitude);
createDriverMarker(key, drivLoc, reference);
}
@Override
public void onKeyExited(String key) {
if(markerPoints.get(key) != null) {
markerPoints.get(key).remove();
markerPoints.remove(key);
}
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
if(markerPoints.get(key) != null) {
markerPoints.get(key).setPosition(new LatLng(location.latitude, location.longitude));
}
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
Toast.makeText(getApplicationContext(), error + " Please Try Again", Toast.LENGTH_LONG).show();
}
});
这是 createDriverMarker 方法的代码:
private void createDriverMarker(String key, LatLng drivLocation, String reference) {
MarkerOptions markerOptions = new MarkerOptions();
locationRelatedFunctions bitmap = new locationRelatedFunctions();
markerOptions.position(drivLocation)
.title(reference)
.icon((bitmap.bitmapDescriptorFromVector(getApplicationContext(), R.drawable.ic_radio_button_checked_black_24dp)));
Marker marker = mMap.addMarker(markerOptions);
markerPoints.put(key, marker);
}
MarkerPoints 是一个 hashmap,初始化如下:
public HashMap<String, Marker> markerPoints;
然后在 onCreate 中:
markerPoints = new HashMap<String, Marker>();
怀疑 onKeyEntered
被调用的次数超过预期 - 但可以补救:
public void onKeyEntered(String key, GeoLocation location) {
LatLng drivLoc = new LatLng(location.latitude, location.longitude);
if (!markerPoints.containsKey(key)) {
createDriverMarker(key, drivLoc, reference);
} else {
// this part is optional given that the 'moved' event may have
// triggered first...
onKeyMoved(key,location);
}
}
您可能想要添加调试以确认额外的 onKeyEntered 调用。
您的 OP 代码中的一个缺陷是沿着相同的行 - 如果 onKeyEntered 为同一个键调用两次,你最终会得到 2 个标记 - 自从第二个 'put' 相同的键以来,一个未被管理覆盖第一个但在地图上保留原始标记。原则上,您的代码应该可以工作 - 但您仍应防范意外事件序列。
更完整的分析需要您发布如何使用位置更新来更新 GeoFire。