使用onClickListener创建标记,动态打开AlertDialog

时间:2017-03-30 08:59:51

标签: android json google-maps google-maps-markers android-alertdialog

我试图动态地向地图添加标记,从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);
} 

2 个答案:

答案 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();
}