Google maps getTag() 始终为 null,即使 setTag() 不是

Google maps getTag() is always null even though setTag() is not

我正在尝试在下面的 addMarkers 方法中通过 marker.setTag(Object object) 添加标签。我已经调试以确保标签中设置的值不为空。但是,当我尝试通过 getTag() 检索标签数据时,我得到的是 null,我不知道为什么会出错,我不知道我出了什么问题。

private void addMarkers() {
        resetMap();
        CollectionReference restaurantCollection = FirebaseFirestore.getInstance().collection("Restaurant_Data");
        restaurantCollection.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                    GeoPoint restaurantPoints = documentSnapshot.getGeoPoint("geoPoint");
                    String restaurantName = documentSnapshot.getString("restaurantName");
                    String snippet = documentSnapshot.getString("restaurantDescription");
                    double lat = restaurantPoints.getLatitude();
                    double lng = restaurantPoints.getLongitude();
                    LatLng latLng = new LatLng(lat, lng);

                    if (googleMap != null) {
                        MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(restaurantName).icon(BitmapDescriptorFactory.defaultMarker(162)).snippet(snippet);
                        googleMap.addMarker(markerOptions);
                        Marker marker = googleMap.addMarker(markerOptions);
                        RestaurantMarker restaurantMarker = new RestaurantMarker(documentSnapshot.getId(), marker);
                        markerRestaurantIdArrayList.add(restaurantMarker);
                        marker.setTag(restaurantMarker);
                    }
                }
            }
        });
    }

这是我检索标签的方法。我知道标记不仅不为空,而且是正确的标记,因为我在地图上得到了正确的 latlng/placement 以及标题和摘要:

@Override
    public void onInfoWindowClick(final Marker marker) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(mapviewContext);
        builder.setMessage(marker.getSnippet()).setCancelable(true).setPositiveButton("See Menu", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                RestaurantMarker restaurantMarker = (RestaurantMarker)marker.getTag();
                if (restaurantMarker != null && marker.getTag() instanceof RestaurantMarker) {
                    Log.d(TAG, "restaurant ID:"+ restaurantMarker.getRestaurantId());
                    bundle.putString("restaurantId", restaurantMarker.getRestaurantId());
                    bundle.putString("restaurantName", marker.getTitle());
                    bundle.putBoolean("direction", true);
                    restaurantMapListener.onRestaurantMap(bundle);
                } else {
                    Log.d(TAG, "restaurant marker is null");
                }
                dialogInterface.cancel();
            }
        }).setNegativeButton("Calculate Distance", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                resetSelectedMarker();
                selectedMarker = marker;
                calculateDirections(marker);
                dialogInterface.dismiss();
                markerRestaurantName = marker.getTitle();
            }
        });
        final AlertDialog alert = builder.create();
        alert.show();
    }

最后是 RestaurantMaker POJO。这里也没有问题,因为我在其他地方使用它并且没有任何问题:

public class RestaurantMarker {
    public String restaurantId;
    public Marker restaurantMarker;

    public RestaurantMarker(String restaurantId, Marker restaurantMarker) {
        this.restaurantId = restaurantId;
        this.restaurantMarker = restaurantMarker;
    }

    public String getRestaurantId() {
        return restaurantId;
    }

    public void setRestaurantId(String restaurantId) {
        this.restaurantId = restaurantId;
    }

    public Marker getRestaurantMarker() {
        return restaurantMarker;
    }

    public void setRestaurantMarker(Marker restaurantMarker) {
        this.restaurantMarker = restaurantMarker;
    }
}

来自您的 addMarkers() 代码:

...
MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(restaurantName).icon(BitmapDescriptorFactory.defaultMarker(162)).snippet(snippet);
googleMap.addMarker(markerOptions);
Marker marker = googleMap.addMarker(markerOptions);
RestaurantMarker restaurantMarker = new RestaurantMarker(documentSnapshot.getId(), marker);
markerRestaurantIdArrayList.add(restaurantMarker);
marker.setTag(restaurantMarker);
...

您将标记添加到 googleMap 两次(在相同的 LatLng 位置):一次在 googleMap.addMarker(markerOptions); 行,然后在 Marker marker = googleMap.addMarker(markerOptions); 行,但仅为 "second time added" 标记。可能当您尝试通过 getTag() 为单击的标记检索标记数据时,它会调用未设置标记的 "first time added" 标记(因为两个标记具有相同的 LatLng 坐标)。因此,尝试从 addMarkers() 方法中删除 googleMap.addMarker(markerOptions); 行:

...
MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(restaurantName).icon(BitmapDescriptorFactory.defaultMarker(162)).snippet(snippet);
//googleMap.addMarker(markerOptions);  <-- delete this line
Marker marker = googleMap.addMarker(markerOptions);
RestaurantMarker restaurantMarker = new RestaurantMarker(documentSnapshot.getId(), marker);
markerRestaurantIdArrayList.add(restaurantMarker);
marker.setTag(restaurantMarker);
...