É o 15º aniversário da Plataforma Google Maps: confira as notícias e avisos mais recentes

Janelas de informações

Uma janela de informações exibe textos ou imagens em uma janela pop-up acima do mapa. Essas janelas estão sempre fixadas a um marcador. O comportamento padrão delas é exibir detalhes quando alguém toca no marcador.

Amostras de código

O repositório ApiDemos no GitHub inclui um exemplo que demonstra todos os elementos da janela de informações:

Introdução

Com uma janela de informações, você pode exibir detalhes para o usuário quando ele toca em um marcador. Apenas uma janela é exibida de cada vez. Se um usuário clicar em um marcador, a janela atual será fechada, e a nova aparecerá. Se o usuário clicar em um marcador que está exibindo uma janela de informações, ela será fechada e reaberta.

Essas janelas aparecem na tela do dispositivo e ficam centralizadas acima do marcador associado. A janela padrão contém o título em negrito, com o snippet de texto (opcional) abaixo do título.

Adicionar uma janela de informações

A maneira mais simples de incluir uma janela desse tipo é definir os métodos title() e snippet() do marcador correspondente. Isso faz com que uma janela de informações apareça sempre que alguém clica no marcador.

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"));

Mostrar/ocultar uma janela de informações

As janelas de informações aparecem quando os usuários clicam nelas. Se preferir, você pode mostrar uma janela desse tipo de maneira programática. Basta chamar showInfoWindow() no marcador desejado. Para omitir uma janela de informações, chame hideInfoWindow().

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

Você também pode criar janelas de informações para marcadores em cluster individuais. Leia o guia para saber como fazer isso.

Personalizar janelas de informações

Você também pode personalizar o conteúdo e o design dessas janelas. Para isso, crie uma implementação concreta da interface InfoWindowAdapter e, em seguida, chame GoogleMap.setInfoWindowAdapter() com sua implementação. A interface contém dois métodos disponíveis: getInfoWindow(Marker) e getInfoContents(Marker). Primeiro, a API chamará getInfoWindow(Marker) e depois invocará getInfoContents(Marker) se null for retornado. A janela de informações padrão será usada caso um null também seja retornado.

Com o primeiro método (getInfoWindow()), você pode mostrar uma visualização que será utilizada em toda a janela. Já no segundo (getInfoContents()), é possível personalizar o conteúdo da janela sem alterar o padrão de frame e segundo plano dela.

As imagens abaixo mostram uma janela de informações padrão, outra com conteúdo personalizado e uma com frame e segundo plano personalizados.

Comparação de janelas de informações

Eventos da janela de informações

O exemplo de MarkerDemoActivity inclui uma amostra de código para registrar e lidar com eventos da janela de informações.

Você pode usar um OnInfoWindowClickListener para detectar os eventos de clique em uma janela. Se quiser definir esse listener no mapa, chame GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener). Quando o usuário clica em uma janela de informações, onInfoWindowClick(Marker) é chamado, e essa janela é destacada na cor padrão (cinza).

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();
    }
}

Da mesma forma, é possível detectar eventos longos de clique com um OnInfoWindowLongClickListener, que é definido chamando GoogleMap.setOnInfoWindowLongClickListener(OnInfoWindowLongClickListener). Ele é semelhante ao listener de clique e é notificado sobre esses eventos com um callback onInfoWindowLongClick(Marker).

Para receber uma notificação quando a janela for fechada, use um OnInfoWindowCloseListener, que é definido chamando GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener). Você receberá um callback onInfoWindowClose(Marker).

Observação sobre a atualização de uma janela de informações: o evento onInfoWindowClose() é disparado quando o usuário atualiza uma janela tocando em um marcador que já tem uma janela aberta. No entanto, se você chamar Marker.showInfoWindow() programaticamente em uma janela aberta, o evento onInfoWindowClose() não será acionado. No último comportamento, supõe-se que você saiba que a janela será fechada e reaberta.

Como mencionado na seção anterior, uma janela de informações não é uma visualização ao vivo. É renderizada como uma imagem no mapa. Consequentemente, qualquer listener que você tenha definido é desconsiderado, e você não consegue distinguir entre os eventos de clique em várias partes da visualização. Recomendamos que você não insira componentes interativos, como botões, caixas de seleção ou entradas de texto, na sua janela de informações personalizada.