在 MarkerClickListener 上显示警报对话框

Show alert dialog onMarkerClickListener

我有一个 for 循环,它为我的数据库中的每个条目绘制标记。但是,我想这样做,以便在单击每个标记时在 Material 警报对话框中显示特定于该标记的信息(从数据库检索的信息)。

现在,我正在尝试通过在创建标记时将我想要的信息放入标记上的标记中来实现这一点。然后,在创建警报对话框时,我从标签中获取信息并将其放在对话框中。

然而,这并没有奏效。当我点击一个标记时,无论它是什么标记,它总是直接进入点击监听器中的 else 语句——它显示一条 Toast 消息,上面写着“其他”。

没有错误消息,但它不工作。

如何解决此问题,以便在单击每个标记时在警告对话框中显示特定于每个标记的信息?

这是我的代码:

redColRef.get(source)
   .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
       @Override
       public void onComplete(@NonNull Task<QuerySnapshot> task) {
           if (task.isSuccessful()) {
               for (QueryDocumentSnapshot document : task.getResult()) {
                   java.util.Map<String, Object> mapOfPins = (HashMap<String, Object>) document.get("Location");


                   if (mapOfPins != null) {
                       Log.d(TAG, mapOfPins.get("latitude") + ", " + mapOfPins.get("longitude"));
                      pins = new LatLng(Double.valueOf(mapOfPins.get("latitude").toString()), Double.valueOf(mapOfPins.get("longitude").toString()));
                       direction = document.get("Direction").toString();
                       sender = document.get("Sender").toString();
                       java.util.Map<String, Object> detailsTag = new HashMap();
                       detailsTag.put("Location", pins);
                       detailsTag.put("Direction", direction);
                       detailsTag.put("Sender", sender);
                       switch (direction) {
                           case "North":
                           case "South":
                               map.addMarker(new MarkerOptions()
                                       .title("Pole Pin")
                                       .zIndex(0.6f)
                                       .icon(BitmapDescriptorFactory.fromResource(R.drawable.yellow))
                                       .position(pins));
// I realize that the "setTag()" is outside of the "addMarker()" so it doesn't work. But, I'm not sure how to fix that so that the tag is set.
                                       .setTag(detailsTag);

                               break;
                           case "East":
                           case "West":
                               map.addMarker(new MarkerOptions()
                                       .title("East-West Pin")
                                       .zIndex(0.7f)
                                       .icon(BitmapDescriptorFactory.fromResource(R.drawable.orange))
                                       .position(pins))
                                       .setTag(detailsTag);
                               break;
                           case "Other":
                               map.addMarker(new MarkerOptions()
                                       .title("Other Pin")
                                       .zIndex(0.8f)
                                       .icon(BitmapDescriptorFactory.fromResource(R.drawable.red))
                                       .position(pins))
                                       .setTag(detailsTag);
                               break;

                       }

                   }
               }
           } else {
               Log.d(TAG, task.getException().getMessage());
           }
       }
   });

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

                               @Override
                               public boolean onMarkerClick(Marker marker) {
                                   if (marker.getTag() != null) {
                                       if (marker.getTitle().toString() == "Pole Pin") {

                                           java.util.Map markerDetails= (HashMap) marker.getTag();

                                       new MaterialAlertDialogBuilder(getActivity())
                                               .setTitle("Pole Pin")
                                               .setMessage("Location: " + markerDetails.get("Location").toString() + "\n Direction: " + markerDetails.get("Direction") + "\n Sender: " + markerDetails.get("Sender"))
                                               .setPositiveButton("View Details", new DialogInterface.OnClickListener() {
                                                   @Override
                                                   public void onClick(DialogInterface dialog, int which) {
                                                       Intent inte = new Intent(getActivity(), login.class);
                                                       startActivity(inte);
                                                   }
                                               })
                                               .show();
                                   } else {
                                           Toast.makeText(getActivity(), "Other", Toast.LENGTH_SHORT).show();
                                       }
                               }

                                   return true;
                               }
                           });

如果有人能帮助我,我将不胜感激!

提前致谢。

设置标签的正确方法是获取addMarkerMarker结果,然后调用.setTag():

Marker m = map.addMarker(
                 new MarkerOptions()
                       .title("Pole Pin")
                       .zIndex(0.6f)
                       .icon(BitmapDescriptorFactory.fromResource(R.drawable.yellow))
                       .position(pins));
m.setTag(detailsTag);

对每个案例都做同样的事情。

这是 Marker class 的 API:https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker


我也注意到你的字符串比较是错误的,改用这个:

if (marker.getTitle().equals("Pole Pin")) {
    //...
}

简而言之,== 是引用相等(同一实例),equals 是值相等。 (您也不需要 toString。)供参考: