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

Android 10 Google Maps控件自定义:如何通过编程移除点击Pushpin后显示的方向与地图图标

解决Android 10下Google Maps点击Marker后隐藏方向/地图图标的方案

我之前在做Android 10的Google Maps开发时,也碰到过这个默认按钮烦人的问题,折腾了好一阵才找到可行的方案,给你分享两个思路:

方法一:自定义InfoWindow(推荐)

默认的方向和地图图标是Google Maps自带InfoWindow的一部分,最稳妥的方式就是完全替换成自己定义的InfoWindow,这样就能100%控制显示内容。

步骤如下:

  1. 创建自定义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>
    
  2. 设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:27:46