当用户单击 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 字段(使用getTagsetTag 访问)。然后可以在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 时如何发送值?的主要内容,如果未能解决你的问题,请参考以下文章

仅当用户单击 [重复] 时如何执行 JS 文件

当用户单击侧导航中的按钮时显示数据 - html

当用户单击页面正文的其他位置时隐藏 nabber [关闭]

当用户单击视图的背景时,如何使键盘消失?

当用户单击 mMap.setOnMarkerClickListener 时如何发送值?

当用户在 Qt 应用程序中单击任务栏/停靠图标时获取事件或通知