【问题标题】:Marker.remove(), Marker.setPosition not workingMarker.remove(),Marker.setPosition 不工作
【发布时间】:2023-03-25 18:45:01
【问题描述】:

嗨,所以我正在使用 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>();

【问题讨论】:

  • 好的!然后你的代码中有一个逻辑错误。如果我能找到它,我会看看。我将删除我的原始答案,因为它对您没有帮助。

标签: android google-maps google-maps-markers geofire


【解决方案1】:

怀疑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 个标记 - 一个不受管理,因为同一个键的第二个“放置”覆盖了第一个但在地图上留下原始标记。原则上,您的代码应该可以工作 - 但您仍应防范意外事件序列。

更完整的分析需要您发布如何使用位置更新来更新 GeoFire。

【讨论】:

  • 是的,这行得通!非常感谢,尽管它确实提出了为什么 onkeyentered 被触发两次的问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 2020-03-09
  • 2021-01-10
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2018-12-22
  • 2016-04-19
相关资源
最近更新 更多