android - 在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;
}
});
如果有人可以帮助我,我将不胜感激!
先感谢您。
解决方案
设置标签的正确方法是获取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 引用相等(相同实例)和equals
is 值相等。(您也不需要toString
.)供参考:https ://stackoverflow.com/a/513839/2711811
推荐阅读
- c# - 为什么我们可以把一个GetComponent的结果
在 Behavior 数组中但不能执行 GetComponent (出行为数组 [X])? - c# - WPF 自定义 NumericUpDown 对象引用异常
- c# - 在 C# 中打印整个表格
- python - 如何在odoo中按字段值搜索字段?
- ios - 如何安装 LinqToObjectiveC cocoapod?
- spring - Postgres:如何记录由 Spring JPA 创建的事务的锁
- ios - Swift:转义闭包成功后如何将值传递给前一个 ViewController
- node.js - 如何对文档中的某些字段求和并将此总和放在另一个字段中
- c# - 具有透明度的PNG周围的模糊背景颜色
- c# - 获取 MSIX 包中文件的位置