使用Android Mapbox SDK为多个标记显示自定义infoWindow

时间:2016-03-29 11:48:31

标签: android mapbox markers

我正在尝试在地图上显示多个标记。它显示完美和onMarkerTap显示从数据库中检索的信息为JSON。我想要做的是在自定义布局或底部工作表中显示信息。当用户点击标记时,将显示底部工作表,其中包含与该标记相关的信息。我使用以下代码显示多个标记。这里在MapViewListener部分onTapMarker我已经设置了marker.getTitle()来显示Toast中的标记名称进行测试。但它显示所有标记的相同标记名称。但是在infoWindow内置的那个节目在地图上显示准确的数据。我该如何解决这个问题?

        FloatingActionButton layerButton = (FloatingActionButton)findViewById(R.id.layer);
        layerButton.setOnClickListener(new View.OnClickListener() {

            public void getData() {
                String url = Config.DATA_URL;

                StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        showJSON(response);
                    }
                },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(MainActivity.this,error.getMessage().toString(),Toast.LENGTH_LONG).show();
                            }
                        });


                requestQueue.add(stringRequest);
            }

            public void showJSON(String response){

                try {
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray(Config.JSON_ARRAY);
                    for (int i=0;i<jsonArray.length();i++){
                        JSONObject singleMarker = jsonArray.getJSONObject(i);
                        String poi_name = singleMarker.getString(Config.POI_NAME);
                        String poi_latitude = singleMarker.getString(Config.POI_LATITUDE);
                        String poi_longitude = singleMarker.getString(Config.POI_LONGITUDE);

                        Double dbl_latitude = Double.parseDouble(poi_latitude);
                        Double dbl_longitude = Double.parseDouble(poi_longitude);


                        final Marker marker = new Marker(poi_name, poi_thananame, new LatLng(dbl_latitude, dbl_longitude));
                        marker.setMarker(getResources().getDrawable(R.mipmap.poi_shopping));
                        mapView.addMarker(marker);

                        mapView.setMapViewListener(new MapViewListener() {
                            @Override
                            public void onShowMarker(MapView pMapView, Marker pMarker) {
                            }

                            @Override
                            public void onHideMarker(MapView pMapView, Marker pMarker) {
                            }

                            @Override
                            public void onTapMarker(MapView pMapView, Marker pMarker) {
                                Toast.makeText(getApplicationContext(), " Name: "+marker.getTitle()+, Toast.LENGTH_LONG).show(); 
                            }

                            @Override
                            public void onLongPressMarker(MapView pMapView, Marker pMarker) {
                            }

                            @Override
                            public void onTapMap(MapView pMapView, ILatLng pPosition) {
                            }

                            @Override
                            public void onLongPressMap(MapView pMapView, ILatLng pPosition) {
                            }
                        });

                    }


                } catch (JSONException e) {
                    e.printStackTrace();
                }
//
//                mapView.setCenter(new LatLng(dbl_latitude, dbl_longitude));
//                mapView.setZoom(18);

            }

            //////END OF GET DATA///////

            @Override
            public void onClick(View v) {
                clearLayerFAB.setVisibility(View.VISIBLE);
                getData();
            }

        });

1 个答案:

答案 0 :(得分:3)

很高兴为您提供帮助。我假设您使用的是3.2.0版本的Mapbox Android SDK。如果是这样,我发现上面发布的代码存在两个问题。

1)您正在for循环中设置监听器,因此每次添加标记时,您只需重置监听器。

2)3.2.0和更新的4.0.0都有setOnMarkerClickListener方法可以调用,在其中你可以添加你的吐司。所以它看起来像这样:

for (int i=0;i<jsonArray.length();i++){

    // Add your markers here

}

// Setup your listener here
mapView.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(@NonNull Marker marker) {

    Toast.makeText(getApplicationContext(), " Name: "+marker.getTitle()+, Toast.LENGTH_LONG).show();

    return false;
    }
});

希望这有帮助!