当用户单击 mMap.setOnMarkerClickListener 时如何发送值?
Posted
技术标签:
【中文标题】当用户单击 mMap.setOnMarkerClickListener 时如何发送值?【英文标题】:How can send values when user click the mMap.setOnMarkerClickListener? 【发布时间】:2021-11-14 17:44:24 【问题描述】:当用户点击 mMap.setOnMarkerClickListener 时如何发送值?
我不知道为什么当用户点击谷歌地图标记时我总是得到相同的值。
这是 Firebase 数据
"Campsite" :
"-MfS3VgBGROs_afkVrjl" :
"CamperSiteAddress" : "Charles St & Esplanade W, Triabunna TAS 7190, Australia",
"CamperSiteID" : "-MfS3VgBGROs_afkVrjl",
"Counrty" : "Australia",
"CamperSiteImages" : [
"https://firebasestorage.googleapis.com/v0/b/campingau-6b84d.appspot.com/o/CampSitePhotos%2F1627206575487.null?alt=media&token=bff07bd4-fd17-4099-a0d7-db0418311425",
"https://firebasestorage.googleapis.com/v0/b/campingau-6b84d.appspot.com/o/CampSitePhotos%2F1627206580478.null?alt=media&token=995bf983-0ee8-4f25-af3f-921aa5b0077c",
"https://firebasestorage.googleapis.com/v0/b/campingau-6b84d.appspot.com/o/CampSitePhotos%2F1627206584072.null?alt=media&token=137b87a9-f6fb-4f75-9d53-7c3efda8cda4"
],
"CamperSiteLatitude" : -42.508695,
"CamperSiteLongitude" : 147.916617,
"CamperSiteName" : "Encampment Cove Walk"
这是我的代码
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Campsite");
Query query = reference.orderByChild("country").equalTo(country);
query.addChildEventListener(new ChildEventListener()
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName)
list.clear();
List<String> mapImage = (List<String>) dataSnapshot.child("CamperSiteImages").getValue();
Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
Double lat = (Double)map.get("CamperSiteLatitude");
Double lng = (Double)map.get("CamperSiteLongitude");
LatLng newLocation = new LatLng(lat, lng);
String CampSiteName = (String) map.get("CamperSiteName");
String CampSitePostID = (String) map.get("CamperSiteID");
String CampSiteType= (String) map.get("type");
String CampSiteImage = mapImage.get(0);
list.add(String.valueOf(newLocation));
for(int i = 0; i < list.size(); i++)
try
//bitmap = Ion.with(getApplicationContext()).load(CampSiteImage).withBitmap().fitCenter().resize(120,120).asBitmap().get();
catch (Exception e)
e.printStackTrace();
mMap.addMarker(new MarkerOptions().position(newLocation).title(CampSiteName).icon(BitmapDescriptorFactory.fromResource(icon)));
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()
@Override
public boolean onMarkerClick(Marker marker)
Toast.makeText(getContext(),CampSitePostID, Toast.LENGTH_SHORT).show();
return false;
);
progressDialog.dismiss();
现在,当我单击标记时,标题是正确的,但我总是得到相同的 CamperSiteID。如何解决这个问题?
【问题讨论】:
【参考方案1】:当您添加一个标记时,它会返回一个Marker 对象,该对象具有一个可供应用程序与标记关联的字段——称为tag
字段(使用getTag
和setTag
访问)。然后可以在onMarkerClick
回调中检索此标记字段。
所以在你的代码中你可以这样做:
Marker m = mMap.addMarker(new MarkerOptions().position(newLocation).title(CampSiteName).icon(BitmapDescriptorFactory.fromResource(icon)));
m.setTag(CampSitePostID);
在标记点击回调中:
public boolean onMarkerClick(Marker marker)
String campSiteID = "?";
if (marker.getTag() != null)
campSiteID = (String) marker.getTag();
//...use campSiteID instead of CampSitePostID
以下是文档中的更多信息:https://developers.google.com/maps/documentation/android-sdk/marker#associate_data_with_a_marker。
如果您的应用程序有比简单字符串更多的数据要关联,那么可以实现更复杂的解决方案:
-
由于
tag
是一个对象实例,您可以将您选择的任何对象关联起来,例如具有许多属性的类(甚至是您的示例中的map
变量)
由于每个标记都有一个唯一的 id
字段 (m.getId()
),您可以使用该字段作为您自己的地图实现的键来访问相关数据。标记 ID 对于地图的当前实例是唯一的(重新启动应用或重新初始化地图时会重置编号)。
作为 (1) 和 (2) 的组合,您可以创建自己的映射键并将其设置为 tag
值,然后使用该键映射到您自己的数据中。
注意事项:
-
地图只有一个标记单击事件处理程序。在您的代码中,您正在为每个 firebase 回调设置标记单击事件处理程序。这是不必要的,这可能会导致最后添加的标记是用于任何标记点击的 CampSitePostId。
在你的
onChildAdded
你首先list.clear()
清空列表然后执行list.add
然后循环列表的大小;但它总是大小为 1。
【讨论】:
以上是关于当用户单击 mMap.setOnMarkerClickListener 时如何发送值?的主要内容,如果未能解决你的问题,请参考以下文章