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

如何将MapsActivity中Marker的经纬度传递到自定义Dialog并展示在TextView中

问题解决方法

报错根因

你在MapsActivity中调用findViewById(R.id.txt_location)时,该方法只会在Activity当前加载的布局树中检索控件。而txt_location属于Dialog的专属布局custom_dialogbox.xml,挂载在Dialog独立的Window上,不在Activity的布局树范围内,因此获取到的控件对象为null,调用setText就会触发空指针异常。

解决步骤

方案1:复用现有参数(改动最小)

你现有的CustDialog.showDialog方法已经预留了字符串传参入口,直接把拼接好的经纬度内容传入即可:

  1. 修正Marker点击事件代码,删除无效的控件查找逻辑:
mMap.setOnMarkerClickListener((new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(@NonNull Marker marker) {
        LatLng latLng = marker.getPosition();
        // 拼接需要展示的位置文本
        String locationInfo = "New Marker Point\n纬度:" + latLng.latitude + "\n经度:" + latLng.longitude;
        // 注意类名要和你定义的CustDialog一致,你之前写的ViewDialog是笔误
        CustDialog alert = new CustDialog();
        alert.showDialog(MapsActivity.this, locationInfo);
        return false;
    }
}));
  1. 修正CustDialog中存在的语法错误:
    你原代码中确认按钮的点击事件有语法问题,修正后如下:
Button dialogBtn_okay = (Button) dialog.findViewById(R.id.btn_okay);
dialogBtn_okay.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(activity, "位置已确认", Toast.LENGTH_SHORT).show();
        dialog.cancel();
    }
});

方案2:重构参数(可维护性更高)

如果后续需要给Dialog传递更多位置相关数据,可以直接修改方法参数传入LatLng对象,在Dialog内部处理展示逻辑:

  1. 修改CustDialog的showDialog方法定义:
public class CustDialog {
    // 修改参数列表,直接接收LatLng对象
    public void showDialog(Activity activity, LatLng latLng){
        final Dialog dialog = new Dialog(activity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.custom_dialogbox);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

        TextView text = (TextView) dialog.findViewById(R.id.txt_location);
        // 内部拼接展示文本
        String showText = "New Marker Point\n纬度:" + latLng.latitude + "\n经度:" + latLng.longitude;
        text.setText(showText);

        // 按钮逻辑不变
        Button dialogBtn_cancel = (Button) dialog.findViewById(R.id.btn_cancel);
        dialogBtn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        Button dialogBtn_okay = (Button) dialog.findViewById(R.id.btn_okay);
        dialogBtn_okay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(activity, "位置已确认", Toast.LENGTH_SHORT).show();
                dialog.cancel();
            }
        });

        dialog.show();
    }
}
  1. 调用时直接传入获取到的LatLng即可:
mMap.setOnMarkerClickListener((new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(@NonNull Marker marker) {
        LatLng latLng = marker.getPosition();
        CustDialog alert = new CustDialog();
        alert.showDialog(MapsActivity.this, latLng);
        return false;
    }
}));

内容的提问来源于stack exchange,提问作者user14568805

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:06:05