如何获取Google Map中被点击标记的数据并传递至新Activity?
我明白你现在的困境:你已经成功在地图上加载了公寓标记,但点击信息窗口跳转到新Activity时,没办法拿到该标记对应的完整公寓数据(比如apartmentname、verification这些),只能获取Marker自带的id、title、snippet字段。下面我来帮你一步步解决这个问题。
问题根源
你当前的addMarker方法只把category、price存到了Marker的snippet和title属性里,但其他关键数据(比如id、apartmentname、verification)没有和Marker做绑定,所以点击信息窗口时无法直接获取这些完整信息。
解决方案:用Marker的setTag()存储完整数据
Google Map的Marker对象提供了setTag()和getTag()方法,可以让你把任意业务对象和Marker绑定,这样点击时就能直接取出完整数据。具体步骤如下:
1. 创建Apartment数据类封装所有信息
首先我们定义一个简单的Apartment类,把所有公寓数据封装进去,方便后续存储和获取:
public class Apartment { private String id; private String verification; private String apartmentName; private String category; private String price; private LatLng latLng; // 构造方法 public Apartment(String id, String verification, String apartmentName, String category, String price, LatLng latLng) { this.id = id; this.verification = verification; this.apartmentName = apartmentName; this.category = category; this.price = price; this.latLng = latLng; } // 对应字段的Getter方法 public String getId() { return id; } public String getVerification() { return verification; } public String getApartmentName() { return apartmentName; } public String getCategory() { return category; } public String getPrice() { return price; } public LatLng getLatLng() { return latLng; } }
2. 修改addMarker方法,绑定数据到Marker的Tag
在getMarkers的循环逻辑里,先创建Apartment对象,然后添加Marker时把这个对象设置为Marker的Tag:
private void addMarker(Apartment apartment) { if (mCurrLocationMarker != null) { mCurrLocationMarker.remove(); } MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(apartment.getLatLng()); markerOptions.title(apartment.getPrice()); markerOptions.snippet(apartment.getCategory()); // 根据verification设置marker图标 markerOption(apartment.getVerification(), markerOptions); // 添加Marker并将Apartment对象绑定到Tag Marker marker = mGoogleMap.addMarker(markerOptions); marker.setTag(apartment); }
然后修改getMarkers里的循环代码:
for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); verification = jsonObject.getString(VERIFICATION); apartmentname = jsonObject.getString(TAG_APARTMENTNAME); category = jsonObject.getString(TAG_CATEGORY); price = jsonObject.getString(TAG_PRICE); id = jsonObject.getString("userID"); latLng = new LatLng(Double.parseDouble(jsonObject.getString(LAT)), Double.parseDouble(jsonObject.getString(LNG))); // 创建Apartment对象并传入所有数据 Apartment apartment = new Apartment(id, verification, apartmentname, category, price, latLng); // 添加Marker并绑定数据 addMarker(apartment); }
3. 修改onInfoWindowClick方法,获取数据并传递到新Activity
现在点击InfoWindow时,就可以通过Marker的Tag拿到完整的Apartment数据,再把需要的字段放到Intent中传递:
@Override public void onInfoWindowClick(Marker marker) { // 从Tag中取出绑定的Apartment对象 Apartment apartment = (Apartment) marker.getTag(); if (apartment != null) { Intent intent = new Intent(getActivity(), InfoWindowActivity.class); // 将需要的数据放入Intent intent.putExtra(ID, apartment.getId()); intent.putExtra(VERIFICATION, apartment.getVerification()); intent.putExtra(TAG_APARTMENTNAME, apartment.getApartmentName()); intent.putExtra(TAG_CATEGORY, apartment.getCategory()); intent.putExtra(TAG_PRICE, apartment.getPrice()); intent.putExtra(LAT, apartment.getLatLng().latitude); intent.putExtra(LNG, apartment.getLatLng().longitude); startActivity(intent); } }
4. 在InfoWindowActivity中接收数据
在InfoWindowActivity的onCreate方法里,就可以取出这些传递过来的数据:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info_window); Intent intent = getIntent(); String id = intent.getStringExtra(FindApartment.ID); String verification = intent.getStringExtra(FindApartment.VERIFICATION); String apartmentName = intent.getStringExtra(FindApartment.TAG_APARTMENTNAME); // 其他字段同理获取... }
额外优化:直接传递Apartment对象
如果觉得一个个字段传递太繁琐,可以让Apartment类实现Serializable接口,这样就能直接把整个对象放到Intent里:
public class Apartment implements Serializable { // 之前的代码保持不变 }
然后修改onInfoWindowClick的代码:
@Override public void onInfoWindowClick(Marker marker) { Apartment apartment = (Apartment) marker.getTag(); if (apartment != null) { Intent intent = new Intent(getActivity(), InfoWindowActivity.class); intent.putExtra("APARTMENT_DATA", apartment); startActivity(intent); } }
最后在InfoWindowActivity中接收:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info_window); Apartment apartment = (Apartment) getIntent().getSerializableExtra("APARTMENT_DATA"); // 直接使用apartment对象的Getter方法获取数据即可 }
内容的提问来源于stack exchange,提问作者John Bea

