一切就绪!

着手开发前,请先阅读我们的开发者文档

激活 Google Maps Android API

为帮助您起步,我们将引导您在 Google Developers Console 中先完成几项任务:

  1. 创建或选择项目
  2. 激活 Google Maps Android API
  3. 创建相应密钥
继续

信息窗口

信息窗口在地图上方的弹出窗口中显示文本或图像。 信息窗口始终固定在标记上。 其默认行为是在用户点按标记时显示。

代码示例

GitHub 上的 ApiDemos 存储区包含一个示例,展示所有信息窗口功能:

简介

您可以在用户点按标记时,通过信息窗口向其显示信息。 一次只能显示一个信息窗口。 如果用户点击一个标记,系统将关闭当前信息窗口,并显示新的信息窗口。

请注意,如果用户点击一个目前正显示信息窗口的标记,则该信息窗口将关闭并重新打开。

信息窗口绘制时朝向设备屏幕的相反方向,在其关联标记的上方居中显示。 默认信息窗口包含粗体标题,以及标题下方的(可选)文本片段。

添加信息窗口

添加信息窗口最简单的方法是设置相应标记的 title() 方法和 snippet() 方法。 设置这些属性后,每当用户点击标记,就会出现信息窗口。

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne")
                          .snippet("Population: 4,137,400"));

显示/隐藏信息窗口

信息窗口设计为对用户触摸事件作出响应。 如果您愿意,可以通过对目标标记调用 showInfoWindow() 以编程方式显示信息窗口。

可通过调用 hideInfoWindow() 隐藏信息窗口。

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne"));
melbourne.showInfoWindow();

自定义信息窗口

您还可以定制信息窗口的内容和设计。 为实现此目的,您必须创建 InfoWindowAdapter 接口的具体实现,然后通过您的实现调用 GoogleMap.setInfoWindowAdapter()

该接口包含两个供您实现的方法: getInfoWindow(Marker) 方法和 getInfoContents(Marker) 方法。 API 将先调用 getInfoWindow(Marker),如果返回 null,将随后调用 getInfoContents(Marker)

如果仍返回 null,则使用默认信息窗口。

其中的第一个 (getInfoWindow()) 允许您提供将用于整个信息窗口的视图。 其中的第二个 (getInfoContents()) 允许您只定制窗口的内容,但仍保留默认信息窗口框架和背景。

注:绘制的信息窗口“绝非”实时视图。 该视图在返回时渲染为图像(使用 View.draw(Canvas))。

这意味着,信息窗口不会将任何后续视图更改体现在地图上。 如需在稍后更新信息窗口(例如,在加载图像后),请调用 showInfoWindow()。 此外,信息窗口将不会遵守任何典型的普通视图交互性,如触摸事件或手势事件。

不过,您可以按下文所述侦听整个信息窗口上的通用点击事件。

以下图像显示的是一个默认信息窗口、一个包含定制内容的信息窗口以及一个包含定制框架和背景的信息窗口。

信息窗口比较

信息窗口事件

MarkerDemoActivity 示例包含用于注册和处理信息窗口事件的示例代码。

您可以利用 OnInfoWindowClickListener 来侦听信息窗口上的点击事件。 如需在地图上设置该侦听器,请调用 GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener)。 当用户点击信息窗口时,系统将调用 onInfoWindowClick(Marker) 并以默认突出显示颜色(灰色)突出显示信息窗口。

public class MarkerDemoActivity extends AppCompatActivity implements
        OnInfoWindowClickListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        // Add markers to the map and do other map setup.
        ...
        // Set a listener for info window events.
        mMap.setOnInfoWindowClickListener(this);
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
        Toast.makeText(this, "Info window clicked",
                Toast.LENGTH_SHORT).show();
    }
}

同样,您可以通过 OnInfoWindowLongClickListener 侦听长点击事件,后者可通过调用 GoogleMap.setOnInfoWindowLongClickListener(OnInfoWindowLongClickListener) 进行设置。

该侦听器的行为与点击侦听器类似,通过 onInfoWindowLongClick(Marker) 回调接收有关长点击事件的通知。

要在信息窗口关闭时收到通知,请使用 OnInfoWindowCloseListener(您可通过调用 GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener) 设置它)。

您将收到一个 onInfoWindowClose(Marker) 回调。

刷新信息窗口相关注意事项: onInfoWindowClose() 事件在用户通过点按某个具有打开的信息窗口的标记刷新信息窗口时触发。

但是,如果您针对打开的信息窗口以编程方式调用 Marker.showInfoWindow(),则 onInfoWindowClose() 事件不会触发。 此后续行为基于的假定是您知道信息窗口将关闭并且会重新打开。

正如上文对信息窗口的介绍,信息窗口并非实时 View, 而是以图像形式渲染在地图上的视图。 因此,您在该视图上设置的任何侦听器都会被忽略,并且您也无法区分针对该视图不同部分的点击事件。

建议您不要在自定义信息窗口内放置按钮、复选框或文本输入等交互组件。

发送以下问题的反馈:

此网页
Google Maps Android API
Google Maps Android API
需要帮助?请访问我们的支持页面