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);
...
我正在尝试在下面的 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);
...