我正在尝试在地图上显示多个标记。它显示完美和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();
}
});
答案 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;
}
});
希望这有帮助!