You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Google Map中被点击标记的数据并传递至新Activity?

解决Google Map InfoWindow点击时获取对应标记完整数据的问题

我明白你现在的困境:你已经成功在地图上加载了公寓标记,但点击信息窗口跳转到新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:39