Neste tópico, descrevemos como adicionar um mapa básico a um app Android depois de configurar o projeto com o objetivo de usar o SDK do Maps para Android. Depois de adicionar um mapa, você pode alterar o tipo e os recursos dele.
Visão geral
O SDK do Maps para Android disponibiliza várias classes que seu app pode usar para gerenciar o ciclo de vida, a funcionalidade e os dados de um mapa. As classes são compatíveis com interações do usuário que têm como base o modelo da interface do Android, como a definição do estado inicial do mapa e a resposta a gestos do usuário no ambiente de execução.
A interface principal e as classes para trabalhar com mapas são as seguintes:
GoogleMap
: o ponto de entrada para gerenciar os recursos e dados subjacentes do mapa. Seu app só acessará um objetoGoogleMap
depois que ele for recuperado de umSupportMapFragment
ouMapView
.SupportMapFragment
: um fragmento para gerenciar o ciclo de vida de um objetoGoogleMap
.MapView
: uma visualização para gerenciar o ciclo de vida de um objetoGoogleMap
.OnMapReadyCallback
: uma interface de callback que processa eventos e interação do usuário para o objetoGoogleMap
.
Um objeto GoogleMap
executa automaticamente estas operações:
- Conexão com o serviço do Google Maps
- Download de blocos de mapas
- Exibição de blocos na tela do dispositivo
- Exibição de vários controles, como movimento e zoom
- Resposta aos gestos de movimento e de zoom, deslocando o mapa e aumentando ou diminuindo o zoom
Para usar um objeto GoogleMap
no seu app, utilize um SupportMapFragment
ou MapView
como um contêiner para o mapa e, depois, traga o GoogleMap
do contêiner. Como as classes de contêiner derivam de um fragmento ou de uma visualização do Android, elas fornecem ao mapa os recursos de gerenciamento do ciclo de vida e UI das classes de base do Android.
A classe SupportMapFragment
é o contêiner mais moderno e comum de um objeto GoogleMap
.
Ver o código
O código a seguir é da atividade Java completa usada neste tópico ao adicionar um fragmento de forma estática. O projeto Android foi criado com base no modelo vazio e atualizado de acordo com o guia de configuração do projeto. Depois que você executar as etapas deste tópico, o código poderá ficar diferente dependendo do modelo do projeto.
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")); } }
Adicionar um mapa
Esta seção explica como adicionar um mapa básico usando um fragmento como contêiner. No entanto, se quiser, você poderá usar uma visualização. Para conferir um exemplo, consulte RawMapViewDemoActivity no GitHub.
Etapas básicas:
Para baixar o SDK, conseguir uma chave de API e adicionar os frameworks necessários, siga as etapas em:
Adicione um objeto
SupportMapFragment
à atividade que vai trabalhar com o mapa. Você pode adicionar o fragmento de forma estática ou dinâmica.Implemente a interface
OnMapReadyCallback
.Defina o arquivo de layout como a visualização de conteúdo.
Se você adicionou o fragmento estaticamente, gere um handle para ele.
Registre o callback.
Gere um handle para o objeto
GoogleMap
.
Adicionar um objeto SupportMapFragment
Você pode adicionar um objeto SupportMapFragment
ao seu app de forma estática ou dinâmica.
A maneira mais simples é adicioná-lo estaticamente. Se você adicionar o fragmento dinamicamente, será possível executar outras ações nele, como a remoção e a substituição dele no ambiente de execução.
Adicionar um fragmento de forma estática
No arquivo de layout da atividade que processará o mapa:
- adicione um elemento
fragment
; - adicione a declaração de nome
xmlns:map="http://schemas.android.com/apk/res-auto"
. Isso permite o uso de atributosmaps
XML personalizados; - defina o atributo
android:name
comocom.google.android.gms.maps.SupportMapFragment
no elementofragment
; - adicione o atributo
android:id
no elementofragment
e defina-o como o ID do recurso do R.id.map (@+id/map
).
Por exemplo, aqui está um arquivo completo de layout que inclui um elemento 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"/>
Adicionar um fragmento de forma dinâmica
Na atividade, faça o seguinte:
- Crie uma instância
SupportMapFragment
. - Faça commit em uma transação que adicione o fragmento à atividade. Para mais informações, consulte Transações de fragmento.
Por exemplo:
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();
Implementar a interface OnMapReadyCallback
Atualize a declaração da atividade da seguinte forma:
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback { // ... }
Java
class MainActivity extends AppCompatActivity implements OnMapReadyCallback { // ... }
Definir a visualização de conteúdo
No método onCreate
da sua atividade, chame o método setContentView
e defina o arquivo de layout como a visualização de conteúdo.
Por exemplo, se o nome do arquivo de layout for 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); }
Gerar um handle para o fragmento e registrar o callback
Para gerar um handle para o fragmento, chame o método
FragmentManager.findFragmentById
e transmita a ele o ID do recurso do fragmento no seu arquivo de layout. Se você adicionou o fragmento dinamicamente, pule esta etapa porque o handle já foi recuperado.Chame o método
getMapAsync
para definir o callback no fragmento.
Por exemplo, se você adicionou o fragmento estaticamente:
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);
Gerar um handle para o objeto GoogleMap
Use o método de callback onMapReady
se quiser um handle para o objeto GoogleMap
. O callback será acionado quando o mapa estiver pronto para receber a entrada do usuário. Ele fornece uma instância não nula da classe GoogleMap
que pode ser usada para atualizar o mapa.
Neste exemplo, o callback onMapReady
recupera um handle para o objeto GoogleMap
e, em seguida, um marcador é adicionado ao mapa:
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")); }
Quando você criar e executar o app, ele exibirá um mapa com um marcador na Ilha Nula (zero graus de latitude e longitude).
Veja o código da atividade completa:
Próxima etapa
Depois de concluir essas etapas, você poderá definir as configurações do mapa.