如何将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方法已经预留了字符串传参入口,直接把拼接好的经纬度内容传入即可:
- 修正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; } }));
- 修正
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内部处理展示逻辑:
- 修改
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(); } }
- 调用时直接传入获取到的
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
相关产品推荐
相关产品推荐

