Android 10 Google Maps控件自定义:如何通过编程移除点击Pushpin后显示的方向与地图图标
解决Android 10下Google Maps点击Marker后隐藏方向/地图图标的方案
我之前在做Android 10的Google Maps开发时,也碰到过这个默认按钮烦人的问题,折腾了好一阵才找到可行的方案,给你分享两个思路:
方法一:自定义InfoWindow(推荐)
默认的方向和地图图标是Google Maps自带InfoWindow的一部分,最稳妥的方式就是完全替换成自己定义的InfoWindow,这样就能100%控制显示内容。
步骤如下:
创建自定义InfoWindow布局
新建一个XML布局文件(比如custom_info_window.xml),只保留你需要的内容,比如Marker的标题、描述:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp" android:background="#FFFFFF"> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:textStyle="bold"/> <TextView android:id="@+id/tv_snippet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:layout_marginTop="4dp"/> </LinearLayout>设置InfoWindowAdapter
在你的Map初始化代码里,给GoogleMap绑定自定义的InfoWindowAdapter,重写getInfoWindow方法返回我们的布局:Kotlin代码示例:
googleMap.setInfoWindowAdapter(object : GoogleMap.InfoWindowAdapter { override fun getInfoWindow(marker: Marker): View? { // 加载自定义布局 val view = LayoutInflater.from(context).inflate(R.layout.custom_info_window, null) // 绑定Marker数据 view.findViewById<TextView>(R.id.tv_title).text = marker.title view.findViewById<TextView>(R.id.tv_snippet).text = marker.snippet // 返回自定义View,默认按钮会被完全替换 return view } override fun getInfoContents(marker: Marker): View? { // 这里返回null即可,因为我们用getInfoWindow替换了整个窗口 return null } })Java代码示例:
googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { View view = LayoutInflater.from(context).inflate(R.layout.custom_info_window, null); TextView tvTitle = view.findViewById(R.id.tv_title); TextView tvSnippet = view.findViewById(R.id.tv_snippet); tvTitle.setText(marker.getTitle()); tvSnippet.setText(marker.getSnippet()); return view; } @Override public View getInfoContents(Marker marker) { return null; } });这样点击Marker后,只会显示你自定义的内容,默认的方向和地图图标就彻底消失了。
方法二:反射隐藏默认按钮(不推荐,有兼容性风险)
如果你不想自定义整个InfoWindow,只想隐藏默认按钮,可以试试通过反射找到默认InfoWindow里的按钮View,再设置为隐藏。不过这个方法依赖Google Maps的内部实现,不同版本可能失效,Android 10下当时可行,但后续SDK更新可能会失效,谨慎使用。
Kotlin代码示例:
googleMap.setOnMarkerClickListener { marker -> marker.showInfoWindow() // 延迟一点获取View,因为showInfoWindow后需要时间渲染 Handler(Looper.getMainLooper()).postDelayed({ try { val infoWindow = marker.javaClass.getDeclaredField("mInfoWindow").apply { isAccessible = true }.get(marker) val view = infoWindow.javaClass.getDeclaredField("mView").apply { isAccessible = true }.get(infoWindow) as View // 找到内部标记为"directions"和"map"的按钮 val directionsBtn = view.findViewWithTag<View>("directions") val mapBtn = view.findViewWithTag<View>("map") directionsBtn?.visibility = View.GONE mapBtn?.visibility = View.GONE } catch (e: Exception) { // 反射失败时打日志,避免崩溃 e.printStackTrace() } }, 100) true }
总结
优先选方法一自定义InfoWindow,不仅能解决问题,还能让Marker弹窗和APP风格统一,兼容性也更好。方法二只适合临时救急,不建议在正式项目中使用。
内容的提问来源于stack exchange,提问作者StezPet
相关产品推荐
相关产品推荐

