本主题介绍了在将项目配置为使用 Maps SDK for Android 后,如何向 Android 应用添加基本地图。添加地图后,您可以更改地图类型和地图项。
概览
Maps SDK for Android 提供多个类,可供应用管理地图的生命周期、功能和数据。这些类支持基于 Android 界面模型的用户互动,例如设置地图的初始状态以及在运行时响应用户的手势输入。
用于处理地图的主接口和类如下:
GoogleMap- 用于管理底层地图项和地图数据的入口点。只有当系统已从SupportMapFragment或MapView对象中检索到GoogleMap对象后,您的应用才可以访问该对象。SupportMapFragment- 用于管理GoogleMap对象生命周期的 fragment。OnMapReadyCallback- 用于处理GoogleMap对象的事件和用户互动的回调接口。
- 连接到 Google 地图服务。
- 下载地图图块。
- 在设备屏幕上显示图块。
- 显示各种控件,例如平移和缩放控件。
- 通过移动和缩放地图响应平移和缩放手势。
若要在应用中使用 GoogleMap 对象,您必须先将 SupportMapFragment 或 MapView 对象用作地图的容器对象,然后再从该容器中检索 GoogleMap 对象。容器类派生自 Android fragment 或视图,因此可为地图提供 Android 基类的生命周期管理和界面功能。SupportMapFragment 类是适用于 GoogleMap 对象的更为现代和常用的容器。
查看代码
下列代码来自于本主题中以静态方式添加 fragment 时所使用的完整 Java activity。相应 Android 项目是使用空项目模板创建,然后按照项目配置指南进行更新的。执行完本主题中的步骤后,您的代码可能会因项目模板的不同而有所不同。
package com.example.mapsetup;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
// Implement OnMapReadyCallback.
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the layout file as the content view.
setContentView(R.layout.activity_main);
// Get a handle to the fragment and register the callback.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
// Get a handle to the GoogleMap object and display marker.
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
}
添加地图
本部分介绍了如何通过将 fragment 用作地图容器来添加基本地图;不过,您也可以使用视图作为地图容器来执行此操作。如需查看示例,请参阅 GitHub 上的 RawMapViewDemoActivity。
基本步骤:
如需获取 SDK 和 API 密钥并添加所需的框架,请按以下文档中的步骤操作:
向用于处理地图的 activity 添加
SupportMapFragment对象。您可以静态或动态方式添加该 fragment。实现
OnMapReadyCallback接口。将布局文件设置为内容视图。
如果您是以静态方式添加上述 fragment 的,请先获取该 fragment 的句柄。
注册回调函数。
获取
GoogleMap对象的句柄。
添加 SupportMapFragment 对象
您可以静态或动态方式向应用添加 SupportMapFragment 对象。最简单的方式是以静态方式添加。如果以动态方式添加,则还可以对该 fragment 执行其他操作,例如在运行时移除和替换该 fragment。
以静态方式添加 fragment
在用于处理地图的 activity 的布局文件中,执行以下操作:
- 添加
fragment元素。 - 添加名称声明
xmlns:map="http://schemas.android.com/apk/res-auto"。完成此操作后即可使用maps自定义 XML 属性。 - 在
fragment元素中,将android:name属性设置为com.google.android.gms.maps.SupportMapFragment。 - 在
fragment元素中,添加android:id属性并将其设置为 R.id.map 资源 ID (@+id/map)。
例如,以下是一个包含 fragment 元素的完整布局文件:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
以动态方式添加 fragment
在相应 activity 中:
- 创建
SupportMapFragment实例。 - 提交向 activity 添加该 fragment 的事务。如需了解详情,请参阅 fragment 事务。
例如:
Kotlin
val mapFragment = SupportMapFragment.newInstance()
supportFragmentManager
.beginTransaction()
.add(R.id.my_container, mapFragment)
.commit()
Java
SupportMapFragment mapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager()
.beginTransaction()
.add(R.id.my_container, mapFragment)
.commit();
实现 OnMapReadyCallback 接口
按如下所示更新 activity 声明:
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
// ...
}
Java
class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
// ...
}
设置内容视图
在您的 activity 的 onCreate 方法中,调用 setContentView 方法,并将布局文件设置为内容视图。
例如(假如布局文件名为 main.xml):
Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
Java
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
获取 fragment 的句柄并注册回调函数
若要获取相应 fragment 的句柄,请调用
FragmentManager.findFragmentById方法,并向其传递布局文件中的 fragment 的资源 ID。如果是以动态方式添加该 fragment 的,请跳过此步骤,因为您已经检索了句柄。调用
getMapAsync方法,在 fragment 上设置回调。
例如(假如是以静态方式添加 fragment 的):
Kotlin
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
Java
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
获取 GoogleMap 对象的句柄
使用 onMapReady 回调方法获取 GoogleMap 对象的句柄。该回调将在地图准备好接收用户输入时触发。它会提供 GoogleMap 类的非空实例,可用来更新地图。
在以下示例中,onMapReady 回调会检索 GoogleMap 对象的句柄,然后系统会向地图添加标记:
Kotlin
override fun onMapReady(googleMap: GoogleMap) {
googleMap.addMarker(
MarkerOptions()
.position(LatLng(0.0, 0.0))
.title("Marker")
)
}
Java
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}

成功构建并运行应用后,应用会显示一个地图,并使用一个标记指示空虚岛(经度 0 度,纬度 0 度)。
查看完整 activity 的代码:
后续操作
完成上述步骤后,就可以配置地图设置了。