簡體   English   中英

使用Android Mapbox SDK顯示多個標記的自定義infoWindow

[英]Show custom infoWindow for multiple markers using Android Mapbox SDK

我正在嘗試在地圖上可視化多個標記。 它的顯示效果非常好,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();
            }

        });

很高興為您提供幫助。 我假設您使用的是Mapbox Android SDK的3.2.0版本。 如果是這樣,我在上面發布的代碼中看到了兩個問題。

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;
    }
});

希望這會有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM