如何将点击的Google Map标记详情传递至新Activity?
解决点击Google Maps Marker传递详情到新Activity的问题
你现在的问题核心是:点击Marker时没有把该标记对应的数据库详情数据关联并传递到新Activity。虽然你成功加载了所有Marker,点击事件也能触发,但Intent里没有携带任何和当前点击Marker相关的信息,新Activity自然拿不到对应详情。
下面是具体的解决步骤,结合你的代码来修改:
步骤1:给每个Marker绑定对应的数据
在添加Marker的时候,把该标记对应的HashMap(或者你可以封装成自定义实体类,代码更规范)通过setTag()方法绑定到Marker上,这样点击时就能直接拿到关联数据:
if (location != null) { for (int i = 0; i < location.size(); i++) { HashMap<String, String> placeData = location.get(i); placename = placeData.get("placename").toString(); place = placeData.get("place").toString(); lat = Double.parseDouble(placeData.get("lat")); lng = Double.parseDouble(placeData.get("lng")); LatLng latLng = new LatLng(lat, lng); MarkerOptions marker = new MarkerOptions().position(latLng).title(placename); // 把当前的placeData绑定到Marker上 Marker addedMarker = mMap.addMarker(marker); addedMarker.setTag(placeData); } }
步骤2:在点击事件中获取数据并传递到新Activity
在onMarkerClick方法里,通过marker.getTag()拿到绑定的HashMap,然后把需要的详情数据通过Intent.putExtra()传递给新Activity:
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { // 获取绑定的地点数据 HashMap<String, String> placeData = (HashMap<String, String>) marker.getTag(); if (placeData != null) { Intent intent = new Intent(MapsActivity.this, PlaceInfoActivity.class); // 把需要展示的字段逐个放入Intent intent.putExtra("placename", placeData.get("placename")); intent.putExtra("place", placeData.get("place")); intent.putExtra("lat", placeData.get("lat")); intent.putExtra("lng", placeData.get("lng")); // 如果还有其他数据库字段,继续添加putExtra即可 startActivity(intent); } return false; } });
步骤3:在新Activity中接收并展示数据
在PlaceInfoActivity的onCreate方法里,获取Intent传递过来的数据,然后展示到对应的UI控件上:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_place_info); // 从Intent中取出传递的数据 Intent intent = getIntent(); String placename = intent.getStringExtra("placename"); String place = intent.getStringExtra("place"); String lat = intent.getStringExtra("lat"); String lng = intent.getStringExtra("lng"); // 把数据绑定到UI控件(示例用TextView展示) TextView tvPlacename = findViewById(R.id.tv_placename); TextView tvPlace = findViewById(R.id.tv_place); TextView tvLatLng = findViewById(R.id.tv_latlng); tvPlacename.setText(placename); tvPlace.setText(place); tvLatLng.setText(String.format("坐标:%s, %s", lat, lng)); }
可选优化:使用自定义实体类(更规范)
如果你觉得用HashMap不够清晰,可以创建一个Place实体类来封装数据,避免字符串键名出错:
public class Place implements Serializable { // 实现Serializable方便Intent传递 private String placename; private String place; private double lat; private double lng; // 构造方法 public Place(String placename, String place, double lat, double lng) { this.placename = placename; this.place = place; this.lat = lat; this.lng = lng; } // Getter方法 public String getPlacename() { return placename; } public String getPlace() { return place; } public double getLat() { return lat; } public double getLng() { return lng; } }
然后在加载数据库数据时,直接转换成Place对象:
List<Place> placeList = new ArrayList<>(); for (int i = 0; i < data.length(); i++) { JSONObject c = data.getJSONObject(i); String placename = c.getString("placename"); String place = c.getString("place"); double lat = c.getDouble("lat"); double lng = c.getDouble("lng"); placeList.add(new Place(placename, place, lat, lng)); }
添加Marker时绑定Place对象:
for (Place place : placeList) { LatLng latLng = new LatLng(place.getLat(), place.getLng()); MarkerOptions marker = new MarkerOptions().position(latLng).title(place.getPlacename()); Marker addedMarker = mMap.addMarker(marker); addedMarker.setTag(place); }
点击时直接传递整个Place对象:
Place place = (Place) marker.getTag(); intent.putExtra("place", place);
在新Activity中接收:
Place place = (Place) getIntent().getSerializableExtra("place"); // 然后通过getter方法获取字段展示即可
这样修改后,点击Marker就能把对应的详情数据传递到新Activity并正常展示了。
内容的提问来源于stack exchange,提问作者user8665157
相关产品推荐
相关产品推荐

