我试图动态地向地图添加标记,从JSON获取数据,并且该部分正常工作,我可以在多个位置添加多个标记,但是当我点击标记时我想要一个警报对话框打开,此警报对话框必须包含有关该标记的一些信息,但是现在我的信息总是相同的,如果创建警报对话框不在创建标记的同一周期中
请参阅我的代码:
final JSONArray array = new JSONArray(jsonStrOportunidades);
for (int i = 0; i < array.length(); i++)
{
JSONObject jsonObject = array.getJSONObject(i);
final String Designacao = jsonObject.getString("Designacao");
String Coord_LAT = jsonObject.getString("Coord_LAT");
String Coord_LONG = jsonObject.getString("Coord_LONG");
final String Morada = jsonObject.getString("Morada");
final HashMap<String, String> oportunidades = new HashMap<>();
oportunidades.put("Designacao", Designacao);
oportunidades.put("Coord_LAT", Coord_LAT);
oportunidades.put("Coord_LONG", Coord_LONG);
oportunidades.put("Morada", Morada);
double lat1 = Double.parseDouble(Coord_LAT);
double lng1 = Double.parseDouble(Coord_LONG);
mMap.addMarker(new MarkerOptions().position(new LatLng(lat1, lng1)));
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
new AlertDialog.Builder(MapsActivity.this)
.setTitle(Designacao)
.setMessage("Endereço: " + Morada + "\n" + "Telefone: " )
.setPositiveButton("Ir", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
new GetDirecoes().execute();//Enviar as coordenadas
mBottomSheetBehavior.setPeekHeight(250);
}
})
.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
return false;
}
});
listaOportunidades.add(oportunidades);
}
答案 0 :(得分:1)
每次方法
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
new AlertDialog.Builder(MapsActivity.this)
.setTitle(Designacao)
.setMessage("Endereço: " + Morada + "\n" + "Telefone: " )
.setPositiveButton("Ir", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
new GetDirecoes().execute();//Enviar as coordenadas
mBottomSheetBehavior.setPeekHeight(250);
}
})
.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
return false;
}
});
调用,它会覆盖您之前设置的OnMarkerClickListener。出于这个原因,最后将最后一个OnMarkerClickListener设置为map,这就是为什么它在每次点击时给出相同的地点信息(最后一个地方的信息)。
要解决此问题,您必须使用从onMarkerClick(标记标记)方法接收的标记对象,并将侦听器设置在循环外部。您可以将位置设置为标记的标记,稍后在onMarkerClick(标记标记)中,您可以检查位置并从listaOportunidades获取相关的位置信息。
Marker m = mMap.addMarker(new MarkerOptions().position(new LatLng(lat1, lng1)));
m.setTag(i);
以后
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
int position = (int) marker.getTag();
// Show your alert dialog for the information related to the position
return false;
}
});
答案 1 :(得分:0)
在循环的每次迭代中,您在GoogleMap.OnMapClickListener
对象上重新分配GoogleMap
。因此,侦听器将获得JSON数组中最后一个对象的信息。确保只设置OnMapClickListener
一次。
此解决方案是将额外数据添加到标记和侦听器中的提取。
Marker marker = new MarkerOptions().position(new LatLng(lat1, lng1));
marker.setTag(extraInfo)
然后在听众中
public boolean onMarkerClick(Marker marker) {
ExtraInfo info = (ExtraInfo)marker.getTag();
}