2016-03-29 204 views
0

我想要在地图上可视化多个标记。它的完美展示和onMarkerTap从数据库检索的显示信息为JSON。我想要做的是在自定义布局或底部工作表中显示信息。当用户点击标记时,底部表单将出现,并显示与该标记相关的信息。我正在使用下面的代码来显示多个标记。这里MapViewListener部分onTapMarker我已经设置了marker.getTitle()在Toast中显示标记名称以进行测试。但它为所有标记显示相同的标记名称。但在地图上显示的infoWindow中显示精确的数据。我该如何解决这个问题?使用Android Mapbox SDK显示多个标记的自定义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

高兴地帮助你与这一个。我假设您使用的是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; 
    } 
}); 

希望这有助于!

+0

我正在使用0.7.4 SDK版本。我正在使用tilemill创建的服务器使用自定义磁贴。这就是我使用旧SDK的原因。不幸的是,它不支持setOnMarkerClickListner。 Thogh解决了。我忘了叫pMarker而不是标记。这里是... Toast.makeText(getApplicationContext(),“Name:”+ pMarker.getTitle(),Toast.LENGTH_LONG).show(); –

相关问题