【问题标题】:Google maps getTag() is always null even though setTag() is notGoogle 地图 getTag() 始终为 null,即使 setTag() 不是
【发布时间】:2019-11-08 10:09:03
【问题描述】:

我正在尝试在下面的 addMarkers 方法中通过 marker.setTag(Object object) 添加标签。我已经调试以确保标签中设置的值中没有 null。但是,当我尝试通过 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);
                    }
                }
            }
        });
    }

这是我检索标签的方法。我知道标记不仅不为空,而且是正确的,因为我在地图上获得了正确的纬度/位置以及标题和 sn-p:

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

【问题讨论】:

    标签: android google-maps infowindow


    【解决方案1】:

    来自您的代码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); 行,但仅为“第二次添加”标记设置标签。可能当您尝试通过getTag() 为单击的标记检索标记数据时,它会调用“首次添加”标记而没有设置标记(因为两个标记具有相同的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);
    ...
    

    【讨论】:

    • 你是对的。我的理解有缺陷。我认为通过分配标记它不会被放置在地图上;这就是为什么我将它添加到地图然后将其分配给标记变量的原因。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2014-10-21
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多