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

如何将点击的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:17