首页 > 解决方案 > 在MarkerClickListener 上显示警报对话框

问题描述

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

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

然而,这并没有奏效。当我单击一个标记时,无论它是什么标记,它总是直接转到单击侦听器中的 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;
                               }
                           });

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

先感谢您。

标签: androidgoogle-mapsmaterial-uigoogle-maps-markers

解决方案


设置标签的正确方法是获取Marker结果addMarker然后调用.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该类的 API:https ://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker


我还注意到您的字符串比较是错误的,请改用:

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

简而言之,==is 引用相等(相同实例)和equalsis 值相等。(您也不需要toString.)供参考:https ://stackoverflow.com/a/513839/2711811


推荐阅读